http - ApacheBench 仅使用“-race”标志从 Go 服务器获取“对等连接重置”
问题描述
我有一个最小的 Go HTTP 服务器(下面的代码)。当我启动服务器go run server.go
然后使用触发 5000 个并发请求时
ab -c 5000 -n 5000 http://localhost:8080/
一切都按预期工作。但是,如果我使用竞赛检测器标志启动我的服务器:
go run -race server.go
然后即使只有 1000 个并发请求,我也会遇到运行 ApacheBench 的问题:
apr_socket_recv: Connection reset by peer (54)
有趣的是,我的 Go 服务器不会崩溃或打印任何错误消息,并且能够继续接收新请求。这表明问题不在于 Go 进程由于“-race”负担而耗尽内存。
额外细节:
- 我在 Mac 上运行 Go 1.10
ab -V
告诉我我正在使用 2.3 版的 ab(Macbook 的默认发货,看起来 ab 已经从 brew 中删除了)。- 如果我使用标志运行 ab
-r
使其不会立即退出,我会得到输出: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 -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
解决方案
推荐阅读
- python - DataFrame 是否可以在同一个数据帧中抓取/查找密钥?
- html - 如何更改unicode字体颜色
- reactjs - React 样式组件的设置
- testing - 测试实现为 Map 的状态机转换
- c# - 根据条件从 DataTable 中选择行
- android - 为什么当我锁定手机时位置服务停止发送位置更新
- node.js - 打字稿 | 无法安装类型脚本
- javascript - 将 mongoDB 文档数据存储为变量
- ruby - 为什么 'USER INSTALLATION DIRECTORY' 与 Ruby 版本不匹配?
- r - 使用colMeans合并R中的数据框行?