围棋不是';t从aws ubuntu服务器检测SOMAXCONN更改
我正在尝试使用对我的golang net/http服务器进行压力测试。当我使用2048个虚拟用户访问我的aws ubuntu服务器时,k6抛出“对等重设连接”。通过在互联网上进行调查,我发现问题可能出在积压工作队列上。 在阅读一些stackoverflow问题时,我试图修改sysctl.conf文件中的SOMAXCONN变量。将其从128修改为1024后,当我运行主go程序时:围棋不是';t从aws ubuntu服务器检测SOMAXCONN更改,ubuntu,go,amazon-ec2,httpserver,sysctl,Ubuntu,Go,Amazon Ec2,Httpserver,Sysctl,我正在尝试使用对我的golang net/http服务器进行压力测试。当我使用2048个虚拟用户访问我的aws ubuntu服务器时,k6抛出“对等重设连接”。通过在互联网上进行调查,我发现问题可能出在积压工作队列上。 在阅读一些stackoverflow问题时,我试图修改sysctl.conf文件中的SOMAXCONN变量。将其从128修改为1024后,当我运行主go程序时: package main import ( "fmt" "log" "net/http"
package main
import (
"fmt"
"log"
"net/http"
"strings"
"golang.org/x/sys/unix"
)
func main() {
http.HandleFunc("/some_path", handler)
fmt.Println("SOMAXCONN:", unix.SOMAXCONN)
log.Fatal(http.ListenAndServe(":8888", nil))
}
我有以下终端输出:
SOMAXCONN: 128
实际上,它应该打印:
SOMAXCONN: 1024
如果有人能解释一下为什么GOLANG检测128而不是1024,我将不胜感激。我猜在编译go时,您检查SOMAX的方式是设置的 通过读取/proc以另一种方式进行检查,表明net.core.somaxconn已更改
package main
import (
"fmt"
"log"
"net/http"
"os"
)
func main() {
filename := "/proc/sys/net/core/somaxconn"
f, err := os.Open(filename)
data := make([]byte, 100)
_, err2 := f.Read(data)
if err != nil || err2 != nil {
log.Println(err2)
log.Fatal(err)
}
fmt.Printf("SOMAXCONN: %v", string(data))
log.Fatal(http.ListenAndServe(":8888", nil))
}
unix.SOMAXCONN
是一个常量,它在运行代码时不会改变,它会打印SOMAXCONN的新值。有趣的是,http服务器的性能比somaxconn在128上时差。另一件事是,现在它抛出接受错误:打开的文件太多。你知道我是否需要修改另一个变量来解决这个问题吗?我相信这与文件描述符有关,但不确定。您可能需要增加文件描述符的数量以及somax。尝试查看fs.file-max设置为什么,并增加该值。也请仔细阅读。这些参数设置为低默认值是有原因的,它们使用的是系统资源我已经测试了文件描述符的不同值(首先我只使用了100.000,然后设置为1.000.000)。我注意到,当增加文件描述符的数量时,关于Accept error的错误:太多打开的文件消失了,但是响应时间增加了很多(在TTFB上达到2秒)。最终吞吐量减少到初始吞吐量的一半,CPU使用率没有增加,内存使用率也没有增加。有没有其他提高go-net/http go服务器性能的建议?感谢您的支持。增加somaxconn可能会增加响应时间。有关该设置的实际含义的说明,请参阅。如果服务器上的内存和cpu使用量是恒定的且较低,那么您可能可以对代码进行一些处理,以使其更快地提供服务