Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance Can';无法在本地主机HTTP Golang服务器上克服4000 RPS treshold_Performance_Http_Go - Fatal编程技术网

Performance Can';无法在本地主机HTTP Golang服务器上克服4000 RPS treshold

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) 如果要求正文!=无{ 请求主体关闭() }

我试图在本地机器上测量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)
如果要求正文!=无{
请求主体关闭()
}
}
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
    可能不会在收到滴答声后立即发生。