Performance Can';无法在本地主机HTTP Golang服务器上克服4000 RPS treshold
我试图在本地机器上测量Go默认HTTP服务器实现的带宽。服务器正在接受任何HTTP请求,使用Performance Can';无法在本地主机HTTP Golang服务器上克服4000 RPS treshold,performance,http,go,Performance,Http,Go,我试图在本地机器上测量Go默认HTTP服务器实现的带宽。服务器正在接受任何HTTP请求,使用sync.atomic递增计数器,并发送200OK响应。此外,服务器每秒收集请求量,打印请求量并将计数器重置为零: type-hand-struct{ cnt int32 } func(h*hand)ServeHTTP(rsp http.ResponseWriter,req*http.Request){ 原子添加剂32(&h.cnt,1) 高级文书主任(200) 如果要求正文!=无{ 请求主体关闭() }
sync.atomic
递增计数器,并发送200OK
响应。此外,服务器每秒收集请求量,打印请求量并将计数器重置为零:
type-hand-struct{
cnt int32
}
func(h*hand)ServeHTTP(rsp http.ResponseWriter,req*http.Request){
原子添加剂32(&h.cnt,1)
高级文书主任(200)
如果要求正文!=无{
请求主体关闭()
}
}
func main(){
h:=新(手)
s:=&http.Server{
地址:“:8080”,
经办人:h,
}
股票代码:=time.NewTicker(1*time.Second)
go func(){
对于勾号:=范围ticker.C{
val:=atomic.SwapInt32(&h.cnt,0)
fmt.Printf((%v)%d RPS\n),勾号,val)
}
}()
log.Fatal(s.ListenAndServe())
}
目标客户端正在尝试同时发送100000个GET
请求:
const总计=100000
func main(){
var int32
var rsp int32
r=总数
rsp=r
对于r>0{
go func(){
p、 错误:=http.Get(“http://localhost:8080")
原子添加32(&rsp,-1)
如果错误!=零{
fmt.Printf(“错误:%s\n”,错误)
返回
}
如果p.StatusCode!=200{
fmt.Printf(“状态%d\n”,p.StatusCode)
}
}()
r--
}
为了{
x:=atomic.LoadInt32(&rsp)
fmt.Printf(“已发送:%d\n”,总计-x)
如果x==0{
返回
}
时间。睡眠(1*时间。秒)
}
}
我正在使用内核为5.3.2-gentoo
的Linux机器。我将nofile
的ulimits
(包括soft
和hard
)更改为100000
。当我运行此测试时,所有其他用户应用程序都已停止
我不希望得到准确的结果,但只需要知道这个阈值的级别,比如X000
或X0000
或X00000
但是服务器每秒不能处理超过4000个请求,它看起来太低了:
# removed timestamps
0 RPS
0 RPS
0 RPS
3953 RPS
3302 RPS
387 RPS
37 RPS
1712 RPS
如何提高HTTP服务器的带宽?或者我的测试方法或本地配置有问题 问题在于测试方法:
当我使用
wrk
在专用主机上测试此服务器时,它显示285900.73
RPS。计算带宽的方式不是最佳的。股票行情不是一个可靠的时间度量。您应该让计数器值递增,并将其值除以经过的时间,以获得平均每秒的滴答声。另一个问题是客户端中缺少p.Body.Close()
。不确定它是否会影响性能,但肯定会影响内存管理。启动10000个go例程不是一个好方法。主意你的电脑有10000个内核吗?它们将按顺序执行并减慢执行速度。您应该启动少量的go例程,并将其数量增加到性能没有变化为止。尝试使用现有的基准测试工具,例如,您只需担心服务器的改进。看在上帝的份上,请使用正确的设置。“测量”服务器实现的性能,服务器和客户机都运行在开发机器上(并行处理各种事情,可能会遇到一些限制,例如打开的文件数量等),就像用手捂着额头测量体温一样。将服务器放在目标平台上,测量它能够可靠满足的用例请求数。这个数字减去一位是水平缩放的缩放阈值。问题已解决。所有上述和fmt.Println
可能不会在收到滴答声后立即发生。