在kubernetes集群上部署的Golang应用程序中的高内存利用率

时间:2020-02-12 13:02:26

标签: docker go image-processing kubernetes

我们有一个用Golang编写的图像服务。

  1. 它支持图像操作,例如调整大小的裁切模糊。.
  2. RPS约为400。
  3. Pod Config:16GB RAM和8核
  4. 我们部署了该应用程序并观察了一天,它显示出较高的核心利用率
  5. 我们引入了4GB的镇流器(https://blog.twitch.tv/en/2019/04/10/go-memory-ballast-how-i-learnt-to-stop-worrying-and-love-the-heap-26c2462549a2/)和同步池(https://medium.com/a-journey-with-go/go-understand-the-design-of-sync-pool-2dde3024e277)来解决核心问题
  6. 接下来,我们开始观察高内存利用率。
  7. 因此我们将Ballast减少到1GB,但内存利用率仍然很高
  8. 根据本文https://www.bwplotka.dev/2019/golang-memory-monitoring/,Goland版本1.12+报告了较高的RSS根据文章的说法:“这并不意味着它们需要更多的内存,它只是针对没有其他内存压力的情况进行了优化。 “
  9. 要验证我们是否在本地计算机上做了一个小型POC来验证以上内容,并且工作正常。
  10. 本地设置-容器内存-500MB
  11. 如果有内存,内存将不断增加,并一直保持在450MB,直到压力增加。一旦压力增加,内存就会减少到4MB。
  12. 但是,此POC在Kubernetes群集上失败,并且当内存在高RPS(如400)上达到〜16 GB RAM时,pod开始崩溃并重新启动。

有人可以建议我们如何解决此内存问题以及为什么该POC在群集上失败。

让我知道是否需要更多细节。

0 个答案:

没有答案