首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么我的Hello World go服务器被ApacheBench崩溃了?

为什么我的Hello World go服务器被ApacheBench崩溃了?
EN

Stack Overflow用户
提问于 2015-05-20 22:32:06
回答 1查看 4.4K关注 0票数 25
代码语言:javascript
复制
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服务器,所有的服务器都有这个问题。

代码语言:javascript
复制
$ 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左右:

代码语言:javascript
复制
$ 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

事实上,你可以完全放弃并发,但问题(有时)仍然会发生:

代码语言:javascript
复制
$ 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

我不禁在想,我是不是遇到了某种操作系统的限制?我怎么知道呢?我该如何减轻压力呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-21 02:39:48

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

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

当每个端口被使用时,它被放入一个队列中,等待tcp“最大段生存期”,该值在osx上被配置为15秒。因此,如果您在15秒内使用了超过16,383个端口,那么在进一步连接时,您将有效地受到操作系统的限制。根据哪个进程最先耗尽端口,您将从服务器获得连接错误,或者从ab获得挂起。

您可以通过使用支持http/1.1的负载生成器(如wrk )或使用ab的keepalive (-k)选项来缓解此问题,以便根据工具的并发设置重用连接。

现在,您正在进行基准测试的服务器代码做得如此之少,以至于负载生成器的负担与服务器本身一样多,而本地操作系统和网络堆栈可能做出了很好的贡献。如果您想对http服务器进行基准测试,最好从不在同一台机器上运行的多个客户端执行一些有意义的工作。

票数 44
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30352725

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档