在平常的運維工做中,當咱們習慣性的執行ps命令後會看到不少「奇奇怪怪」的進程,而這些進程大部門都是系統的內核進程。不少同窗對之瞭解的甚少,所以今天就爲你們整理一篇入門級的系統進程介紹帖,但願可以幫助你們對操做系統進程的理解。
在平常運維工做中,常常會看到一些奇怪的系統進程佔用資源比較高。並且老是會聽到業務線同窗詢問「xxx這個是啥進程啊?咋開啓了這麼多?」php
而這些系統級的內核進程都是會用中括號括起來的,它們會執行一些系統的輔助功能(如將緩存寫入磁盤);無括號的進程都是用戶們執行的進程(如php、nginx等)。nginx
以下圖所示:緩存
下面就爲你們普及10個比較常見的系統進程:app
kswapd0less
kjournald運維
pdflush異步
kthreaddide
migration函數
watchdogthis
events
kblockd
aio
rpciod
一、kswapd0
系統每過必定時間就會喚醒kswapd,看看內存是否緊張,若是不緊張,則睡眠,在kswapd中,有2個閥值,pages_hige和pages_low,當空閒內存頁的數量低於pages_low的時候,kswapd進程就會掃描內存而且每次釋放出32個free pages,直到free page的數量到達pages_high。
Linux uses kswapd for virtual memory management such that pages that have been recently accessed are kept in memory and less active pages are paged out to disk.(what is a page?)…Linux uses manages memory in units called pages.So,the kswapd process regularly decreases the ages of unreferenced pages…and at the end they are paged out(moved out) to disk
二、kjournald
journal:記錄全部文件系統上的元數據改變,最慢的一種模式。
logs all filesystem data and metadata changes. The slowest of the three ext3 journaling modes, this journaling mode minimizes the chance of losing the changes you have made to any file in an ext3 filesystem.
ordered:默認使用的模式,只記錄文件系統改變的元數據,並在改變以前記錄日誌。
only logs changes to filesystem metadata, but flushes file data updates to disk before making changes to associated filesystem metadata. This is the default ext3 journaling mode.
writeback :最快的一種模式,一樣只記錄修改過的元數據,依賴標準文件系統寫進程將數據寫到硬盤。
only logs changes to filesystem metadata but relies on the standard filesystem write process to write file data changes to disk. This is the fastest ext3 journaling mode.
三、pdflush
pdflush用於將內存中的內容和文件系統進行同步。
好比說:當一個文件在內存中進行修改,pdflush負責將它寫回硬盤。每當內存中的垃圾頁(dirty page)超過10%的時候,pdflush就會將這些頁面備份回硬盤。這個比率是可調節的,經過/etc/sysctl.conf中的 vm.dirty_background_ratio項默認值爲10也能夠。
四、kthreadd
這種內核線程只有一個,它的做用是管理調度其它的內核線程。
它在內核初始化的時候被建立,會循環運行一個叫作kthreadd的函數,該函數的做用是運行kthread_create_list全局鏈表中維護的kthread。能夠調用kthread_create建立一個kthread,它會被加入到kthread_create_list鏈表中,同時kthread_create會weak up kthreadd_task。kthreadd在執行kthread會調用老的接口——kernel_thread運行一個名叫「kthread」的內核線程去運行建立的kthread,被執行過的kthread會從kthread_create_list鏈表中刪除,而且kthreadd會不斷調用scheduler 讓出CPU。這個線程不能關閉。
五、migration
這種內核線程共有32個,從migration/0到migration/31,每一個處理器覈對應一個migration內核線程,主要做用是做爲相應CPU核的遷移進程,用來執行進程遷移操做,內核中的函數是migration_thread()
屬於2.6內核的負載平衡系統,該進程在系統啓動時自動加載(每一個 cpu 一個),並將本身設爲 SCHED_FIFO 的實時進程,而後檢查 runqueue::migration_queue 中是否有請求等待處理,若是沒有,就在 TASK_INTERRUPTIBLE 中休眠,直至被喚醒後再次檢查。migration_thread() 僅僅是一個 CPU 綁定以及 CPU 電源管理等功能的一個接口。這個線程是調度系統的重要組成部分。
六、watchdog
這種內核線程共有32個,從watchdog/0到watchdog/31, 每一個處理器覈對應一個watchdog 內核線程,watchdog用於監視系統的運行,在系統出現故障時自動從新啓動系統,包括一個內核 watchdog module 和一個用戶空間的 watchdog 程序。
在Linux 內核下,watchdog的基本工做原理是:當watchdog啓動後(即/dev/watchdog設備被打開後),若是在某一設定的時間間隔(1分鐘)內/dev/watchdog沒有被執行寫操做,硬件watchdog電路或軟件定時器就會從新啓動系統,每次寫操做會致使從新設定定時器。
七、events
這種內核線程共有32個,從events/0到events/31, 每一個處理器覈對應一個 events內核線程。用來處理內核事件不少軟硬件事件(好比斷電,文件變動)被轉換爲events,並分發給對相應事件感興趣的線程進行響應。
八、kblockd
這種內核線程共有32個,從kblockd/0到kblockd/31,每一個處理器覈對應一個 kblockd 內核線程。用於管理系統的塊設備,它會週期地激活系統內的塊設備驅動。若是擁有塊設備,那麼這些線程就不能被去掉。
九、aio
這種內核線程共有32個,從aio/0到aio/31, 每一個處理器覈對應一個 aio 內核線程, 代替用戶進程管理I/O,用以支持用戶態的AIO(異步I/O),不該該被關閉。
十、rpciod
這種內核線程共有32個,從rpciod/0到rpciod/31, 每一個處理器覈對應一個rpciod內核線程,主要做用是做爲遠過程調用服務的守護進程,用於從客戶端啓動I/O服務,一般啓動NFS服務時要用到它。
進程是操做系統上很是重要的概念,全部系統上面跑的數據都會以進程的類型存在。在 Linux 系統當中:觸發任何一個事件時,系統都會將它定義成爲一個進程,因此,進程是Linux程序的惟一的實現方式。
本文轉載自公衆號「HULK一線技術雜談」
ID:hulktalk