Http ApacheBench得到“一个”;“对等端重置连接”;仅从Go服务器发送,带有-种族“;旗帜
我有一个最小的GoHTTP服务器(代码如下)。当我用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服
启动服务器时,运行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的2.3版(默认随Macbook提供,看起来ab已从brew中删除)李>ab-V
- 如果我使用
标志运行ab,使其不会立即退出,我会得到输出:-r
测试在10次失败后中止。看来我的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”的请求时,我没有收到任何服务器端错误。