理想狀況下,您應該明白在您的系統中運行的每個進程。要得到全部進程的列表,能夠執行命令 ps -ef(POSIX 風格)或 ps ax(BSD 風格)。進程名有方括號的是內核級的進程,執行輔助功能(好比將緩存寫入到磁盤);全部其餘進程都是使用者進程。您會注意到,就算是在您新安裝的(最小化的)系統中,也會有不少進程在運行。熟悉它們,並把它們記錄到文檔中。linux
kswapd0,kjournald,pdflush、kblockedios
1.kswapd0vim
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緩存
系統每過必定時間就會喚醒kswapd,看看內存是否緊張,若是不緊張,則睡眠,在kswapd中,有2個閥值,pages_hige和pages_low,當空閒內存頁的數量低於pages_low的時候,kswapd進程就會掃描內存而且每次釋放出32個free pages,直到free page的數量到達pages_high.服務器
2.kjournald網絡
EXT3文件系統的日誌進程,具備3種模式:數據結構
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.(記錄全部文件系統上的元數據改變,最慢的一種模式,)less
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.(默認使用的模式,只記錄文件系統改變的元數據,並在改變以前記錄日誌)ssh
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.(最快的一種模式,一樣只記錄修改過的元數據,依賴標準文件系統寫進程將數據寫到硬盤)異步
修改模式EXT3的工做模式;
vim /etc/fstab
/dev/hda5 /opt ext3 data=writeback 1 0
詳細介紹:http://www.linuxplanet.com/linuxplanet/reports/4136/5/
3、pdflush
pdflush用於將內存中的內容和文件系統進行同步,好比說,當一個文件在內存中進行修改,pdflush負責將它寫回硬盤.每當內存中的垃圾頁(dirty page)超過10%的時候,pdflush就會將這些頁面備份回硬盤.這個比率是可調節的,經過/etc/sysctl.conf中的 vm.dirty_background_ratio項 默認值爲10 也能夠
cat /proc/sys/vm/dirty_background_ratio 查看當前的值
4、kblockd —- 塊讀寫子系統
5、Migration 進程遷移
什麼是進程遷移?
進程遷移就是將一個進程從當前位置移動到指定的處理器上。它的基本思想是在進程執行過程當中移動它,使得它在另外一個計算機上繼續存取它的全部資源並繼續運行,並且沒必要知道運行進程或任何與其它相互做用的進程的知識就能夠啓動進程遷移操做,這意味着遷移是透明的。
進程遷移的好處
進程遷移是支持負載平衡和高容錯性的一種很是有效的手段。對一系列的負載平衡策略的研究代表進程遷移是實現負載平衡的基礎,進程遷移在不少方面具備適用性:
動態負載平衡:將進程遷移到負載輕或空閒的節點上,充分利用可用資源,經過減小節點間負載的差別來全面提升性能。
容錯性和高可用性:某節點出現故障時,經過將進程遷移到其它節點繼續恢復運行,這將極大的提升系統的可靠性和可用性。在某些關鍵性應用中,這一點尤其重要。
並行文件IO:將進程遷移到文件服務器上進行IO,而不是經過傳統的從文件服務器經過網絡將數據傳輸給進程。對於那些需向文件服務器請求大量數據的進程,這將有效的減小了通信量,極大的提升效率。
充分利用特殊資源:進程能夠經過遷移來利用某節點上獨特的硬件或軟件能力。
內存導引(Memory Ushering)機制:當一個節點耗盡它的主存時,Memory Ushering機制將容許進程遷移到其它擁有空閒內存的節點,而不是讓該節點頻繁地進行分頁或和外存進行交換。這種方式適合於負載較爲均衡,但內存使用存在差別或內存物理配置存在差別的系統。
進程遷移的實現角度
進程遷移的實現複雜性及對OS的依賴性阻礙了進程遷移的普遍使用 ,尤爲是對透明的進程遷移實現。根據應用的級別,進程遷移能夠做爲OS的一部分、用戶空間、系統環境的一部分或者成爲應用程序的一部分。
用戶級遷移:用戶級實現較爲簡單,軟件開發和維護也較爲容易,所以,現有的不少系統都是採用用戶級實現,如Condor和Utopia。但因爲在用戶級沒法得到Kernel的全部狀態,所以,對於某類進程,沒法進行遷移。另外,因爲Kernel空間和User空間之間存在着壁壘,打破這個邊界得到 Kernel提供的服務須要巨大的開銷。所以,用戶級實現效率遠遠低於內核級實現。
應用級遷移:應用級遷移實現較爲簡單,可移植性好,可是須要了解應用程序語義並可能需對應用程序進行修改或重編譯,透明性較差,這方面的系統有Freedman、Skordos等。
內核級遷移:基於內核的實現能夠充分利用OS提供的功能,全面的獲取進程和OS狀態,所以實現效率較高,可以爲用戶提供很好的透明性。可是因爲須要對OS進行修改,實現較爲複雜。這方面的典型系統有MOSIX和 Sprite系統。
進程狀態
進程遷移的主要工做就在於提取進程狀態,而後在目的節點根據進程狀態再生該進程。在現實中,一個進程擁有不少狀態,而且隨着操做系統的演化,進程狀態也愈來愈多樣。通常來講,一個進程的狀態能夠分爲如下幾類:
進程執行狀態(Execution State):表示當前運行進程的處理器狀態,和機器高度相關。包括內核在上下文切換時保存和恢復的信息,如通用和浮點寄存器值、棧指針、條件碼等。
進程控制(Process Control):操做系統系統用來控制進程的全部信,通常包括進程優先級、進程標識,父進程標識等。一旦系統編排了進程控制信息,進程遷移系統必須凍結該進程的運行。
進程Memory狀態和進程地址空間:包括進程的全部虛存信息,進程數據和進程的堆棧信息等,是進程狀態的最主要的一部分。
進程的消息(Message)狀態:包括進程緩衝的消息和鏈接(Link)的控制信息。進程遷移中通信鏈接的保持以及遷移後鏈接的恢復是進程遷移中一項較有挑戰意義的問題。
文件狀態:進程的文件狀態包括文件描述符和文件緩衝快。保持文件的Cache一致性和進程間文件同步訪問也是進程遷移機制須要着重考慮的。
因爲在同構的環境下(相同或兼容的機器體系結構和指令集以及操做系統)提取和恢復進程狀態相對容易,現有的工做大可能是以同構環境爲前提的。不過,愈來愈多的人開始研究異構環境下的進程遷移機制,如TUI 系統。
#ps 相關進程 (k開頭的基本上都是內核驅動,不建議殺掉)
PID TTY STAT TIME COMMAND
1 ? Ss 0:00 init [3] (引導用戶空間服務,管理孤兒線程,不能殺)
2 ? S 0:00 [migration/0]
3 ? SN 0:00 [ksoftirqd/0] (內核調度/管理第0個CPU軟中斷的守護進程,不能殺)
4 ? S 0:00 [watchdog/0] (系統監控應用,可以在系統出現故障時自動從新啓動系統。不能殺)
5 ? S 0:00 [migration/1] (管理多核心(包括HypterThreading衍生的那個不大管用的、線程在各核心的遷移,不能殺)
6 ? SN 0:00 [ksoftirqd/1] (內核調度/管理第1個CPU軟中斷的守護進程,不能殺)
7 ? S 0:00 [watchdog/1] (系統監控應用,可以在系統出現故障時自動從新啓動系統。不能殺)
8 ? S< 0:00 [events/0] (處理內核事件守護進程,不能殺)
9 ? S< 0:00 [events/1] (處理內核事件守護進程,不能殺)
10 ? S< 0:00 [khelper] (沒查出來,感受不能殺)
11 ? S< 0:00 [kthread] (父內核線程,不能殺)
15 ? S< 0:00 \_ [kblockd/0] (管理磁盤塊讀寫,不能殺)
16 ? S< 0:00 \_ [kblockd/1] (管理磁盤塊讀寫,不能殺)
17 ? S< 0:00 \_ [kacpid] (內核電源管理,不能殺)
120 ? S< 0:00 \_ [cqueue/0] (隊列數據結構,不能殺)
121 ? S< 0:00 \_ [cqueue/1] (隊列數據結構,不能殺)
124 ? S< 0:00 \_ [khubd] (內核的usb hub,不能殺)
126 ? S< 0:00 \_ [kseriod] 內核線程
193 ? S 0:00 \_ [pdflush] (pdflush內核線程池是Linux爲了回寫文件系統數據而建立的進程,不能殺)
194 ? S 0:00 \_ [pdflush] (pdflush內核線程池是Linux爲了回寫文件系統數據而建立的進程,不能殺)
195 ? S< 0:00 \_ [kswapd0] (內存回收,確保系統空閒物理內存的數量在一個合適的範圍,不能殺)
196 ? S< 0:00 \_ [aio/0] (代替用戶進程管理io,不能殺)
197 ? S< 0:00 \_ [aio/1] (代替用戶進程管理io,不能殺)
354 ? S< 0:00 \_ [kpsmoused] (內核鼠標支持,能夠殺掉)
387 ? S< 0:00 \_ [ata/0] (ata硬盤驅動,不能殺)
388 ? S< 0:00 \_ [ata/1] (ata硬盤驅動,不能殺)
389 ? S< 0:00 \_ [ata_aux] (ata硬盤驅動,不能殺)
393 ? S< 0:00 \_ [scsi_eh_0] (scsi設備,不建議殺)
394 ? S< 0:00 \_ [scsi_eh_1] (scsi設備,不建議殺)
395 ? S< 0:00 \_ [scsi_eh_2] (scsi設備,不建議殺)
396 ? S< 0:00 \_ [scsi_eh_3] (scsi設備,不建議殺)
432 ? S< 0:00 \_ [kauditd] (內核審覈守護進程,不能殺)
1160 ? S< 0:00 \_ [hda_codec]
1418 ? S< 0:00 \_ [kmirrord] (內核守護進程控制和監視鏡像模塊,不能殺)
400 ? S< 0:00 \_ [kjournald]
1442 ? S< 0:00 \_ [kjournald]
1444 ? S< 0:00 \_ [kjournald]
1446 ? S< 0:00 \_ [kjournald] (kjournald Ext3文件系統的日誌管理,一般每一個mount_的 Ext3分區會有一個 kjournald看管,各分區的日誌
是獨立的,不能殺)
466 ? S<s 0:00 /sbin/udevd -d (udevd 支持用戶態設備操做,不能殺)
1825 ? Ss 0:00 syslogd -m 0 (syslogd 系統日誌進程,不能殺)
1828 ? Ss 0:00 klogd -x (klogd 從內核信息緩衝區獲取打印信息,不能殺)
1844 ? Ss 0:00 irqbalance (多個CPU之間均衡分配硬件中斷,能夠關閉,但不建議)
1864 ? Ss 0:00 /usr/sbin/sshd (sshd守護進程,不能殺)
1881 ? Ss 0:00 crond (執行定時任務,不能殺)
1888 tty1 Ss+ 0:00 /sbin/mingetty tty1 (mingetty 等待用戶從tty登陸,能夠殺)
1892 tty2 Ss+ 0:00 /sbin/mingetty tty2 (mingetty 等待用戶從tty登陸,能夠殺)
1893 tty3 Ss+ 0:00 /sbin/mingetty tty3 (mingetty 等待用戶從tty登陸,能夠殺)
剛剛開機以後,使用ps查看系統內的內核線程,主要狀況以下:
共發現有232個內核線程存在,它們分別是:
(1)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。這個線程不能關閉。
(2)migration:這種內核線程共有32個,從migration/0到migration/31,每一個處理器覈對應一個migration內核線程,主要做用是做爲相應CPU核的遷移進程,用來執行進程遷移操做,內核中的函數是migration_thread()。屬於2.6內核的負載平衡系統,該進程在系統啓動時自動加載(每一個 cpu 一個),並將本身設爲 SCHED_FIFO 的實時進程,而後檢查 runqueue::migration_queue 中是否有請求等待處理,若是沒有,就在 TASK_INTERRUPTIBLE 中休眠,直至被喚醒後再次檢查。migration_queue僅在set_cpu_allowed() 中添加,當進程(好比經過 APM 關閉某 CPU 時)調用set_cpu_allowed()改變當前可用 cpu,從而使某進程不適於繼續在當前 cpu 上運行時,就會構造一個遷移請求數據結構 migration_req_t,將其植入進程所在 cpu 就緒隊列的migration_queue 中,而後喚醒該就緒隊列的遷移 daemon(記錄在runqueue::migration_thread 屬性中),將該進程遷移到合適的cpu上去在目前的實現中,目的 cpu 的選擇和負載無關,而是"any_online_cpu(req->task->cpus_allowed)",也就是按 CPU 編號順序的第一個 allowed 的CPU。因此,和 load_balance() 與調度器、負載平衡策略密切相關不一樣,migration_thread() 應該說僅僅是一個 CPU 綁定以及 CPU 電源管理等功能的一個接口。這個線程是調度系統的重要組成部分,也不能被關閉。
(3)watchdog:這種內核線程共有32個,從watchdog/0到watchdog/31, 每一個處理器覈對應一個watchdog 內核線程,watchdog用於監視系統的運行,在系統出現故障時自動從新啓動系統,包括一個內核 watchdog module 和一個用戶空間的 watchdog 程序。在Linux 內核下, watchdog的基本工做原理是:當watchdog啓動後(即/dev/watchdog設備被打開後),若是在某一設定的時間間隔(1分鐘)內/dev/watchdog沒有被執行寫操做, 硬件watchdog電路或軟件定時器就會從新啓動系統,每次寫操做會致使從新設定定時器。/dev/watchdog是一個主設備號爲10, 從設備號130的字符設備節點。 Linux內核不只爲各類不一樣類型的watchdog硬件電路提供了驅動,還提供了一個基於定時器的純軟件watchdog驅動。若是不須要這種故障處理機制,或者有相應的替代方案,能夠在menuconfig的
Device Drivers —>
Watchdog Timer Support
處取消watchdog功能。
(4)events:這種內核線程共有32個,從events/0到events/31, 每一個處理器覈對應一個 events內核線程。用來處理內核事件不少軟硬件事件(好比斷電,文件變動)被轉換爲events,並分發給對相應事件感興趣的線程進行響應。用來處理內核事件的重要線程,不能被去掉
(5)khelper:這種內核線程只有一個,主要做用是指定用戶空間的程序路徑和環境變量, 最終運行指定的user space的程序,屬於關鍵線程,不能關閉
(6)kblockd:這種內核線程共有32個,從kblockd/0到kblockd/31, 每一個處理器覈對應一個 kblockd 內核線程。用於管理系統的塊設備,它會週期地激活系統內的塊設備驅動。若是擁有塊設備,那麼這些線程就不能被去掉,要是想去掉,須要在.config中直接將CONFIG_BLOCK設成n,同時在menuconfig中取消
Device Drivers —>
Block devices
(7)kseriod:這種內核線程只有一個,主要做用是管理Serio總線上的設備的各類事件,Serio是一種虛擬總線,是Serial I/O的輸寫,表示串行的輸入輸出設備。對應內核中的serio_thread函數,流程大體是這樣的:調用serio_get_event()從鏈表中取出struct serio_event元素,而後對這個元素的事件類型作不一樣的時候,處理完了以後,調用serio_remove_duplicate_events()在鏈表中刪除相同請求的event。例如:若是要註冊新的serio設備,它產生的事件類型是SERIO_REGISTER_PORT,而後流程會轉入serio_add_port()。使用Serio總線的主要是標準AT鍵盤、PS/2鼠標、串口鼠標、Sun鍵盤,以及一些遊戲手柄,不過因爲I2C依賴於Serio,因此不關閉I2C就沒法關閉Serio,menuconfig中SerialI/O的開關位於
Device Driver —>
Inputdevice support
HardwareI/O ports
SerialI/O support
(8)pdflush:這種內核線程共有兩個,線程名都是pdflush,主要做用是回寫內存中的髒頁,回收髒頁佔據的空間。因爲頁高速緩存的緩存做用,寫操做實際上會被延遲。當頁高速緩存中的數據比後臺存儲的數據更新時,那麼該數據就被稱作髒數據。在內存中累積起來的髒頁最終必須被寫回。在如下兩種狀況發生時,髒頁被寫回:
1.當空閒內存低於一個特定的閾值時,內核必須將髒頁寫回磁盤,以便釋放內存。
2.當髒頁在內存中駐留時間超過一個特定的閾值時,內核必須將超時的髒頁寫回磁盤,以確保髒頁不會無限期地駐留在內存中。
對於第一個目標,pdflush線程在系統中的空閒內存低於一個特定的閾值時,將髒頁刷新回磁盤。該後臺回寫例程的目的在於在可用物理 內存太低時,釋放髒頁以從新得到內存。特定的內存閾值能夠經過dirty_background_ratiosysctl系統調用設置。當空閒內存比閾值:dirty_ background_ratio還低時,內核便會調用函數wakeup_bdflush()喚醒一個pdflush線程,隨後pdflush線程進一步 調用函數background_writeout()開始將髒頁寫回磁盤。函數background_ writeout()須要一個長整型參數,該參數指定試圖寫回的頁面數目。函數background_writeout()會連續地寫出數據,直到知足如下兩個條件:
1. 已經有指定的最小數目的頁被寫出到磁盤。
2. 空閒內存數已經回升,超過了閾值dirty_background_ratio。
上述條件確保了pdflush操做能夠減輕系統中內存不足的壓力。回寫操做不會在達到這兩個條件前中止,除非pdflush寫回了全部的髒頁,沒有剩下的髒頁可再被寫回了。
對於第二個目標,pdflush後臺例程會被週期性喚醒(和空閒內存是否太低無關),將那些在內存中駐留時間過長的髒頁寫出,確保內存中不會有長期存在的髒頁。若是系統發生崩潰,因爲內存處於混亂之中,因此那些在內存中還沒來得及寫回磁盤 的髒頁就會丟失,因此週期性同步頁高速緩存和磁盤很是重要。在系統啓動時,內核初始化一個定時器,讓它週期地喚醒pdflush線程,隨後使其運行函數 wb_kupdate()。該函數將把全部駐留時間超過百分之dirty_expire_centisecs秒的髒頁寫回。而後定時器將再次被初始化爲百 分之dirty_expire_ centisecs秒後喚醒pdflush線程。總而言之,pdflush線程週期地被喚醒而且把超過特按期限的髒頁寫回磁盤。
系統管理員能夠在/proc/sys/vm中設置回寫相關的參數,也能夠經過sysctl系統調用設置它們
屬於核心的內存管理線程,這個線程也不能被關閉
(9)kswapd0:這種內核線程只有一個,主要做用是用來回收內存。在kswapd中,有2個閥值,pages_hige和pages_low。當空閒內存頁的數量低於pages_low的時候,kswapd進程就會掃描內存而且每次釋放出32個 free pages,直到freepage的數量到達pages_high。具體回收內存有以下原則:
1. 若是頁未經更改就將該頁放入空閒隊列;
2. 若是頁已經更改而且是可備份迴文件系統的,就理解將內存頁的內容寫回磁盤;
3. 若是頁已經更改可是沒有任何磁盤上的備份,就將其寫入swap分區。
一樣,屬於核心的內存管理線程,這個線程也不能被關閉
(10)aio:這種內核線程共有32個,從aio/0到aio/31, 每一個處理器覈對應一個 aio 內核線程, 代替用戶進程管理I/O,用以支持用戶態的AIO(異步I/O),不該該被關閉。
(11)unionfs_siod: 這種內核線程共有32個,可是名稱都是 unionfs_siod/,每一個處理器覈對應一個 unionfs_siod 內核線程
(12)nfsiod:這種內核線程只有一個,主要做用是爲nfs提供高效的緩衝機制,從而改善nfs文件系統的性能,若是不需nfs,能夠取消這一線程,取消這一線程的方法爲menuconfig中取消
File systems —>
Network File Systems
(13)rpciod:這種內核線程共有32個,從rpciod/0到rpciod/31, 每一個處理器覈對應一個rpciod內核線程,主要做用是做爲遠過程調用服務的守護進程,用於從客戶端啓動I/O服務,一般啓動NFS服務時要用到它,想要關閉它,須要在.config中把CONFIG_SUNRPC, CONFIG_SUNRPC_GSS, CONFIG_SUNRPC_XPRT_RDMA的值設成n
(14)kpsmoused:這種內核線程只有一個,主要做用是支持ps/2接口的鼠標驅動。如要沒有鼠標,能夠取消,取消方法是menuconfig中取消
DeviceDrivers —>
Input device support
Mice