在 docker 中运行的 C# 应用程序 (mono) 会产生巨大的 CPU 峰值

在 docker 中运行的 C# 应用程序 (mono) 会产生巨大的 CPU 峰值

我已经研究这个问题好久了。我们运行一个有多个 Docker 容器的服务器,其中一个容器有一个用 c# 编写的 Mono 服务器应用程序。

基础图像是 Phusion Base(http://phusion.github.io/baseimage-docker/

到目前为止,一切运行良好,但今天晚上,我们突然开始看到巨大的 CPU 峰值,导致整个网站速度变慢,甚至完全无法访问。

大约一周以来,我没有做任何更改。我非常怀疑这个问题是由于源代码错误而引起的。此外,同一个应用程序(完全相同的可执行文件)在 docker 之外的同一台服务器上或在我的 Mac 上运行良好。我尝试过的方法:

  • 在我的本地计算机上运行应用程序(正常运行,无 CPU 峰值)
  • 在 docker 之外运行应用程序(但在同一台服务器上)(无 CPU 峰值)
  • 不使用缓存重建图像(无效)

参见我们的流程树的屏幕截图: 在此处输入图片描述

如果有人能帮助我们那就太好了!我非常愿意提供更多详细信息 ;) 提前谢谢!

答案1

好的,我找到了!显然,该进程卡在了 while 循环中,因为它正在监听 stdin 中的命令。

CPU 峰值一直存在,但我们从未注意到(直到我们在网站上对更多人进行了更大规模的测试)因此经过搜索,我发现您可以这样做来“关闭” stdin,以确保它不会在后台继续读取数据:

read x < /dev/fd/1 | <command>

其中,命令是使 CPU 激增的命令。

对我来说完整的命令是:

cd /opt/SteamBot && read x < /dev/fd/1 | mono --debug SteamBot.exe

CPU 现在下降到 7% ;)

相关内容