登录
首页 >  Golang >  Go问答

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

来源:stackoverflow

时间:2024-04-11 22:00:36 449浏览 收藏

本篇文章给大家分享《无法克服本地 HTTP Golang 服务器上的 4000 RPS 阈值》,覆盖了Golang的常见基础知识,其实一个语言的全部知识点一篇文章是不可能说完的,但希望通过这些问题,让读者对自己的掌握程度有一定的认识(B 数),从而弥补自己的不足,更好的掌握它。

问题内容

我尝试测量本地计算机上 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 机器。我将 nofileulimitssofthard)更改为 100000。当我运行此测试时,所有其他用户应用程序都已停止。

我并不期望获得准确的结果,但只需要知道此阈值的级别,例如 x000x0000x00000

但是服务器每秒无法处理超过 4000 请求,它看起来太低了:

# removed timestamps
0 RPS
0 RPS
0 RPS
3953 RPS
3302 RPS
387 RPS
37 RPS
1712 RPS

如何提高http服务器的带宽?或者我的测试方法或本地配置有问题?


解决方案


问题出在测试方法上:

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

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

以上就是《无法克服本地 HTTP Golang 服务器上的 4000 RPS 阈值》的详细内容,更多关于的资料请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>