Http ApacheBench得到“一个”;“对等端重置连接”;仅从Go服务器发送,带有-种族“;旗帜

Http ApacheBench得到“一个”;“对等端重置连接”;仅从Go服务器发送,带有-种族“;旗帜,http,go,apachebench,Http,Go,Apachebench,我有一个最小的GoHTTP服务器(代码如下)。当我用启动服务器时,运行server.go,然后使用 ab -c 5000 -n 5000 http://localhost:8080/ 一切正常。但是,如果我使用race detector标志启动服务器: go run -race server.go 然后,即使只有1000个并发请求,运行ApacheBench也会遇到一个问题: apr_socket_recv: Connection reset by peer (54) 有趣的是,我的Go服

我有一个最小的GoHTTP服务器(代码如下)。当我用
启动服务器时,运行server.go
,然后使用

ab -c 5000 -n 5000 http://localhost:8080/
一切正常。但是,如果我使用race detector标志启动服务器:

go run -race server.go
然后,即使只有1000个并发请求,运行ApacheBench也会遇到一个问题:

apr_socket_recv: Connection reset by peer (54)
有趣的是,我的Go服务器不会崩溃或打印任何错误消息,并且能够继续接收新的请求。这表明问题不在于Go进程由于“种族”负担而耗尽内存

其他详情:

  • 我在Mac电脑上运行Go 1.10
  • ab-V
    告诉我我使用的是ab的2.3版(默认随Macbook提供,看起来ab已从brew中删除)
  • 如果我使用
    -r
    标志运行ab,使其不会立即退出,我会得到输出:
    测试在10次失败后中止。看来我的Go服务器一定是在丢弃连接,而不是让它们排队
Go服务器代码:

package main

import (
    "log"
    "net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
    log.Printf("got one\n")
}

func main() {
    http.HandleFunc("/", handler)
    log.Fatal(http.ListenAndServe(":8080", nil))
}
ulimit设置:

$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
file size               (blocks, -f) unlimited
max locked memory       (kbytes, -l) unlimited
max memory size         (kbytes, -m) unlimited
open files                      (-n) 4864
pipe size            (512 bytes, -p) 1
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 709
virtual memory          (kbytes, -v) unlimited

您的系统ulimit设置为什么
ulimit-a
来自终端。嘿,把这些添加到问题的底部。你甚至不能一次打开5000个端口,发出5000个完全并发的请求有什么意义?
-race
标志会减慢速度,并限制可能运行的goroutine的数量,在这个测试中有些东西会失败。嗯,我不明白为什么这会是一个开放文件问题。我在进行1000次调用时遇到ApacheBench错误,该错误安全地低于4864阈值(除非-race出于某种原因打开了一堆额外的文件?)此外,打开文件错误会显示在服务器端:
accept tcp[:]:8080:accept:系统中打开的文件太多
,但直到我得到~10000个并发请求时才会出现。正如我提到的,当发送1000个带有“-race”的请求时,我没有收到任何服务器端错误。