10個不得不知道的”系統程序”
在日常的運維工作中,當我們習慣性的執行ps命令後會看到很多“奇奇怪怪”的程序,而這些程序大部門都是系統的核心程序。很多同學對之瞭解的甚少,因此今天就為大家整理一篇入門級的系統程序介紹帖,希望能夠幫助大家對作業系統程序的理解。
前言
在日常運維工作中,經常會看到一些奇怪的系統程序佔用資源比較高。而且總是會聽到業務線同學詢問“xxx這個是啥程序啊?咋開啟了這麼多?”
而這些系統級的核心程序都是會用中括號括起來的,它們會執行一些系統的輔助功能(如將快取寫入磁碟);無括號的程序都是使用者們執行的程序(如php、nginx等)。
如下圖所示:
下面就為大家普及10個比較常見的系統程序:
- kswapd0
- kjournald
- pdflush
- kthreadd
- migration
- watchdog
- 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一線技術雜談