我有一个最小的Go HTTP服务器(下面的代码)。当我使用go run server.go
启动服务器,然后使用
ab -c 5000 -n 5000 http://localhost:8080/
一切都按预期工作。但是,如果我使用竞争检测器标志启动我的服务器:
go run -race server.go
然后我遇到运行ApacheBench的问题,即使只有1000个并发请求:
apr_socket_recv: Connection reset by peer (54)
有趣的是,我的Go服务器不会崩溃或打印任何错误消息,并且能够继续接收新请求。这表明问题不是Go进程内存不足,因为" -race"负担。
其他详情:
ab -V
告诉我,我使用的是版本2.3的ab(使用Macbook默认发货,看起来ab已经从brew中删除)。 -r
标记运行ab,以便它不会立即退出,我会得到输出:Test aborted after 10 failures
。所以看起来我的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