围棋不是';t从aws ubuntu服务器检测SOMAXCONN更改

围棋不是';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"

我正在尝试使用对我的golang net/http服务器进行压力测试。当我使用2048个虚拟用户访问我的aws ubuntu服务器时,k6抛出“对等重设连接”。通过在互联网上进行调查,我发现问题可能出在积压工作队列上。 在阅读一些stackoverflow问题时,我试图修改sysctl.conf文件中的SOMAXCONN变量。将其从128修改为1024后,当我运行主go程序时:

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使用量是恒定的且较低,那么您可能可以对代码进行一些处理,以使其更快地提供服务