在 Linux 中,用戶態進程的“祖先”,都是 PID 號爲 1 的 init 進程。
現在主流的 Linux 發行版中,init 都是 systemd 進程;而其他的用戶態進程,會通過 systemd 來進行管理。
Linux 中的各種進程,除了用戶態進程外,還有大量的內核態線程。那麼,內核態線程又是誰來管理的呢?
實際上,Linux 在啓動過程中,有三個特殊的進程,也就是 PID 號最小的三個進程。
0 號進程爲 idle 進程,這也是系統創建的第一個進程,它在初始化 1 號和 2 號進程後,演變爲空閒任務。當 CPU 上沒有其他任務執行時,就會運行它(swapper->空閒任務,當系統中沒有任務時,perf追蹤可以看到其使用率爲99%)。
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對其進行追蹤分析