当前位置: 首页 > 面试题库 >

为什么我的Hello World go服务器被ApacheBench压碎了?

向实
2023-03-14
问题内容
package main

import (
    "io"
    "net/http"
)

func hello(w http.ResponseWriter, r *http.Request) {
    io.WriteString(w, "Hello world!\n")
}

func main() {
    http.HandleFunc("/", hello)
    http.ListenAndServe(":8000", nil)
}

我有几个令人难以置信的基本HTTP服务器,而且所有这些服务器都存在此问题。

$ ab -c 1000 -n 10000 http://127.0.0.1:8000/
This is ApacheBench, Version 2.3 <$Revision: 1604373 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 127.0.0.1 (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
apr_socket_recv: Connection refused (61)
Total of 5112 requests completed

并发值较小时,事情仍然会失败。对我来说,这个问题似乎通常出现在5k-6k大关附近:

$ ab -c 10 -n 10000 http://127.0.0.1:8000/
This is ApacheBench, Version 2.3 <$Revision: 1604373 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 127.0.0.1 (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
apr_socket_recv: Operation timed out (60)
Total of 6277 requests completed

实际上,您可以完全放弃并发性,问题仍然存在(有时):

$ ab -c 1 -n 10000 http://127.0.0.1:8000/
This is ApacheBench, Version 2.3 <$Revision: 1604373 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 127.0.0.1 (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
apr_socket_recv: Operation timed out (60)
Total of 6278 requests completed

我忍不住想知道是否在某处达到某种操作系统限制?我怎么知道 我该如何缓解?


问题答案:

简而言之,您的端口已用完。

osx上的默认临时端口范围是49152-65535,只有16,383个端口。由于每个ab请求都是http/1.0(在第一个示例中没有keepalive),所以每个新请求都占用另一个端口。

使用每个端口时,它将放入队列中,等待tcp“ Maximum Segment
Lifetime”(在osx上配置为15秒)。因此,如果您在15秒钟内使用了16,383个以上的端口,则您的操作系统实际上将受到进一步连接的限制。根据哪个进程首先用尽端口,您将从服务器获得连接错误,或者从挂起ab

您可以使用http/1.1功能强大的负载生成器(例如wrk)或对的keepalive(-k)选项来减轻这种情况ab,以便根据工具的并发设置重用连接。

现在,您要进行基准测试的服务器代码执行得很少,以至于负载生成器的负担与服务器本身一样多,本地操作系统和网络堆栈可能会起到很大的作用。如果要对http服务器进行基准测试,最好从不在同一台计算机上运行的多个客户端进行一些有意义的工作。



 类似资料:
  • 环境: Python 3.7.5 烧瓶1.1.2 托管公司:Ionos 类型:带有Plesk面板的ubuntu上的VPS。 Ubuntu 18.04.5 LTS,代号:仿生 我有一个网站域名。通用域名格式。例如,我需要子域“dashboard.domain.com”上的仪表板。我的服务器是一个虚拟服务器,使用“虚拟主机”和apache作为我在这个VPS上的所有域名。我正试图在带有子域的ubuntu

  • 本文向大家介绍为什么我们需要微服务容器?相关面试题,主要包含被问及为什么我们需要微服务容器?时的应答技巧和注意事项,需要的朋友参考一下 要管理基于微服务的应用程序,容器是最简单的选择。它帮助用户单独部署和开发。您还可以使用Docker将微服务封装到容器的镜像中。没有任何额外的依赖或工作,微服务可以使用这些元素。

  • 为何使用虚拟服务器? 虚拟服务器是自奶粉以来最好的东西! 你可能会问我们为什么要发表这样的声明。 原因是它们引入了灵活性。 使用虚拟服务器,您可以创建一个定制的策略并将其包装在一个功能单元中。 虚拟RADIUS服务器在概念和功能上与真实虚拟服务器(如使用VMware或VirtualBox进行虚拟化的服务器)非常不同。 RADIUS中的虚拟服务器可以实现简单而强大的配置,因为它们可以实现策略的清晰分

  • 问题内容: 我有服务器和客户端。我的服务器接受所有连接并返回到客户端字符串。但是当我尝试发送更多行时,它崩溃了 这是我的服务器代码: 这是我的客户代码: 问题答案: 来自in中的javadoc: 关闭返回将关闭关联的套接字。 另外,关闭(和所有其他打印机/写入器)也将关闭其基础流。因此,您可以通过关闭(in ),然后尝试写入已关闭的套接字来关闭您的套接字。 要解决此问题,请不要关闭。垃圾收集将为您

  • 我正在尝试为我的Android应用程序创建一个推送服务,我遵循Google GCM的文档和示例: 我可以注册/注销我的Android应用程序。从我的服务器端,我可以看到我注册了一个订阅,但当我尝试从服务器向我的Android应用程序发送消息时,我总是收到以下错误: 发送消息到设备#0时出错:MismatchSenderId 对于我的Android应用程序,我使用SENDER_ID=20000000

  • 目标图片:https://img.alicdn.com/imgextra/O1CN01MW6Bpi1KJXbwTYrw5_!!2216508591143.jpg 发现这个图片可以直接在浏览器打开,在我的 mac 上也可以使用 wget 直接下载 但是因为我的服务是部署在 aliyun 的 ack,但是我发现在 aliyun ack 访问这个图片居然就是 420 ! 写了下面的测试代码 上面的代码,