我们有一个用Golang编写的图像服务。
- 它支持图像操作,例如调整大小的裁切模糊。.
- RPS约为400。
- Pod Config:16GB RAM和8核
- 我们部署了该应用程序并观察了一天,它显示出较高的核心利用率
- 我们引入了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)来解决核心问题
- 接下来,我们开始观察高内存利用率。
- 因此我们将Ballast减少到1GB,但内存利用率仍然很高
- 根据本文https://www.bwplotka.dev/2019/golang-memory-monitoring/,Goland版本1.12+报告了较高的RSS根据文章的说法:“这并不意味着它们需要更多的内存,它只是针对没有其他内存压力的情况进行了优化。 “
- 要验证我们是否在本地计算机上做了一个小型POC来验证以上内容,并且工作正常。
- 本地设置-容器内存-500MB
- 如果有内存,内存将不断增加,并一直保持在450MB,直到压力增加。一旦压力增加,内存就会减少到4MB。
- 但是,此POC在Kubernetes群集上失败,并且当内存在高RPS(如400)上达到〜16 GB RAM时,pod开始崩溃并重新启动。
有人可以建议我们如何解决此内存问题以及为什么该POC在群集上失败。
让我知道是否需要更多细节。