猿问

优化 CPU 密集型 Golang WebApp 的方法

我有一个非常消耗 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)?

    • 如果没有,这会提高性能吗?操作系统线程增加了?

  • 有人可以建议一些其他优化此应用程序的方法吗?


萧十郎
浏览 297回答 1
1回答
随时随地看视频慕课网APP

相关分类

Go
我要回答