登录
首页 >  Golang >  Go问答

如何在高性能 http 客户端中禁用/忽略所有 Cookie?

来源:stackoverflow

时间:2024-03-26 20:54:38 295浏览 收藏

为了提高负载测试工具的性能,作者希望在 Go HTTP 客户端中禁用所有 cookie。由于 cookie 会导致内存使用增加,他们试图探索自定义传输和策略,但没有找到有效的方法。他们研究了 Fasthttp 和 net/http 实现,发现 Fasthttp 虽然 CPU 使用更低,但内存消耗更高。

问题内容

我正在为我的公司创建工具来对我们的系统进行负载测试。我目前有用 python 编写的工具,但我正在探索使用 go 的选项,希望能够提高效率和性能,因为我们需要同时生成数百万个用户(每个盒子有数千个用户)并且每一点都很重要。我的用户主要对我们的系统进行 http 调用,我需要一个非常轻量且高效的 http 客户端。

对于我们的 python 工具,以前的员工有一些手动处理和重用 sockets 的功能,而完全忽略了 cookie。虽然我对 go 完全陌生,但到目前为止我已经比较了多种 go 网络实现,并且我对 cpu 和网络使用情况感到满意,因此我认为我还不需要手动管理套接字,但是ram 使用量比我们的 python 解决方案高出数倍。我怀疑这是由于这些 go 实现自动维护和管理 cookie,因为其他更高级别的 python 库也做了同样的事情。我正在寻找让我的 http 客户端禁用/阻止/忽略所有 cookie 的方法,以解决我的问题或排除 cookie 作为我的内存膨胀罪魁祸首。

我使用了一个简单的 net/http get() 调用,fasthttp 来创建一个重复使用每台主机不同数量的连接 (1000+) 的客户端,并创建了一个带或不带自定义 transportnet/http.client 。我已经使用 pprof 来内存分析每个。在不覆盖 cookie 的情况下,我的 http.client 流程似乎内存膨胀最少,而 fasthttp 内存膨胀最多。我尝试浏览他们的所有文档并搜索 so 和网络,但找不到任何明确忽略或阻止 cookie 的内容。我发现最接近的是 fasthttp 的 delallcookies() 用于请求和响应,但调用它们对内存使用没有明显影响。我研究了 net/http/cookiejar 来为 net/http.client 设置自定义 jar 和策略,但这看起来更像是一种存储和使用 cookie 数据的方法,我不想这样做,而且我不这样做没有找到一种方法来设置完全忽略 cookie 的策略。

// fasthttp implementation
var httpClient *fasthttp.Client

func init() {
    httpClient = &fasthttp.Client{
        MaxConnsPerHost: 1000,
    }
}

func fastHTTPClient(method string, uri string) (string, time.Duration) {

    req := fasthttp.AcquireRequest()
    req.Header.SetMethod(method)
    req.SetRequestURI(uri)

    resp := fasthttp.AcquireResponse()

    startTime := time.Now()
    err := httpClient.DoTimeout(req, resp, targetDuration)
    elapsed := time.Since(startTime)

    if err != nil {
        log.Panicln(err)

        body := string(resp.Body())
        req.Header.DelAllCookies()
        resp.Header.DelAllCookies()
        fasthttp.ReleaseRequest(req)
        fasthttp.ReleaseResponse(resp)
        return body, elapsed
    }

    body := string(resp.Body())
    req.Header.DelAllCookies()
    resp.Header.DelAllCookies()
    fasthttp.ReleaseRequest(req)
    fasthttp.ReleaseResponse(resp)
    return body, elapsed
}

// net/http implementation
var tr = &http.Transport{}
var client = &http.Client{Transport: tr}

func netGet(method string, uri string) (string, time.Duration) {

    startTime := time.Now()
    resp, err := client.Get(uri)
    elapsed := time.Since(startTime)

    if err != nil {
        log.Panic(err)

        body, err2 := ioutil.ReadAll(resp.Body)
        resp.Body.Close()

        if err2 != nil {
            log.Panic(err)
        }

        return string(body), elapsed
    }

    body, err := ioutil.ReadAll(resp.Body)
    resp.Body.Close()

    if err != nil {
        log.Panicln(err)
    }

    return string(body), elapsed
}

同样,这些可以正常工作,但是当我使用 boomer 同时运行数千个这些时,我最终会使用多个 gb 的 ram,而我们的 python 套接字实现则使用 1-1.5 gb 的 ram。我如何阻止/忽略 cookie,或者确保 cookie 不会耗尽我的所有内存?


解决方案


Fasthttp 始终将完整响应加载到内存中。因此,如果您有较大的响应主体并希望限制内存使用,那么它可能不是您的最佳解决方案。

Fasthttp 还通过将缓冲区保留在内存中并重用它来以内存使用换取 CPU 使用,而不是花费 CPU 周期让垃圾收集器收集这些缓冲区。

使用多个 GB 内存似乎很多。在本例中,您查看的是 RSS 还是虚拟内存?

Cookie 只是响应中包含的标头。您无法阻止服务器返回标头。你只能接受它,并在记忆中读它。虽然浏览器可以禁用本地 cookie,但仍然无法阻止服务器返回带有 set-cookie 标头的标头。

对于Fasthttp,我看了一些源代码,发现它使用了很多同步。 Pool是为了提高性能,但是我没有发现它的目的是为了节省内存。它的目的只是为了快。

如果你非常看重内存,我建议干脆将其封装在http/net上或者另找一个包,而不是使用fasthttp,因为fasthttp不适合压力测试。

以上就是《如何在高性能 http 客户端中禁用/忽略所有 Cookie?》的详细内容,更多关于的资料请关注golang学习网公众号!

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