
这段时间我们这边服务经常遇到一个诡异的问题。
服务在容器中正常运行了 2-3 周,期间没有人管过。某一天后端服务突然挂掉不再提供服务了。
排查性能相关,cpu ,磁盘,内存都是正常的,docker ps 也显示正常没有重启之类的情况。但是 docker logs 日志停止输出。必须手动 docker restart 才能恢复服务,文件描述符数量也正常,容器日志也不存在写满的情况。因为要优先恢复服务可用性,所以没办法再排查更加细致的内容,有没有大佬遇到过类似的问题?或者说有大佬能提供一下下次出现类似情况的排查思路吗?
docker 版本是 23.0.6
1 defunct9 18 天前 开 ssh ,让我上去看看 |
2 finab 18 天前 你 docker 运行的不是提供服务本身的那个进程吧? |
5 log4j 18 天前 有没有可能你服务的进程不是 0 号?这种情况它异常退出后 docker 是不知道 |
6 klo424 18 天前 多半是自己程序的 bug ,异常终止了。docker logs 的输出内容是可以通过程序修改的,所以如果程序自己崩了,没有弹出异常,docker 容器也不知道发生了什么。检查一下程序有没有 bug 吧。 |
9 kd9yYw2RyhQwAwzn 18 天前 可以写 health check 做健康检查 |
10 taohua1c 18 天前 写个定时任务,每晚重启下 docker 服务,先跑着 |
11 c4923 OP @kd9yYw2RyhQwAwzn 目前想到的解决方案是健康检查,但是我希望还是能找到具体原因。主要这么奇怪的情况我也是第一次遇到。 |
13 johnbobby 18 天前 dockerfile 有问题吧,就像楼上说的不是 0 号进程 |
14 Daybyedream 18 天前 进容器看业务到底咋回事呀 |
15 deplives 18 天前 盲猜 dockerfile 有问题,容器内启动的进程不是 0 导致即使服务挂了 docker 也认为没有问题一切正常 |
16 xzysaber 18 天前 这就是为什么 Docker 推荐一个容器一个进程,即使多个进程也要有成熟的进程管理工具。 |
17 newaccount 18 天前 你有请求日志吧?把那些重放一遍看能重现出来不,不然等 2-3 周实在没法弄 |
18 TeeMoCode 18 天前 脚本中启动服务的命令是用的 exec 么? |
19 laminux29 18 天前 如果把容器实例当成物理宿主机,虽然里面的服务进程挂起,但物理宿主机是仍然在运行的,因此你用 docker ps 显示容器实例正在运行,是正常现象。至于 docker log 无输出,是因为 docker log 可能绑定到服务进程的 log 输出,由于服务进程挂起,无 log 输出,所以你用 docker log 也无输出了。 |
20 zhangyunlu80 18 天前 这个意思不就是服务 hang 住了么 |
23 c4923 OP @newaccount 试过了, 确实复现不了 |
24 fds 18 天前 保留现场,根据是什么语言,用相应工具提取一下 stack 看看卡在哪里了。 软件 bug 很常见的,特别是有些异常输入之类的。大概率不是 docker 的问题。 你要保证可用性,建议前面加个负载均衡之类的服务,这样一个停了,可以直接启动另外一个,然后分析前一个的状态。 |
25 hefish 18 天前 多数是服务停了,但是启动服务的 shell 还活着。在等待控制台的输入。 |
26 MineDog 18 天前 从来都是 pid=1 的进程吧,0 号进程是什么 |
27 TeeMoCode 18 天前 @c4923 脚本里面用 exec 启动服务,pid=1 的就是你的服务进程。执行 docker ps 看状态是 up ,那说明 pid=1 还活着。 用 docker exec 进容器执行 ps -p 1 -o stat,rss,vsz,cmd,wchan 看进程状态如何呢 |
28 yinmin 18 天前 via iPhone 大概率是服务程序的代码 bug ,或者程序引入模块的 bug 。有些服务架构是有外部调用多少次就重启一个新进程,可以规避长时间运行不稳定的情况。 |
29 julyclyde 16 天前 我猜你是用脚本启动的服务进程然后在脚本里做了无限等待吧 |