我有一个非常消耗 CPU 的玩具网络应用程序
func PerfServiceHandler(w http.ResponseWriter, req *http.Request)
{
start := time.Now()
w.Header().Set("Content-Type", "application/json")
x := 0
for i := 0; i < 200000000; i++ {
x = x + 1
x = x - 1
}
elapsed := time.Since(start)
w.Write([]byte(fmt.Sprintf("Time Elapsed %s", elapsed)))
}
func main()
{
http.HandleFunc("/perf", PerfServiceHandler)
http.ListenAndServe(":3000", nil)
}
执行上述函数大约需要 120 毫秒。但是当我用 500 个并发用户(siege -t30s -i -v -c500 http://localhost:3000/perf)对这个应用程序进行负载测试时,我得到了结果
每个请求的平均响应时间 2.51 秒
交易速率每秒 160.57 笔交易
有人可以在下面回答我的问题吗:-
当我运行 100、200、500 个并发用户时,我看到没有。当应用程序刚启动时,上述应用程序使用的操作系统线程数从 7 卡到了 35。增加并发连接数不会改变这个数字。即使当 500 个并发请求到达服务器时,操作系统线程的数量仍然停留在 35 个操作系统线程(应用程序以 runtime.GOMAXPROCS(runtime.NumCPU()) 启动)。当测试停止时,数字仍然是 35。
有人可以向我解释这种行为吗?
可以没有。以某种方式增加操作系统线程的数量(来自操作系统或来自 GOlang)?
如果没有,这会提高性能吗?操作系统线程增加了?
有人可以建议一些其他优化此应用程序的方法吗?
相关分类