副标题[/!--empirenews.page--]
Go 语言现在的一个主要应用领域就是云原生技术,包括容器(以 Docker 为代表)、Kubernetes、Prometheus 等。后面将写一系列文章来介绍一下云原生技术栈中的关键技术。
过去两年很多大公司的一个主要技术方向就是将应用上云,在这个过程中的一个典型错误用法就是将容器当成虚拟机来使用,将一堆进程启动在一个容器内。但是容器和虚拟机对进程的管理能力是有着巨大差异的。不管在容器中还是虚拟机中都有一个一号进程,虚拟机中是 systemd 进程,容器中是 entrypoint 启动进程,然后所有的其他线程都是一号进程的子进程,或者子进程的子进程,递归下去。这里的主要差异就体现在 systemd 进程对僵尸进程回收的能力。如果你想和更多容器技术专家交流,可以加我微信liyingjiese,备注『加群』。群里每周都有全球各大公司的最佳实践以及行业最新动态。

僵尸进程
说到僵尸进程,这里简单介绍一下 Linux 系统中的进程状态,我们可以通过 ps 或者 top 等命令查看系统中的进程,比如通过 ps aux 在我的 ecs 虚拟机上面得到如下的输出。
- [root@emr-header-1 ~]# ps aux
- USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
- root 1 0.1 0.0 190992 3568 ? Ss Mar16 289:04 /usr/lib/systemd/systemd --switched-root --system --de
- root 2 0.0 0.0 0 0 ? S Mar16 0:05 [kthreadd]
- root 3 0.0 0.0 0 0 ? S Mar16 13:01 [ksoftirqd/0]
- root 5 0.0 0.0 0 0 ? S< Mar16 0:00 [kworker/0:0H]
- root 7 0.0 0.0 0 0 ? S Mar16 14:41 [migration/0]
- root 8 0.0 0.0 0 0 ? S Mar16 0:00 [rcu_bh]
- root 9 0.0 0.0 0 0 ? S Mar16 243:19 [rcu_sched]
- root 10 0.0 0.0 0 0 ? S Mar16 0:50 [watchdog/0]
- root 11 0.0 0.0 0 0 ? S Mar16 0:39 [watchdog/1]
- root 12 0.0 0.0 0 0 ? S Mar16 23:51 [migration/1]
- root 13 0.0 0.0 0 0 ? S Mar16 15:44 [ksoftirqd/1]
- root 15 0.0 0.0 0 0 ? S< Mar16 0:00 [kworker/1:0H]
我们可以看到排在第一位的就是前面说到的 1 号进程 systemd。其中的 STAT 那一列就是进程状态,这里的状态都是和 S 有关的,但是正常还有 R、D、Z 等状态。各个状态的含义简单描述如下:
- S:Interruptible Sleep,中文可以叫做可中断的睡眠状态,表示进程因为等待某个资源或者事件就绪而被系统暂时挂起。当资源或者事件 Ready 的时候,进程轮转到 R 状态。
- R:也就是 Running,有时候也可以指代 Runnable,表示进程正在运行或者等待运行。
- Z:Zombie,也就是僵尸进程。我们知道每个进程都是会占用一定的资源的,比如 pid 等,如果进程结束,资源没有被回收就会变成僵尸进程。
- D:Disk Sleep,也就是 Uninterruptible Sleep,不可中断的睡眠状态,一般是进程在等待 IO 等资源,并且不可中断。D 状态相信很多人在实践中第一次接触就是 ps 卡住。D 状态一般在 IO 等资源就绪之后就会轮转到 R 状态,如果进程处于 D 状态比较久,这个时候往往是 IO 出现问题,解决办法大部分情况是重启机器。
- I:Idle,也就是空闲状态,不可中断的睡眠的内核线程。和 D 状态进程的主要区别是可能实际上不会造成负载升高。
(编辑:好传媒网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|