【问题标题】:Blockers for maximum number of http requests from a pod阻止来自 pod 的最大 http 请求数
【发布时间】:2021-01-14 14:09:07
【问题描述】:

我有一个 Go 应用程序,它部署到 Kubernetes 上的两个 8 核 Pod 实例。 从中,我收到一个 id 列表,然后我通过将每个 id 发送到 POST 端点来从另一个服务检索一些数据。 我正在使用有界并发模式来为该外部服务提供最大数量的同时 goroutines(以及因此的请求)。

我将并发限制设置为:

sem := make(chan struct{}, MAX_GO_ROUTINES)

通过这个设置,我开始通过增加 MAX_GO_ROUTINES 数字来玩弄它。我通常会收到大约 20000 个 ID 来检查。所以我通过将 MAX_GO_ROUTINES 设置为 100 到 20000 之间的任何值来玩弄。

我注意到的一件事是,随着我越来越高,一些请求开始失败,并显示以下消息:connection reset from this external service。

所以我的问题是:

  1. 本例中的拦截器是什么?
  2. 8 核和 4GB 内存的服务器可以发送的并发 HTTP POST 请求限制是多少?是内存限制吗?还是文件描述符限制?
  3. 我收到的错误是来自我的服务器还是来自外部服务器?

【问题讨论】:

  • 错误来自您的服务器(您的应用程序)。当其中一个对等方关闭连接时,会发送连接重置。 20k 请求对您的 pod 来说应该不是问题。

标签: go concurrency


【解决方案1】:

这种情况下的拦截器是什么?

正如评论所述:HTTP“连接重置”generally means

连接被对端意外关闭。服务器出现 之前在毫无戒心的 HTTP 客户端上断开了连接 发回响应。这很可能是由于高负载造成的。

大多数网络服务器(如 nginx)都有一个队列,它们在等待服务时在其中暂存连接。当队列超过某个限制时,可能会断开连接并“重置”。因此,这很可能是您的上游服务饱和(即您的应用发送的请求超出了它的服务能力并使其队列超载)

8 核和 4GB 内存的服务器可以发送的并发 HTTP POST 请求的限制是多少?是内存限制吗?还是文件描述符限制?

All :) 在某些时候,您的特定工作负载会超载逻辑限制(如文件描述符)或“物理”限制(如内存)。不幸的是,真正了解哪些资源将被耗尽(以及您遇到哪些限制)的唯一方法是run tests and profile 并对您的工作量进行基准测试:(

我收到的错误是来自我的服务器还是来自外部服务器?

HTTP Connection reset 很可能是外部的,它表示连接对端(上游服务)重置了连接。

【讨论】:

    猜你喜欢
    • 2021-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-15
    • 2022-01-13
    • 2015-04-27
    • 2021-01-05
    • 2018-01-28
    相关资源
    最近更新 更多