在 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對其進行追蹤分析