PID=1与僵尸进程

当将jenkins搬进容器,该容器经常会停止响应,需要定时重启。但是在虚拟机中却并没有这种问题,通过ps aux发现,jenkins容器存在大量的僵尸进程。当僵尸进程占用大量的进程表空间时,就会无法启动新的进程。

在Linux系统中,PID为1的进程是特殊的,负责收割僵尸进程。虚拟机中,PID为1的进程通常是Systemd、SysVinit或upstart,它们能自动收割僵尸进程。在容器里,PID为1的进程通常是用户自己写的程序,可能并不会收割僵尸进程。

Docker Daemon

Docker Daemon可以收集容器的标准输出,然后通过syslog或json-file等log-driver处理。由于这个架构是中心化的,Docker Daemon会成为日志收集的瓶颈。

当容器的标准输出过多时,Docker Daemon不能及时处理,就会影响这个容器的正常运行;同时Docker Daemon对标准输出的处理会阻塞其他操作,比如docker ps和docker stop等命令。

常用进程管理工具

进程管理工具
僵尸进程 重定向标准输出并自动 rotate
S6 收割 支持
tini 收割 不支持
systemd 收割 支持,但为二进制
phusion-baseimages 收割 不支持
daemontools 不收割 支持
supervisor 不收割 支持

S6包含s6-svscan、s6-supervise和s6-log等组件

在准备阶段,s6-overlay准备环境变量和创建s6工作目录/var/run/s6/services

当启动PID为1的s6-svscan时,它将管理该目录下的服务

s6-svscan -t0 /var/run/s6/services

为适应LAIN的需求,将Dockerfile的CMD写入/etc/services.d/app/run

阶段2

s6-overlay将/etc/services.d 目录的文件复制到s6-svscan运行时目录/var/run/s6/services,然后出发对目录的搜索

 s6-svscanctl -a /var/run/s6/services

阶段3

s6-supervise会监听SIGTERM信号,当接收到该信号后会运行/var/run/s6/services/app/finish

results matching ""

    No results matching ""