大家一直都说Go性能很好,而Gin框架更是比较好的web服务框架。但是为什么我用http_load压测Gin,当300qps的时候,就开始出现大量超时。而且压测10min后就开始出现超时现象。
我的Gi操作就是当请求进来后,sleep 1毫秒,然后return ok(1毫秒为模拟服务响应时间,比如查数据库什么的),但是即使这样当压力到达300qps的时候,服务就超时了。。。
请大神们帮忙,是不是我使用的哪个地方有问题?至少Gin也要导到少说1千,多了1万的qps吧?为啥到了300就有问题了。。。
代码如下:
package main
import ( "time"
"gopkg.in/gin-gonic/gin.v1"
"net/http"
)
func main() { route := gin.Default() route.GET("/bin/search", func(c *gin.Context) {
time.Sleep(time.Millisecond * 1)
c.String(http.StatusOK, "OK")
})
s := &http.Server{
Addr: ":1234",
Handler: route,
ReadTimeout: 1 * time.Second,
WriteTimeout: 1 * time.Second,
MaxHeaderBytes: 1 << 20,
}
s.ListenAndServe()
}
有疑问加站长微信联系(非本文作者)
是不是机器到瓶颈了, 看看机器的cpu使用率. 适当加大cpu试试看.
cpu使用率才到20%,还很小~Gin可以调整使用cpu的个数吗?
你改成直接输出hello world看下。是不是sleep会存在go程频繁调度导致。
要在本机测试
应该是你的超时时间设置太短吧,我看你超时时间好像设置也是1s吧,
没问题啊,老铁,刚用wrk压的3.1W
三次压测结果。4核8G Mac. go version go1.8.3 darwin/amd64
wrk -c 100 -t 10 -d 1m http://127.0.0.1:1234/bin/search Running 1m test @ http://127.0.0.1:1234/bin/search 10 threads and 100 connections Thread Stats Avg Stdev Max +/- Stdev Latency 19.64ms 69.76ms 1.01s 97.32% Req/Sec 1.07k 310.33 1.78k 76.10% 625373 requests in 1.00m, 70.38MB read Requests/sec: 10405.80 Transfer/sec: 1.17MB
没用过gin,如果是每个请求都开一个goroutine 处理,问题可能出在这,gouroutine 数量太多了。
300的话基本就是 mac系统限制的问题 mac系统会限制连接数
难道不应该一个处理一个协程吗?有其他什么方案?
我不是特别了解压测相关,但以前写代码的时候连接池的链接数不能设置特别大,最好是cpu*2,你可以试试。