在 Linux 中,用户态进程的“祖先”,都是 PID 号为 1 的 init 进程。app
如今主流的 Linux 发行版中,init 都是 systemd 进程;而其余的用户态进程,会经过 systemd 来进行管理。负载均衡
Linux 中的各类进程,除了用户态进程外,还有大量的内核态线程。那么,内核态线程又是谁来管理的呢?ide
实际上,Linux 在启动过程当中,有三个特殊的进程,也就是 PID 号最小的三个进程。性能
0 号进程为 idle 进程,这也是系统建立的第一个进程,它在初始化 1 号和 2 号进程后,演变为空闲任务。当 CPU 上没有其余任务执行时,就会运行它(swapper->空闲任务,当系统中没有任务时,perf追踪能够看到其使用率为99%)。spa
1 号进程为 init 进程,一般是 systemd 进程,在用户态运行,用来管理其余用户态进程。线程
2 号进程为 kthreadd 进程,在内核态运行,用来管理内核线程。日志
经常使用的内核线程:队列
kswapd0:根据页低阈值(min_free_bytes)的配置,按期回收内存进程
ksoftirqd:处理软中断的内核线程,每一个CPU都有一个,当看到此线程对CPU使用率较高时,意味着系统在进行大理的软中断操做,性能会有问题内存
kworker:用于执行内核工做队列,分为绑定 CPU (名称格式为 kworker/CPU86330)和未绑定 CPU(名称格式为 kworker/uPOOL86330)两类。
migration:在负载均衡过程当中,把进程迁移到 CPU 上。每一个 CPU 都有一个 migration 内核线程。
jdb2/sda1-8:jbd 是 Journaling Block Device 的缩写,用来为文件系统提供日志功能,以保证数据的完整性;名称中的 sda1-8,表示磁盘分区名称和设备号。每一个使用了 ext4 文件系统的磁盘分区,都会有一个 jbd2 内核线程。
pdflush:用于将内存中的脏页(被修改过,但还未写入磁盘的文件页)写入磁盘(已经在 3.10 中合并入了 kworker 中)。
注:当内核线程使用CPU较高时,能够使用perf对其进行追踪分析