无法克服localhost HTTP Golang服务器上的4000 RPS阈值

时间:2019-12-14 09:04:48

标签: performance http go

我尝试测量本地计算机上Go默认HTTP服务器实现的带宽。服务器仅接受任何HTTP请求,使用sync.atomic递增计数器并发送200 OK响应。另外,服务器每秒收集一次请求量,将其打印并将计数器重置为零:

type hand struct {
    cnt int32
}

func (h *hand) ServeHTTP(rsp http.ResponseWriter, req *http.Request) {
    atomic.AddInt32(&h.cnt, 1)
    rsp.WriteHeader(200)
    if req.Body != nil {
        req.Body.Close()
    }
}

func main() {
    h := new(hand)
    s := &http.Server{
        Addr:    ":8080",
        Handler: h,
    }
    ticker := time.NewTicker(1 * time.Second)
    go func() {
        for tick := range ticker.C {
            val := atomic.SwapInt32(&h.cnt, 0)
            fmt.Printf("(%v) %d RPS\n", tick, val)
        }
    }()
    log.Fatal(s.ListenAndServe())
}

目标客户端正在尝试同时发送100000 GET个请求:

const total = 100000

func main() {
    var r int32
    var rsp int32
    r = total
    rsp = r
    for r > 0 {
        go func() {
            p, err := http.Get("http://localhost:8080")
            atomic.AddInt32(&rsp, -1)
            if err != nil {
                fmt.Printf("error: %s\n", err)
                return
            }
            if p.StatusCode != 200 {
                fmt.Printf("status %d\n", p.StatusCode)
            }
        }()
        r--

    }
    for {
        x := atomic.LoadInt32(&rsp)
        fmt.Printf("sent : %d\n", total-x)
        if x == 0 {
            return
        }
        time.Sleep(1 * time.Second)
    }
}

我正在使用具有5.3.2-gentoo内核的Linux计算机。我将ulimits的{​​{1}}(softhard)更改为nofile。当我运行此测试时,所有其他用户应用程序均已停止。

我不希望得到准确的结果,而只需要知道此阈值的水平,例如100000X000X0000

但是服务器每秒不能处理超过X00000个请求,它看起来太低了:

4000

如何增加HTTP服务器的带宽?也许我的测试方法或本地配置有问题?

1 个答案:

答案 0 :(得分:0)

问题出在测试方法上

  1. 在同一台计算机上运行客户端和服务器是不正确的,目标服务器应位于专用主机上,目标和客户端之间的网络应足够快
  2. 用于网络测试的自定义脚本不是一种选择:对于简单的情况,wrk,对于更复杂的情况,Jmetr或其他框架,可以使用

当我使用wrk在专用主机上测试此服务器时,它显示了285900.73 RPS。