我使用Go net/http
设置了一个非常简单的基本http服务器,如下所示:
package main
import (
"net/http"
"fmt"
)
func defaultHttpPing(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "Pong")
}
func main() {
http.HandleFunc("/ping", defaultHttpPing)
http.ListenAndServe(":8080", nil)
}
我相信这是我可以写的最小的Go http服务器,它不应该有任何应用程序错误。不幸的是,当我使用ab
在此服务器上进行压力测试时:
ab -n 100000 -c 100 http://localhost:8080/ping
此输出失败:
Benchmarking localhost (be patient)
Completed 10000 requests
apr_pollset_poll: The timeout specified has expired (70007)
Total of 16482 requests completed
我很惊讶,因为我以前的ab
测试具有相同并发级别的请求数量较少,例如-n 10000 -c 100
成功。我还尝试了更多-n 100000 -c 100
次测试,并且始终以16K
次成功请求失败。
我的服务器出了什么问题?我也认为Go net/http
有一些奇怪的问题。也许,这只是一种处理内存泄漏的感觉。
其他环境信息:
操作系统:Mac OS,El Capitan 限制:
-t: cpu time (seconds) unlimited
-f: file size (blocks) unlimited
-d: data seg size (kbytes) unlimited
-s: stack size (kbytes) 8192
-c: core file size (blocks) 0
-v: address space (kbytes) unlimited
-l: locked-in-memory size (kbytes) unlimited
-u: processes 709
-n: file descriptors 524288