Linux內核線程記錄

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章