【问题标题】:Sudden Increase in the number of goroutines after upgrade [closed]升级后goroutines数量突然增加[关闭]
【发布时间】:2021-07-25 11:28:11
【问题描述】:

会导致 goroutine 数量增加吗?

我们的应用程序在测试环境中运行。

我们所做的唯一改变是,将 Go 版本从 1.13 升级到 1.16,而不是直接将应用程序部署为容器,而是首次将其作为 pod 部署在私有 kubernetes 集群中。

goroutine 数量突然增加了将近 15 个(从 15 个上升到 30 个),保持稳定。

您可以提出的任何可能的原因可能是造成这种情况的原因吗?

【问题讨论】:

    标签: go kubernetes goroutine


    【解决方案1】:

    因为您在这个等式中至少有两个变量——Go 的升级和更改的部署方案——不可能进行有根据的猜测。

    您应该从这样的想法开始,即 goroutine 不是由为您的应用程序提供支持的 Go 运行时创建的:虽然它确实自己使用了多个 goroutine,但它确实是“几个”——也就是说,它们的数量远低于 10,因此活动 goroutine 数量翻倍应该是由其他一些原因造成的。

    此外,在用 Go 编写的典型软件中——网络服务器为客户端发出的并发请求提供服务——(你的软件看起来属于这一类)通常每个活动客户端请求至少有一个 goroutine(其中一个是“主要的”,而其他的可能会被创建来帮助主要的)因此增加的原因可能是新部署方案允许在持续负载下更好地并发客户端请求。

    当然,可能还有许多其他原因。
    例如,您的代码中可能存在错误,导致无法正确处理已终止的客户端请求,在新的部署方案中,由于网络的细微变化而暴露出来。
    或者您可能已经升级了一些依赖项,这些依赖项开始为同一工作单元使用更多的 goroutine。
    收集统计 goroutine 数量的指标可能存在错误或功能。
    你看,我越想猜测我的猜测就越疯狂,但我仍然无法检查任何一个。

    我要告诉你的是,与其问关于 SO 的没有实际意义的问题,你应该意识到自己是一名软件工程师(或 devops 人或其他人;我敢肯定你不是会计师或兽医),因此在发生此类问题时进行受过教育的研究基本上是你的工作。
    一个好的分析方法是收集所有活动的 goroutine 的转储并分析它们的堆栈跟踪:这会让你了解每个活动的 goroutine 正在做什么。 有几种方法可以做到这一点:例如,使用SIGQUIT 终止进程将产生转储到进程'stdout;我不知道是否可以从 k8s pod 思想中收集这些信息。 另一种方法是使用 net/http/pprof 包,然后 pefrorm GET 到正在运行的进程的 /debug/pprof/goroutines?debug=1

    【讨论】:

    • 谢谢,但我在这里问这个只是为了获得前进的方向。我只是不知道从哪里开始。我知道您可能是所有这些方面的专家,但我当然不是。而且我相信,stackoverflow 是一个您可以毫不犹豫地寻求帮助的论坛。所以,请以开放的心态回答问题。无论如何,感谢您的回复。
    • «stackoverflow 是一个您可以毫不犹豫地寻求帮助的论坛»,我有点不同意,原因有两个:1)许多人倾向于认为 SO 是一种“去寻求任何帮助”,但 SO 有一套明确的规则,可以提出什么样的问题; here they are,您可以很容易地看到您的问题与 SO 无关,因为它没有“勾选”一个好问题所需的任何“复选框”。 2)你的问题没有任何你在提问之前所做的任何研究的暗示——就像你已经注意到奇怪的读数并匆匆忙忙……
    • …关于以开放的心态提问——这正是我所做的:我没有否决你的问题并将其标记为关闭(尽管实际上我必须——按照 SO 规则)并且有为您提供了几个探索方向。您肯定可能不喜欢我回复的最后一部分,但这是诚实的,而且我真诚地相信,从长远来看,在探索其他可能性之前忘掉急于实现 SO 的技能实际上会对您(作为软件/开发运营工程师)有所帮助。所以请不要把这算作一个油嘴滑舌的反驳:如果我要解雇你,我会直接结束你的问题。
    • 另外请注意,SO 不适合像您这样的问题,不仅因为它不符合其既定目标(拥有一种高质量的“食谱”解决方案*编程* 问题),但主要是因为它需要多次来回收集大量信息,以便至少对可能的原因进行受过教育的猜测。所以作为一个媒介完全不适合那个;例如,邮件列表要好得多。因此,请参阅here 了解更适合此类问题的场所。
    猜你喜欢
    • 2021-06-12
    • 2021-09-16
    • 2018-12-30
    • 2017-05-31
    • 1970-01-01
    • 2021-05-02
    • 2021-04-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多