Docker中程序读取CPU数量有误的问题
有个新项目,是用Egg.js框架写的,我们本地测试无误后,发布正式环境(2个docker实例),发现有一个docker里面的程序起来了,但是有一个起不来。
查看日志,发现控制台报错:
1 | |
经排查,我们用到了redis,而三个redis的ip和端口,有两个是不能telnet通的,因此我们怀疑是这2个IP端口有权限限制,发了邮件让运维帮忙开通权限:
1 | |
然后运维反馈redis没有做权限限制,全部都是对内放开的。
后来又让运维帮忙看了下,发现是我们把其中2个IP的端口写反了。
redis问题解决后,我们发现程序还是起不来,还是报这样的错误。
然后Google查询,看网上有人反馈是worker进程开启太多导致的。我们怀疑是不是程序自动识别服务器cpu数量的时候,误读成了docker宿主机的cpu数量,导致开启的worker进程过多,CPU资源不足,所以没起来。
查看了另外一个成功启动的docker,发现居然起了20多个worker进程!然后我们在启动命令中手动指定了worker进程数:
1 | |
这里有个比较尴尬的事情,我把–workers参数误写成了–worker,导致加了后进程限制没生效,还以为是这个参数不起作用。
添加参数后重新启动,发现进程数正常了,之前无法启动的docker,也能正常跑起来了。
至此,原因终于找到了。