進程的基本概念:html
進程能夠理解成運行中的程序的一個副本。程序經過內核調度運行起來成爲一個進程,並由內核負責調度其運行於CPU之上以執行程序中的一部分或所有代碼,所以進程是運行中的動態實體。而程序是放在文件系統上的一個文件,只要不刪除將永久存在,而進程是有生命週期的,每一個進程都有建立、運行、結束這一時間段。同一個程序的代碼能夠被複制多份並由內核調度成多個進程運行,所以可稱爲運行中的程序的一個副本。node
進程調度:算法
進程管理中最重要的一部分是進程調度,可理解成對各個進程運行時的各類細節的安排和管理。當文件系統上一個可執行程序文件被觸發並經過內核調度運行爲一個進程時,進程中的指令、數據以及進程相關的屬性信息(例如進程的屬主、屬組、PID等)被內核加載至內存空間中,而指令須要運行在CPU之上,此時CPU中的寄存器可記錄正在運行中的指令的狀態,例如正在取指令、執行指令、加工數據、取數據...,其中指令指針寄存器IP用於存放下一條要執行的指令的內存地址。shell
可是須要CPU運行的有衆多進程而不僅有一個進程,所以內核將CPU切分爲多個時間片,並負責將這多個時間片按照優先級分配給各個進程。當一個進程在某一時間片運行與CPU上時,這個時間片就是該進程容許運行的時間,一旦過了這個時間片,該進程將被中斷,這時內核把這個進程的中間狀態信息按照固定的格式存儲於內存中,從新調度另外一個進程運行於CPU之上,接着,CPU中用於存放進程狀態相關數據將被下一個進程所覆蓋。其中,將進程的相關狀態信息存儲於內存中這一過程稱爲保存現場,而Linux內核存儲進程狀態信息是存儲進具備固定格式的結構體的,這個結構體就是task struct,多個任務(進程)的結構體(task struct)組成鏈表結構(task list),根據組成方式的不一樣有單向鏈表結構、雙向鏈表結構、循環鏈表結構、雙向循環列表結構等。打個比方,咱們盛酒水須要用罈子,而這個固定結構的容器--罈子,就是結構體,總不能用地板裝酒水吧?而這些罈子按照必定的組織排列起來的結構可類比爲鏈表結構。apache
須要注意的是,當CPU上的某一時間片結束後,內核會調度另外一個進程運行於CPU之上,而問題是內核該如何從衆多等待運行的進程中挑選出一個進程並使其運行於CPU上呢?爲了在調度進程時明確哪一個進程優先執行,哪一個進程後執行,須要用進程優先級來作判斷。進程優先級範圍是0-139,分爲實時優先級(1-99)和靜態優先級(100-139),其中實時優先級與內核執行的系統管理操做有關,用戶不可對實時優先級進行調整;而用戶能夠調整的是靜態優先級(可經過nice值進行調整),普通用戶只可調低不可調高,只有系統管理員纔可隨意調整。所以,內核是將進程優先級來做爲調度進程次序的依據的,但由此內核首先必須知道各個進程的屬性(優先級),所以在每次調度進程執行時總得遍歷內存上全部結構體中的信息,這將會消耗掉大量的時間。
編程
Linux的2.6版本內核經過精巧的設計解決了這一問題:將全部進程排成140個隊列,每一個隊列對應一個優先級,每一個進程歸屬至其優先級的隊列中。而每次內核調度進程執行時只需掃描這140個隊列的首部,並從這些隊列中挑選出一個進程出來執行便可。這樣一來,不管進程有多少個,內核都是經過掃描140個隊列首部來實現快速明確調度哪一個進程執行於CPU上,所以調度時間不會隨進程數量而改變。內核的這種工做模式基於的算法符合程序界的Big O中的O(1)理想模型,即意味着隨着算法複雜度的增長,算法解決問題(這裏是進程調度速度問題)的時間不會變化。
小程序
但這樣一來又有一個問題,當一個進程在一個時間片執行完以後應該如何歸隊呢?在Linux中,進程按照優先級排出隊列,而每一個隊列內部又分爲運行隊列和過時隊列,實際上內核就是經過掃描各個運行隊列首部來作判斷的,而進程在CPU執行以後返回過時隊列中,而運行隊列繼續等待內核的調度;一旦運行隊列中的進程所有執行完畢(每一個進程都在CPU上輪流執行了一遍),這時運行隊列將轉變爲過時隊列,而原來的過時隊列則轉變爲運行隊列等待內核再次調度,重複上述邏輯。vim
進程建立:瀏覽器
主機開機後,首先將內核加載至內存中,在CPU上開始運行內核代碼。接着由進程開始建立初始化進程init,並將用戶空間的管理事務交給init這個進程管理。接着init會建立出子進程,而這些子進程能夠分別建立出各自的子進程,所以除了init進程以外,其餘的進程都由其父進程建立;init進程可視爲內核的代理,負責管理用戶空間進程的建立和關閉,並向內核提交相應的請求,但init不能代替內核執行特權指令。緩存
那麼,在什麼狀況下父進程須要建立子進程呢?當一個父進程須要藉助於某些程序完成複雜任務時,一般須要調用系統上某個可執行程序文件,將其建立爲進程,而建立子進程須要經過fork()這個系統調用接口向內核申請提交要建立的進程,然後再經過clone()接口將自身的數據複製一份給子進程;須要注意的是,此時父進程和子進程在內存中佔據相同的空間,而一旦子進程須要修改數據時,父進程會從新開闢一個相同的內存空間給子進程,這是父進程和子進程不在佔據同一內存空間,這種機制稱爲寫時複製機制(CoW)。
當子進程完成複雜任務時,其父進程會關閉該子進程,內核將內存收回。
init程序在不一樣版本的體現: CentOS 5: SysV init,經典版本,缺陷是在系統啓動和引導時,它建立各子進程是經過寫腳本方式藉助於 shell來實現的,由於shell腳本是大量命令的堆砌,每一個命令運行時會建立進程,所以每啓動一 次就須要建立上千個進程,所以執行速度很是慢。 CentOS 6: upstart,基於dbus方式進行通訊,同SysV init是經過運行不少命令建立不少進程來完成的,但 不一樣的是upstart可以並行啓動具備關聯性的服務程序,實現多線建立進程,若是CPU有多個時會 快不少,而SysV init僅能以串行方式實現啓動程序。 CentOS 7: systemd,以一個程序完成整個系統的啓動和引導,並且須要啓動的進程總數僅有10個左右,所以 系統啓動和引導很是快。CentOS7上啓動或關閉服務程序時須要經過systemctl實現,由於這些服 務統一由systemd控制; #不一樣版本的init程序文件名都爲init。
進程內存:
承接上述,當內核運行起來以後,會佔據必定的內存空間,例如對於Linux來說通常是1G。其餘進程運行起來以後,內核會將內存按空間分紅多片分配給各個進程使用,這裏的每一個「片」指的是頁框(page frame),頁框就是用來存儲頁面數據(內存進程信息)的,一個頁框就是4K大小的內存空間塊。而將真實的物理內存空間連續地分配給各進程使用明顯不合適,由於每每空閒的內存空間是離散分佈的,並且各個進程在運行過程當中會產生各類中間數據,這也會致使進程佔據的內存空間加大。所以,內核將底層的物理內存上的空閒的碎片(頁框)收集起來,併爲上層運行的進程虛擬出連續的內存空間,這個虛擬的內存地址也稱爲邏輯地址,讓每一個進程「覺得」其佔據的內存空間是連續分佈的,這個連續的邏輯地址稱爲線性地址空間。內核會爲每一個進程虛擬出一個「假象」,即主機上只運行兩個程序:內核和進程本身,而且「覺得」線性地址空間中除了1G內存分配給內核使用,其他的內存空間都可由進程本身使用。事實上,進程真正只用到一小部份內存空間,並映射到真實的物理內存上連續或離散的內存空間。邏輯地址和物理地址之間映射關係則存儲於task struct。當進程執行時,CPU中有專門用於將邏輯地址轉換爲物理內存地址的電路,即內存管理單元(MMU, Memory Management Unit),所以須要內核將內存的映射關係加載至MMU中。
當進程被分配好內存後,其指令、數據以及進程相關的屬性信息會加載至內存中,在內存低地址的地方存放指令(code),而數據能夠由變量等數據結構組織存放於內存中,固然也能夠是普通數據;進程還會將一部分空間做爲堆(heap)內存和棧(stack)內存;當進程運行的中間數據增長時,或者須要加載磁盤上更多數據至內存時,存放於堆內存和棧內存中的數據量增大,堆內存空間向棧頂的方向擴展,而棧內存空間向堆的方向擴展;一旦二者在擴展時相遇,則說明物理內存空間不足;這時交換空間(swap)就出場了,swap可經過近期最少使用算法(LRU, Least Recently Used)掃描出內存上內存上最近不經常使用的數據,將其暫存於swap中,而騰挪出來的內存空間可供進程使用。
固然,並不是全部內存空間中的數據均可交換至swap中,關鍵性數據(如程序指令code)就不可交換,但非關鍵性數據(例如程序中的一些不經常使用數據data);咱們把不能用於交換的內存空間稱爲常駐內存集,而可以交換的內存空間稱爲虛擬內存集。不過,若是交換了內存空間,那麼線性地址空間中映射的物理內存空間地址也會發生改變,所以當進程須要從新訪問被交換至磁盤上的swap或加載磁盤上其餘空間的數據至內存時,須要先請求內核調用,內核將磁盤上的數據先加載至內核內存中,再複製一份給進程內存。而且,當進程在CPU上執行時須要更新MMU上的映射關係。
進程間通訊:
雖然說進程「覺得」主機上只運行內核和進程本身,但進程間是能夠經過IPC(Inter-Process Communication)技術實現通訊的。而進程間通訊在同一主機上和不一樣主機上是各不相同的。
IPC(Inter-Process Communication):
同一主機上:
signal:經過發送信號方式通訊; shm:經過共享內存方式通訊; semerphor:旗語,經過相似「打手勢」方式通訊;
不一樣主機上上:
rpc:remote procecure call,即遠程過程調用,進程經過調用遠程主機上的庫函數或數據加工處理 的結果實現通訊;rpc是基於socket實現,但比socket更爲抽象的一種通訊方式; socket:經過進程監聽的方式實現通訊,通訊雙方事先須要創建虛鏈路(tcp鏈接);在用戶空間表現爲 socket文件,雙方主機上的socket文件都保存本地主機的IP/Port以及對方主機的IP/Port,一方用戶 可經過向socket文件寫數據,另外一方用戶則可經過讀取socket文件獲取數據;
進程類型:
根據是否與終端相關分類:
守護進程:在系統引導過程當中啓動的進程,跟終端無關; 前臺進程:經過終端啓動的進程,跟終端相關; #注意:也能夠把在前臺啓動的進程送日後臺,以守護模式運行;
根據進程佔用CPU多仍是IO多分類:
CPU-bound:通常非交互式進程屬於CPU密集型; IO-bound:通常交互式進程屬於IO密集型;IO密集型進程的優先級應比CPU密集型進程高; #根據Linux哲學思想之一:程序啓動以後應儘可能避免與用戶交互,可知CPU-bound這一類進程應該多 分配一些CPU資源。
進程狀態:
(1)運行態:running; (2)就緒態:ready,能夠運行但沒在CPU上運行;也能夠稱爲睡眠態; (3)睡眠態:分爲可中斷睡眠和不可中斷睡眠; 可中斷睡眠:interruptable,任什麼時候候均可喚醒並運行; 不可中斷睡眠:uninterruptable,例如等待IO過程; (4)中止態:stopped,即暫停於內存中,不會別調度,除非手動啓動之; (5)僵死態:zombie,子進程運行結束以後須要等待其父進程關閉,但若其父進程意外事先關閉,則 子進程會一直等待下去,此時該子進程即爲殭屍進程,或者說處於僵死態; #等待IO過程: 當進程執行時須要用到的數據不在內存中時,須要向內核發起申請(經過系統調用接口,進程沒法直接 訪問硬件),內核將磁盤上的數據先加載至內核內存中,再將內核內存中加載的數據複製一份給進程內 存;
線程的基本概念:
通常來說,每一個程序運行時只能有一個執行流;而若是程序內部有不少代碼須要執行而且這些代碼彼此之間實現的功能又比較獨立,爲了讓程序執行速度更快,則可經過並行編程的模式將程序開發成能夠互相獨立而且能單獨執行的執行流,而這個執行流就是線程;線程是進程的子單位。當有多個CPU時,程序啓動後建立出多個並行執行的線程(執行流),這些線程可分別運行於不一樣顆CPU之上。不過,當主機只有一個CPU時,將進程分紅多個線程執行反而會下降運行速度,由於內核在切換調度進程(線程)時會消耗不少CPU時間。
關於服務類程序:
對於Linux來說,基本是經過各個具備簡單功能的小程序組合起來完成複雜任務的,所以在Linux上進程都是輕量級的,和線程幾乎沒差異。雖然如今不少服務類程序都是基於並行編程模式編寫的,但當服務器接收到的請求過多時響應速度仍然會很是慢,所以如今編程時可經過精巧的設計,使一個進程能同時響應多個進程。
做爲一名Linux運維人員,須要有鑑定當前系統的運行狀態、資源的消耗狀況、進程啓動的數量和模式等,例如當用戶網頁打開速度慢時,咱們須要查看當前系統上運行了哪些進程、是否有咱們指望運行的進程、指望運行的這個進程佔據了CPU和內存多大百分比、是否要調整進程的優先級、以及是否把CPU和內存資源佔滿......對於較大型的服務類程序,例如Java編寫的程序比較吃內存,經常須要運維人員查看jvm虛擬機運行是否正常、是否要調整其垃圾回收策略、是否其內存資源使用的上限或下限、是否要再啓動一個jvm進程來實現並行響應......總之,對於運維人員來說,具備鑑定當前系統上的運行狀態的能力很是重要,由於運維基本都是服務,而服務是經過進程來提供的。
Linux系統上的進程查看及管理工具:pstree, ps, pidof, pgrep, top, htop, glances, pmap, vmstat, dstat, kill, pkill, job, bg, fg, nohup, nice, renice, killall, ...
pstree命令:
display a tree of processes
用於顯示進程樹。
示例:
在CentOS 6上顯示進程樹:
[root@osyunwei ~]# pstree init─┬─NetworkManager ├─abrtd ├─acpid ├─atd ├─auditd───{auditd} ├─automount───4*[{automount}] ├─bluetoothd ├─certmonger ├─console-kit-dae───63*[{console-kit-da}] ├─crond ├─cupsd ├─dbus-daemon───{dbus-daemon} ├─dmeventd───2*[{dmeventd}] ├─gpm ├─hald─┬─hald-runner─┬─hald-addon-acpi │ │ ├─hald-addon-inpu │ │ ├─hald-addon-rfki │ │ └─hald-addon-stor │ └─{hald} ├─2*[iscsid] ├─iscsiuio───2*[{iscsiuio}] ├─ksmtuned───sleep ├─login───bash ├─master─┬─pickup │ └─qmgr ├─5*[mingetty] ├─modem-manager ├─pcscd───{pcscd} ├─polkitd ├─portreserve ├─rpc.statd ├─rpcbind ├─rsyslogd───3*[{rsyslogd}] ├─sshd─┬─sshd───bash │ └─sshd───bash───pstree ├─udevd───2*[udevd] └─wpa_supplicant
在CentOS 7上顯示進程樹:
[root@www ~]# pstree systemd─┬─NetworkManager─┬─dhclient │ └─2*[{NetworkManager}] ├─abrt-watch-log ├─abrtd ├─anacron ├─atd ├─auditd───{auditd} ├─crond ├─dbus-daemon───{dbus-daemon} ├─firewalld───{firewalld} ├─httpd───6*[httpd] ├─irqbalance ├─login───bash ├─lsmd ├─lvmetad ├─master─┬─pickup │ └─qmgr ├─polkitd───5*[{polkitd}] ├─rngd ├─rpcbind ├─rsyslogd───2*[{rsyslogd}] ├─smartd ├─sshd───sshd───bash───pstree ├─systemd-journal ├─systemd-logind ├─systemd-udevd ├─tuned───4*[{tuned}] └─vmtoolsd───{vmtoolsd}
ps命令:
report a snapshot of the current processes.
顯示ps命令執行那一刻系統上進程的運行狀態。
ps命令查看內核管理進程參數的接口 --> 僞文件系統/proc
進程是由內核管理的,而內核管理進程的相關信息可經過接口來查詢,在Linux上這個接口就是/proc目錄,內核參數是模擬成文件系統類型的,每一個文件即爲內核參數。/proc文件系統存放於內存空間中,用於存放內核中的狀態信息。
內核參數有兩種:
(1)可設置其值從而調整內核運行特性的參數:這些參數一般存放於/proc/sys/目錄下,但並不是位於 /proc/sys目錄下的文件(參數)都可設置,只能設置具備寫權限的文件(參數)。 (2)狀態參數:用於輸出內核中的統計信息和狀態信息;僅用於查看。
每一個進程在/proc目錄下都有一個與其PID同名的目錄,這個目錄下的每一個文件都是內核參數,用於專門保存當前進程的相關信息。
以下,顯示init進程對應的目錄:
經過參數comm可查看啓動該進程的程序文件:
[root@osyunwei ~]# cat /proc/1/comm init
經過參數maps可查看邏輯地址和物理內存地址的映射關係:
[root@osyunwei ~]# cat /proc/1/maps 7f10e779e000-7f10e77ab000 r-xp 00000000 fd:01 398008 /lib64/libnss_files-2.12.so #庫函數 7f10e77ab000-7f10e79aa000 ---p 0000d000 fd:01 398008 /lib64/libnss_files-2.12.so 7f10e79aa000-7f10e79ab000 r--p 0000c000 fd:01 398008 /lib64/libnss_files-2.12.so 7f10e79ab000-7f10e79ac000 rw-p 0000d000 fd:01 398008 /lib64/libnss_files-2.12.so 7f10e79ac000-7f10e7b36000 r-xp 00000000 fd:01 462418 /lib64/libc-2.12.so 7f10e7b36000-7f10e7d36000 ---p 0018a000 fd:01 462418 /lib64/libc-2.12.so .....(中間省略)..... 7f10e8c01000-7f10e8c24000 r-xp 00000000 fd:01 149577 /sbin/init 7f10e8e23000-7f10e8e25000 r--p 00022000 fd:01 149577 /sbin/init 7f10e8e25000-7f10e8e26000 rw-p 00024000 fd:01 149577 /sbin/init 7f10eaa25000-7f10eaa64000 rw-p 00000000 00:00 0 [heap] #堆內存 7ffc9a845000-7ffc9a85a000 rw-p 00000000 00:00 0 [stack] #棧內存 7ffc9a8fd000-7ffc9a8fe000 r-xp 00000000 00:00 0 [vdso] ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
由於在/proc目錄下的內核參數對於非內核級開發人員來講不便於查看,所以就有諸多查看命令專門將其中這些內核參數信息收集起來並以一種直觀的方式顯示出來,ps命令就是其中一個比較經典的命令;
ps命令格式:
ps [options]
ps命令選項有三種風格:
(1)UNIX選項:選項以前必須帶'-' (2)BSD選項:選項之間不能帶'-' (3)GNU長格式選項:選項以前必須帶'--'
經常使用選項:
a:顯示全部與終端相關的進程;
x:顯示全部與終端無關的進程;
u:以用戶爲中心組織進程狀態信息的顯示;
o field1,field2,...:自定義要顯示的字段列表;各字段以逗號分隔;
-e:顯示全部進程
-f:以完整格式顯示進程狀態信息;
-F:以完整格式顯示進程狀態信息(顯示項比-f選項更多);
-H:Hierarchy,以層級結構顯示進程的相關信息;
進程啓動方式:
(1)系統啓動過程當中自動啓動:與終端無關的進程;
(2)用戶經過終端啓動的進程:與終端相關的進程;
①經常使用組合之一:aux
顯示全部與終端相關的進程:
[root@localhost ~]# ps a PID TTY STAT TIME COMMAND 2571 tty1 Ss+ 0:02 -bash 13604 pts/0 Ss 0:00 -bash 13742 pts/0 R+ 0:00 ps a #各字段意義: PID:進程號; TTY:與進程相關的終端設備; STAT:進程的狀態; TIME:進程累積佔用CPU的時間; COMMAND:啓動該進程的程序命令(包括選項和參數)
顯示全部與終端無關的進程:
[root@localhost ~]# ps x PID TTY STAT TIME COMMAND 1 ? Ss 0:28 /usr/lib/systemd/systemd --switched-root --system --deserialize 21 2 ? S 0:00 [kthreadd] 3 ? S 0:00 [ksoftirqd/0] 5 ? S< 0:00 [kworker/0:0H] 7 ? S 0:02 [migration/0] 8 ? S 0:00 [rcu_bh] 9 ? R 0:30 [rcu_sched] 10 ? S 0:00 [watchdog/0] .....(省略)..... 1982 ? Ss 0:12 /usr/sbin/httpd -DFOREGROUND 2571 tty1 Ss+ 0:02 -bash 5213 ? Ssl 0:12 /usr/sbin/NetworkManager --no-daemon 7625 ? S< 0:00 [kworker/1:2H] .....(省略)..... 13739 ? S 0:00 [kworker/3:1] 13740 ? S< 0:00 [kworker/3:2H] 13755 pts/0 R+ 0:00 ps x #'?'表示與終端無關; #根據PID號從小到大排序,各字段意義同上;
顯示全部進程:
[root@localhost ~]# ps ax
以用戶爲中心顯示全部進程:
[root@localhost ~]# ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.6 193628 6732 ? Ss Feb13 0:28 /usr/lib/systemd/systemd --switched-root --system --des root 2 0.0 0.0 0 0 ? S Feb13 0:00 [kthreadd] root 3 0.0 0.0 0 0 ? S Feb13 0:00 [ksoftirqd/0] root 5 0.0 0.0 0 0 ? S< Feb13 0:00 [kworker/0:0H] root 7 0.0 0.0 0 0 ? S Feb13 0:02 [migration/0] root 8 0.0 0.0 0 0 ? S Feb13 0:00 [rcu_bh] root 9 0.0 0.0 0 0 ? S Feb13 0:30 [rcu_sched] root 10 0.0 0.0 0 0 ? S Feb13 0:00 [watchdog/0] root 11 0.0 0.0 0 0 ? S Feb13 0:00 [watchdog/1] root 12 0.0 0.0 0 0 ? S Feb13 0:03 [migration/1] root 13 0.0 0.0 0 0 ? S Feb13 0:03 [ksoftirqd/1] .....(如下省略)..... #各字段意義: USER:運行進程的用戶; PID:進程號; %CPU:進程佔用CPU資源的百分比; %MEM:進程佔用內存資源的百分比; VSZ:Virtual memory SiZe,虛擬內存集; RSS:ReSident Size,常駐內存集; TTY:與進程相關的終端設備; STAT:進程狀態; START:進程的啓動時間; TIME:進程累積佔用CPU時間; COMMAND:進程由哪一個命令程序啓動,帶'[]'表明爲內核線程,而經過pstree命令只能顯示進程;
進程狀態(STAT):
R:running,運行態; S:interruptable sleeping,可中斷睡眠; D:uninterruptable sleeping,不可中斷睡眠; T:stopped,中止態; Z:zombie,僵死態; +:前臺進程(前臺指的是經過終端運行,須要佔據命令提示符); l:多線程進程; N:低優先級進程; <:高優先級進程; s:session leader,會話主導者(例如bash);
②經常使用組合之二:ef
顯示全部進程:
[root@localhost ~]# ps -e PID TTY TIME CMD 1 ? 00:00:28 systemd 2 ? 00:00:00 kthreadd 3 ? 00:00:00 ksoftirqd/0 .....(如下省略).....
以完整格式顯示進程信息:
[root@localhost ~]# ps -f UID PID PPID C STIME TTY TIME CMD root 13604 13600 0 19:42 pts/0 00:00:00 -bash root 13882 13604 0 21:03 pts/0 00:00:00 ps -f #STIME:進程的啓動時間;
以完整格式顯示全部進程:
[root@localhost ~]# ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 Feb13 ? 00:00:28 /usr/lib/systemd/systemd --switched-root --system --deserialize 21 root 2 0 0 Feb13 ? 00:00:00 [kthreadd] root 3 2 0 Feb13 ? 00:00:00 [ksoftirqd/0] root 5 2 0 Feb13 ? 00:00:00 [kworker/0:0H] root 7 2 0 Feb13 ? 00:00:02 [migration/0] root 8 2 0 Feb13 ? 00:00:00 [rcu_bh] root 9 2 0 Feb13 ? 00:00:31 [rcu_sched] root 10 2 0 Feb13 ? 00:00:00 [watchdog/0] root 11 2 0 Feb13 ? 00:00:00 [watchdog/1] .....(如下省略)..... #各字段意義: UID:effective user,有效用戶,即運行該進程的用戶; PID:進程號; PPID:父進程號; C:cpu utilization,CPU使用率,即佔用CPU資源的百分比; STIME:進程的啓動日期; TTY:與進程相關的終端設備;'?'表示與終端無關; TIME:進程累積佔用CPU的時間; CMD:啓動進程的命令程序,帶'[]'表示爲內核線程;
以更爲完整的格式顯示全部進程:
[root@localhost ~]# ps -eF UID PID PPID C SZ RSS PSR STIME TTY TIME CMD root 1 0 0 48407 6732 3 Feb13 ? 00:00:28 /usr/lib/systemd/systemd --switched-root --system --des root 2 0 0 0 0 0 Feb13 ? 00:00:00 [kthreadd] root 3 2 0 0 0 0 Feb13 ? 00:00:00 [ksoftirqd/0] root 5 2 0 0 0 0 Feb13 ? 00:00:00 [kworker/0:0H] root 7 2 0 0 0 0 Feb13 ? 00:00:02 [migration/0] root 8 2 0 0 0 2 Feb13 ? 00:00:00 [rcu_bh] root 9 2 0 0 0 0 Feb13 ? 00:00:31 [rcu_sched] root 10 2 0 0 0 0 Feb13 ? 00:00:00 [watchdog/0] root 11 2 0 0 0 1 Feb13 ? 00:00:00 [watchdog/1] #各字段意義: UID:運行該進程的用戶; PID:進程號; PPID:父進程號; C:CPU使用率; SZ:即VSZ,虛擬內存集; RSS:常駐內存集; STIME:進程的啓動日期; TTY:與進程相關的終端設備; TIME:進程累積佔用CPU的時間; CMD:啓動進程的命令程序;
③經常使用組合之三:-efH
以層級結構顯示進程相關信息:
[root@localhost ~]# ps -efH UID PID PPID C STIME TTY TIME CMD root 2 0 0 Feb13 ? 00:00:00 [kthreadd] root 3 2 0 Feb13 ? 00:00:00 [ksoftirqd/0] root 5 2 0 Feb13 ? 00:00:00 [kworker/0:0H] root 7 2 0 Feb13 ? 00:00:02 [migration/0] root 8 2 0 Feb13 ? 00:00:00 [rcu_bh] root 9 2 0 Feb13 ? 00:00:31 [rcu_sched] root 10 2 0 Feb13 ? 00:00:00 [watchdog/0] root 11 2 0 Feb13 ? 00:00:00 [watchdog/1] root 12 2 0 Feb13 ? 00:00:03 [migration/1] root 13 2 0 Feb13 ? 00:00:03 [ksoftirqd/1] .....(中間省略)..... root 840 1 0 Feb13 ? 00:00:02 /usr/sbin/rsyslogd -n dbus 841 1 0 Feb13 ? 00:00:22 /bin/dbus-daemon --system --address=sys temd: --nofork --nopidfile --s root 854 1 0 Feb13 ? 00:00:00 /usr/sbin/sshd root 13600 854 0 19:42 ? 00:00:01 sshd: root@pts/0 root 13604 13600 0 19:42 pts/0 00:00:00 -bash root 13993 13604 0 21:15 pts/0 00:00:00 ps -efH root 861 1 0 Feb13 ? 00:00:06 /usr/lib/systemd/systemd-logind root 868 1 0 Feb13 ? 00:00:00 /usr/sbin/atd -f root 870 1 0 Feb13 ? 00:00:01 /usr/sbin/crond -n root 884 1 0 Feb13 ? 00:00:00 login -- root root 2571 884 0 Feb13 tty1 00:00:02 -bash .....(如下省略)..... #CMD字段縮進級別相同的進程表示爲同級子進程;
④經常使用組合之四:-eo, axo
o選項:
o field1,field2,...:自定義要顯示的字段列表,各字段以逗號分隔; 常見的field有:pid, ppid, ni, pri, rtpri, pcpu, psr, stat, comm(cmd), tty, ... pid:進程號; ppid:父進程號; ni:nice值; priority:優先級; rtpri:實時優先級; psr:運行於哪顆CPU之上; stat:進程狀態; cmd:啓動該進程的命令程序; tty:與進程相關的終端設備;
顯示PID及其對應的命令程序:
[root@localhost ~]# ps axo pid,cmd PID CMD 1 /usr/lib/systemd/systemd --switched-root --system --deserialize 21 2 [kthreadd] 3 [ksoftirqd/0] 5 [kworker/0:0H] 7 [migration/0] .....(如下省略).....
在CentOS 7上顯示初始化程序systemd相關進程的PID,優先級和Nice值:
[root@loaclhost ~]# ps axo cmd,pid,priority,ni | grep systemd /usr/lib/systemd/systemd -- 1 20 0 /usr/lib/systemd/systemd-jo 601 20 0 /usr/lib/systemd/systemd-ud 640 20 0 /usr/lib/systemd/systemd-lo 846 20 0
pgrep, pkill命令:
look up or signal processes based on name and other attributes
根據名字或其餘屬性查看進程或向進程發送信號。
命令格式:
pgrep [options] pattern pkill [options] pattern
經常使用選項:
-u uid:effective user,顯示指定用戶運行的進程(運行過程當中可切換身份);
-U uid:real user,顯示指定用戶啓動了哪些進程;
-t TERMINAL:顯示與終端相關的進程;
-l:顯示進程名;
-a:顯示完整格式的進程名;
-P pid:顯示指定進程的子進程;
用法示例:
顯示進程名中包含字符串'ssh'的進程:
[root@localhost ~]# pgrep httpd 1982 1983 1984 1985 1986 1987 1988
顯示用戶postfix啓動了哪些進程:
[root@localhost ~]# pgrep -U postfix 977 14002 #檢驗: [root@localhost ~]# ps aux | egrep '^USER|977|14002' USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND postfix 977 0.0 0.3 91236 3988 ? S Feb13 0:00 qmgr -l -t unix -u postfix 14002 0.0 0.3 91168 3972 ? S 21:21 0:00 pickup -l -t unix -u root 14184 0.0 0.0 112652 968 pts/0 S+ 22:06 0:00 grep -E --color=auto ^USER|977|14002
顯示用戶postfix啓動的進程的PID和進程名:
[root@localhost ~]# pgrep -U postfix -l 977 qmgr 14002 pickup
顯示用戶postfix啓動的進程的PID和進程名(完整格式):
[root@localhost ~]# pgrep -U postfix -a 977 qmgr -l -t unix -u 14002 pickup -l -t unix -u
pidof命令:
find the process ID of a running program.
根據進程名,找出相應的PID。
用法示例:
顯示httpd對應的PID:
[root@localhost ~]# pidof httpd 1988 1987 1986 1985 1984 1983 1982
top命令:
display Linux processes
以動態方式查看當前系統上的進程信息;相似於Windows上的任務管理器;以排序方式顯示,佔用某種資源最多的進程顯示在最前。
經常使用命令:
排序: P命令:以佔據CPU百分比排序;(默認) M命令:以佔據內存百分比顯示; T命令:以累積佔用CPU時間排序; 控制首部字段的開啓或關閉: (1)uptime信息:l命令; (2)tasks及cpu信息:t命令; (3)內存信息:m命令; 修改刷新時間間隔:s命令; 終止指定的進程:k命令; 退出top進程:q命令;
經常使用選項:
-d #:Delay-time interval,指定刷新時間間隔;默認爲3秒;
-b:Batch-mode,以批次方式顯示;
-n #:Number-of-iterations,指定顯示多少批次後退出top進程;
用法示例:
動態查看Linux系統上的進程信息:
[root@localhost ~]# top top - 22:40:29 up 1 day, 9:33, 2 users, load average: 0.00, 0.01, 0.05 Tasks: 203 total, 2 running, 200 sleeping, 1 stopped, 0 zombie %Cpu(s): 0.1 us, 0.1 sy, 0.0 ni, 99.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem : 999964 total, 485220 free, 185104 used, 329640 buff/cache KiB Swap: 2097148 total, 2097148 free, 0 used. 598852 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 14293 root 20 0 157708 2284 1556 R 0.3 0.2 0:00.05 top 1 root 20 0 193628 6732 3968 S 0.0 0.7 0:29.74 systemd 2 root 20 0 0 0 0 S 0.0 0.0 0:00.15 kthreadd 3 root 20 0 0 0 0 S 0.0 0.0 0:00.88 ksoftirqd/0 5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H 7 root rt 0 0 0 0 S 0.0 0.0 0:02.20 migration/0 8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh 9 root 20 0 0 0 0 S 0.0 0.0 0:33.04 rcu_sched 10 root rt 0 0 0 0 S 0.0 0.0 0:00.79 watchdog/0 11 root rt 0 0 0 0 S 0.0 0.0 0:00.84 watchdog/1 12 root rt 0 0 0 0 S 0.0 0.0 0:03.81 migration/1 13 root 20 0 0 0 0 S 0.0 0.0 0:03.32 ksoftirqd/1 15 root 0 -20 0 0 0 S 0.0 0.0 0:00.18 kworker/1:0H 16 root rt 0 0 0 0 S 0.0 0.0 0:00.87 watchdog/2 17 root rt 0 0 0 0 S 0.0 0.0 0:02.76 migration/2
top命令前五行信息是系統的總體統計信息:
①第一行是系統時間、運行時長及平均負載(任務隊列)信息,該信息同命令uptime執行結果一致:
[root@localhost ~]# uptime 22:54:29 up 1 day, 9:47, 2 users, load average: 0.00, 0.01, 0.05
其內容以下:
22:54:29 | 當前時間 |
up 1 day, 9:47 | 系統運行時長 |
2 users | 當前登陸系統的用戶數 |
load average: 0.00, 0.01, 0.05 | 過去1分鐘、5分鐘和15分鐘的平均負載;這裏的平均負載指的是等待CPU運行的進程隊列長度;長度越大,則CPU負載越大;若是這3個值長時間超過CPU核數時,說明CPU處於高負載狀態 |
②第2、三行爲進程和CPU信息:
Tasks: 202 total, 1 running, 200 sleeping, 1 stopped, 0 zombie %Cpu(s): 0.0 us, 0.1 sy, 0.0 ni, 99.8 id, 0.0 wa, 0.0 hi, 0.1 si, 0.0 st
當有多個CPU時,這些內容可能會超過兩行。
第二行內容以下:
Tasks: 203 total | 進程總數 |
2 running | 處於運行態的進程數 |
200 sleeping | 處於睡眠態的進程數 |
1 stopped | 處於中止態的進程數 |
0 zombie |
處於僵死態的進程數 |
第三行內容以下:
%Cpu(s):
0.1 us | 用戶空間的進程所佔用的CPU時間的百分比 |
0.1 sy | 內核空間的進程所佔用的CPU時間的百分比 |
0.0 ni | 被nice命令改變優先級的任務所佔的百分比 |
99.8 id | idle,空閒時間百分比 |
0.0 wa | 等待IO過程消耗的時間百分比 |
0.0 hi | hardware interrupt,處理硬件中斷所佔用的CPU時間百分比 |
0.0 si | sofeware interrupt,處理軟中斷所佔用的CPU時間百分比 |
0.0 st | stolen,被虛擬化程序所偷走的CPU時間百分比,即虛擬CPU等待實際CPU的時間的百分比 |
③第4、五行爲內存信息(單位:k):
KiB Mem : 999964 total, 485512 free, 184832 used, 329620 buff/cache KiB Swap: 2097148 total, 2097148 free, 0 used. 599148 avail Mem
第四行內容以下:
KiB Mem :
999964 total | 內存總量 |
485512 free | 空閒的內存總量 |
184832 used | 已使用的內存總量 |
329620 buff/cache | 用於緩衝/緩存的內存空間,可回收利用 |
#buff和cache的區別: buff(緩衝區)用於平衡CPU和IO之間的處理速率,它的引入主要是爲了減少短時間內突發IO的影響,起 到流量整型的做用。 cache(緩存區)用於彌補CPU和Memory之間處理速度的差別,可將經常使用的數據存放於CPU中的cache以 提升計算機處理速率。
第五行內容以下:
KiB Swap:
2097148 total | swap分區總量 |
2097148 free | 空閒的swap分區總量 |
0 used | 已使用的swap分區總量 |
599148 avail Mem | 可利用的空間,大體由'free'和'buff/cache'相加而得 |
進程信息:
PID | 進程號 |
USER | 運行進程的用戶名 |
PR |
進程優先級 |
NI | Nice值 |
VIRT | 虛擬內存集 |
RES | 常駐內存集 |
SHS | 共享內存空間 |
S | 進程狀態 |
%CPU | 進程佔用CPU時間的百分比 |
%MEM | 進程佔用內存空間的百分比 |
TIME+ | 進程累積佔用的CPU時間 |
COMMAND | 啓動進程的命令程序名 |
使用命令'1',可在首部字段中顯示全部CPU的狀態信息:
注意:在CentOS 6和CentOS 7上的top首部字段略有不一樣:
在CentOS 6上:
在CentOS 7上:
uptime命令:
Tell how long the system has been running.
顯示系統時間、系統運行時長及平均負載;平均負載指的是過去1分鐘、5分鐘和15分鐘的平均負載,這裏表示等待CPU運行的進程隊列的長度;顯示的字段爲top命令首部字段中第一行的內容,又稱uptime信息。
示例:
顯示當前系統的平均負載:
[root@localhost ~]# uptime 00:25:36 up 1 day, 11:19, 2 users, load average: 0.01, 0.03, 0.05
htop命令:
interactive process viewer
交互式進程查看器;是top的加強版,相比top而言,htop增長了對各進程進行搜索、過濾、綁定CPU、
追蹤系統調用和標記等功能,也可顯示指定進程打開的文件列表或以層級關係顯示進程等等;
支持鼠標控制;可藉助於可信任的第三方組織epel源下載。
命令格式:
htop [-dChusv]
經常使用選項:
-d #:指定延遲時間間隔;
-u UserName:只顯示指定用戶相關的進程;
-s COLUME: 以指定的字段COLUME對進程進行排序;
經常使用子命令:
l:顯示指定的進程打開的文件列表;
s:追蹤指定的進程的系統調用;
t:以層級關係顯示各進程狀態信息;
a:將指定的進程綁定至指定的CPU核心;
u:指定用戶相關的進程;
H:隱藏或顯示用戶線程;
K:隱藏或顯示內核線程;
Space:標記指定的單個進程;
c:標記指定的進程,而且連同其子進程也自動標記;
U:取消對全部進程的標記;
>:設置排序的字段;
]:經過調整nice值調高優先級;
[:經過調整nice至調低優先級;
i:設定IO優先級;
用法示例:
[root@localhost ~]# htop
打開界面以下:
點擊F1鍵可查看幫助:
鍵入t命令,以層級關係顯示出各進程關係:
僅顯示用戶apache的相關進程:
方式一:
[root@localhost ~]# htop -u apache
顯示如圖:
方式二:
在交互式界面使用'u'命令:
將系統上的全部ping進程kill掉:
方法有不少中,能夠經過F3鍵進程搜索或者經過F4鍵進行過濾匹配到並刪除之,這裏介紹用標記的方式kill掉ping進程:
再經過F9鍵傳遞一個終止信號(如SIGTERM)便可。
vmstat命令:
Report virtual memory statistics
顯示虛擬內存的統計數據信息;vmstat是經過查看/proc目錄下的文件來獲取相關數據並顯示出來的。
命令格式:
vmstat [options] [delay [count]]
經常使用選項:
-s:顯示內存統計數據;
用法示例:
用vmstat查看當前系統的統計數據信息:
[root@localhost ~]# vmstat procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 0 0 0 443196 1456 357820 0 0 0 0 11 15 0 0 100 0 0
各字段意義以下:
proc(process) |
r | 等待運行的進程個數,即等待CPU運行的任務隊列長度; 實時顯示,而uptime信息中平均負載顯示的是一段時間的統計平均結果 |
b | 處於不可中斷睡眠態的進程個數,即被阻塞的任務隊列長度 | |
注意:若是r值超過CPU的個數,則說明可能須要添加CPU的個數; |
||
memory | swpd | 已使用的交換內存總量 |
free | 空閒的物理內存總量 | |
buff | 用於緩衝區(buffer)的內存總量 | |
cache | 用於緩存區(cache)的內存總量 | |
注意:若是swpd不爲0,而so長期爲0,這種狀況不會影響系統性能;若是free很小,而si、so也很小,那麼系統性能這時也不會受到影響; |
||
swap | si | 數據進入swap中的傳輸速率(kb/s) |
so | 數據離開swap的傳輸速率(kb/s) | |
注意:若是si、so這2個值長期都大於0,那麼系統性能會受到影響; |
||
io | bi | 從塊設備加載數據至系統的速率(kb/s) |
bo | 保存數據至塊設備的速率(kb/s) |
|
注意:在進程隨機磁盤讀寫時,若是bi、bo這2個值越大(如超過1024),則說明系統等待IO過程消耗的時間不少,這時會影響系統性能; |
||
system | in | interrupts,中斷速率 |
cs | context switch,上下文切換速率 | |
注意:若是in、cs這2個值越大,則內核消耗CPU的時間越多; |
||
cpu | us | user space,用戶空間進程佔用CPU時間的百分比 |
sy | system,內核進程佔用CPU時間的百分比 | |
id | idle,空閒時間百分比 | |
wa | wait,等待IO過程佔用CPU時間的百分比 | |
st | stolen,被虛擬化技術拿走的時間百分比 |
|
注意:若是us值比較高,說明用戶進程消耗的CPU資源比較多,若是長期大於50%,則應考慮優化程序算法或進行加速;若是sy比較高,則說明內核消耗CPU資源比較多,這時須要咱們對系統進行檢查;正常來說,當CPU處於高負載時,us:sy的值應該大約爲7:3左右纔算正常,由於只有用戶空間進程代碼才能帶來生產力;而若是wa比較高時,則說明等待IO過程消耗了大量時間,多是大量隨機磁盤訪問形成的,此時磁盤IO成爲系統性能瓶頸; |
vmstat以後通常加上兩個參數,第一個參數是延遲時間間隔,第二個參數是顯示多少次,例如:每隔兩秒顯示一次系統狀態統計信息,一共顯示5次:
[root@localhost ~]# vmstat 2 5 procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 1 0 0 443604 1456 357776 0 0 0 0 11 15 0 0 100 0 0 0 0 0 443616 1456 357776 0 0 0 0 45 54 0 0 100 0 0 0 0 0 443616 1456 357776 0 0 0 0 37 47 0 0 100 0 0 0 0 0 443492 1456 357776 0 0 0 0 52 65 0 0 100 0 0 0 0 0 443492 1456 357776 0 0 0 0 54 56 0 0 100 0 0
顯示內存統計數據:
[root@localhost ~]# vmstat -s 999964 K total memory 197468 K used memory 246536 K active memory 108244 K inactive memory 440880 K free memory 1456 K buffer memory 360160 K swap cache 2097148 K total swap 0 K used swap 2097148 K free swap 11707 non-nice user cpu ticks 81 nice user cpu ticks 43501 system cpu ticks 64073593 idle cpu ticks 17947 IO-wait cpu ticks 0 IRQ cpu ticks 2041 softirq cpu ticks 0 stolen cpu ticks 230067 pages paged in 203679 pages paged out 0 pages swapped in 0 pages swapped out 7040596 interrupts 9682496 CPU context switches 1487005067 boot time 19172 forks
pmap命令:
report memory map of a process
用於顯示進程的內存映射表;雖然任何一個進程在線性地址空間中看到的是連續的內存空間,但這些分配給內存的內存頁都有可能存放於不連續的物理內存空間中。
命令格式:
pmap [options] pid [...]
經常使用選項:
-x:顯示詳細信息;
用法示例:
顯示init進程的內存映射表:
[root@loaclhost ~]# pmap 1 1: /usr/lib/systemd/systemd --switched-root --system --deserialize 21 00007fd8fc000000 164K rw--- [ anon ] #內存起始地址 #內存片斷大小 00007fd8fc029000 65372K ----- [ anon ] 00007fd904000000 164K rw--- [ anon ] 00007fd904029000 65372K ----- [ anon ] 00007fd909422000 4K ----- [ anon ] 00007fd909423000 8192K rw--- [ anon ] 00007fd909c23000 4K ----- [ anon ] 00007fd909c24000 8192K rw--- [ anon ] 00007fd90a424000 16K r-x-- libuuid.so.1.3.0 #在內存中離散存儲; 00007fd90a428000 2044K ----- libuuid.so.1.3.0 00007fd90a627000 4K r---- libuuid.so.1.3.0 00007fd90a628000 4K rw--- libuuid.so.1.3.0 .....(中間省略)..... 00007fd90cde9000 1296K r-x-- systemd 00007fd90cf2e000 124K r---- systemd 00007fd90cf4d000 4K rw--- systemd 00007fd90d547000 2412K rw--- [ anon ] 00007ffdbccaa000 132K rw--- [ stack ] 00007ffdbcd28000 8K r-x-- [ anon ] ffffffffff600000 4K r-x-- [ anon ] total 193628K
顯示更爲詳細的信息:
[root@loaclhost ~]# pmap -x 1 1: /usr/lib/systemd/systemd --switched-root --system --deserialize 21 Address Kbytes RSS Dirty Mode Mapping 00007fd8fc000000 164 12 12 rw--- [ anon ] 00007fd8fc029000 65372 0 0 ----- [ anon ] 00007fd904000000 164 12 12 rw--- [ anon ] 00007fd904029000 65372 0 0 ----- [ anon ] 00007fd909422000 4 0 0 ----- [ anon ] 00007fd909423000 8192 8 8 rw--- [ anon ] 00007fd909c23000 4 0 0 ----- [ anon ] 00007fd909c24000 8192 8 8 rw--- [ anon ] 00007fd90a424000 16 8 0 r-x-- libuuid.so.1.3.0 00007fd90a428000 2044 0 0 ----- libuuid.so.1.3.0 00007fd90a627000 4 4 4 r---- libuuid.so.1.3.0 00007fd90a628000 4 4 4 rw--- libuuid.so.1.3.0 .....(中間省略)..... 00007fd90cde9000 1296 1116 0 r-x-- systemd 00007fd90cf2e000 124 124 124 r---- systemd 00007fd90cf4d000 4 4 4 rw--- systemd 00007fd90d547000 2412 2284 2284 rw--- [ anon ] 00007ffdbccaa000 132 52 52 rw--- [ stack ] 00007ffdbcd28000 8 4 0 r-x-- [ anon ] ffffffffff600000 4 0 0 r-x-- [ anon ] ---------------- ------- ------- ------- total kB 193628 6732 2764
注意:也可經過另外一種方式查看:cat /proc/PID/maps
glances命令:
A cross-platform curses-based monitoring tool
是基於圖形函數庫curses所研發的跨平臺的監控工具,一樣可用於監控cpu、memory、io等統計數據信息,用法與top和htop這兩個工具相似,可實現遠程監控;同時glance支持C/S模式,須要使用epel源下載;
經常使用選項:
-b:以Byte/s爲單位顯示網卡數據速率;
-d:關閉磁盤I/O模塊;
-m:關閉mount模塊;
-n:關閉network模塊;
-1:每顆CPU的統計信息都單獨顯示;
-t #:指定刷新時間間隔;
-o {HTML|CSV}:當須要保存glances顯示的統計信息爲文件時,可設置其輸出格式(HTML或CSV);
-f /PATH/TO/SOMEDIR:設置輸出文件的保存目錄;
用法示例:
直接使用glances命令實時查看當前系統的統計信息:
[root@loaclhost ~]# glances
打開界面以下:
每顆CPU的統計數據信息都單獨顯示:
[root@loaclhost ~]# glances -1
各顆CPU顯示以下:
將glances顯示的統計數據保存至/tmp目錄下,並以HTML格式輸出,並打開網頁查看統計數據:
[root@loaclhost ~]# glances -o HTML -f /tmp
在CentOS 6上登陸CentOS 7:
[root@osyunwei ~]# ssh -X root@10.10.10.140 #爲了可以使用CentOS 6瀏覽器打開CentOS 7上的html文件,可加選項-X;
登陸CentOS7後,在CentOS 6上使用firefox瀏覽器打開/tmp/glances.html文件;
[root@osyunwei ~]# ssh -X root@10.10.10.140 root@10.10.10.140's password: Last login: Thu Feb 16 18:13:47 2017 from 10.10.10.139 Hello,Tab! Long time no see. I'm so happy to see you!!! ^_^ Enjoy youself,Tab~ [root@loaclhost ~]# [root@loaclhost ~]# firefox /tmp/glances.html
打開後可見以下界面:
注意:只要原來CentOS 7上的glances進程沒有終止,則在CentOS 6上會不斷刷新統計數據。
此外,可以使用glances做爲遠程監控工具,不過如今不少企業都是直接部署一個遠程監控系統,而不使用glances工具來單個監控。而若是沒有部署一個遠程監控系統,但又須要在遠程收集一些數據時,可以使用glances這個工具:
C/S模式下運行glances命令: (1)服務端模式: glances -s -B IPADDR 其中IPADDR爲本機用於監聽的某地址; (2)客戶端模式: glances -c IPADDR 其中IPADDR是遠程服務器的地址;
dstat命令:
versatile tool for generating system resource statistics
dstat是一個很是精巧的工具,它能獲取系統資源使用的統計數據信息,幾乎融合了其餘進程監控命令的功能;使用dstat能夠列表方式顯示出cpu、memory、interface、io統計信息,並以不一樣顏色顯示使各類統計信息不易混淆,顯示效果很是直觀;dstat是新晉命令,已被RedHat收購,所以只需base源便可安裝。
命令格式:
dstat [-afv] [options..] [delay [count]]
經常使用選項:
-c:顯示CPU使用率,包括us,sy,id,wa,hi,si;
-C #,#,...,total:顯示指定CPU的使用率;
-d:顯示磁盤的相關統計數據,包括磁盤讀寫狀態;
-D sda[#],hda[#],...,total:顯示指定的磁盤或磁盤分區的讀寫狀態;
-g:顯示page相關的數據交換速率,即從page寫入磁盤的速率以及從磁盤讀取數據至page中的速率,是 之內存爲中心顯示的;
-m:統計Memory已使用量、剩餘量以及用爲緩存、緩衝的空間;
-n:顯示Interface的相關統計數據,包括接收和發送數據量;
-N eth1,eth2...,total:顯示指定網卡的相關統計數據;
-p:顯示process的相關統計數據,包括runnable、uninterruptible、new;
-r:顯示I/O請求的相關統計數據,包括讀、寫請求;
-s:統計顯示swap的已使用量和剩餘量;
-y:顯示系統內核中斷速率和上下文切換速率;
--aio:顯示異步I/O(asynchronous I/O)的相關統計數據;
--fs:統計文件打開數和inodes數;
--ipc:顯示進程間通訊的相關信息;
--raw:顯示raw socket的數量;
--socket:顯示socket的相關統計信息;
--tcp:顯示tcp鏈接各狀態的個數;
--udp:顯示udp監聽和活躍的個數;
dstat還支持一些插件,用於實現更爲高級的功能:
--top-cpu:顯示最消耗CPU的進程;
--top-mem:顯示最消耗Memory的進程;
--top-io:顯示最佔用I/O的進程;
--top-latency:顯示延遲最大的進程;
用法示例:
直接執行dstat命令,如圖:
注意:若是不加任何選項,則默認自帶-cdngy這幾個選項,即顯示CPU、磁盤讀/寫、網卡、內存頁和內核 的相關統計信息;
這是默認輸出的信息:
CPU使用率:這一欄可顯示出用戶進程(us)、內核進程(sys)、空閒時間(idl)、等待IO(wai)、硬中斷(hiq)和軟中斷(siq)分別佔用CPU時間的百分比,能夠方便地分析CPU目前的狀態。例如,當wai值比較大時,說明此時CPU大量時間在等待IO過程,有多是CPU正在等待I/O設備(磁盤、網卡等)的響應,或者等待磁盤加載數據至內存中。
磁盤統計:這一欄顯示的是磁盤或磁盤分區的讀、寫數據量。
網絡統計:這一欄顯示的是網卡接收和發送的數據報文的數據量。
內存頁統計:這一欄顯示的內存頁的活動。若是page in(換入)和page out(換出)這兩個值比較大,則說明物理內存不夠用,並正在使用大量的交換內存。正常狀況下,咱們但願這兩個值爲0。
系統內核統計:這一欄顯示的是內核處理中斷的速率(int)以及上下文切換的速率(csw)。若是這兩個值過大,則說明有等待CPU運行的任務隊列比較長,有大量的進程形成阻塞,此時CPU負載比較大,可考慮添加CPU的核心數。
顯示磁盤分區/dev/sda1的讀寫速率:
[root@loaclhost ~]# dstat -D sda1
查看CPU的狀態:
[root@loaclhost ~]# dstat -c
dstat一般可傳遞兩個參數,分別用於指定刷新時間間隔和顯示的次數。例如,查看內存的統計信息,每隔兩秒顯示1次,一共顯示5次:
[root@loaclhost ~]# dstat -m 2 5
分別查看最消耗CPU和最消耗內存的進程名:
[root@loaclhost ~]# dstat --top-cpu --top-mem
查看tcp鏈接各狀態的個數(listen, established, syn, time_wait, close):
[root@loaclhost ~]# dstat --tcp
查看全部socket的統計數據,每隔一秒顯示1次,一共顯示5次:
[root@loaclhost ~]# dstat --socket 1 5
顯示memory (used, buffers, cache, free)和swap (used, free)的統計數據信息,每隔兩秒顯示1次,一共顯示3次:
[root@loaclhost ~]# dstat -m -s 2 3
查看io請求(read,write)、CPU狀態(us,sy,id,wa,hi,si)、內核(int,csw)相關統計數據:
[root@loaclhost ~]# dstat -rcy
顯示進程間通訊相關信息:
[root@loaclhost ~]# dstat --ipc
顯示各socket數量以及tcp socket各狀態的數量:
[root@loaclhost ~]# dstat --socket --tcp
kill命令:
terminate a process
經過向進程發送信號,以實現對進程的管理。
命令格式:
kill -l [SIGNAL] #顯示當前系統的可用信號;
kill [-s SIGNAL | -SIGNAL] pid... #向進程發送信號;
經常使用信號SIGNAL:
1) SIGHUP:無須關閉進程而讓其重讀配置文件;經常使用於在不重啓服務的狀況下重讀配置;
2) SIGINT:終止(打斷)正在運行中的進程,至關於Ctrl+c;
9) SIGKILL:強制(暴力地)殺死運行中的進程;
15) SIGTERM:默認信號,(溫柔地)殺死運行中的進程;
18) SIGCONT:讓後臺中止的進程繼續在後臺執行;適合於非交互式的程序;
19) SIGSTOP:終止正在運行的進程並將其置於後臺,至關於Ctrl+z;
信號SIGNAL的標識方法:
(1) 信號的數字標識,例如:1
(2) 信號的完整名稱,例如:SIGHUP;
(3) 信號的簡寫名稱,例如:HUP;
總結一下,kill命令向進程發送信號有四種方式:
kill -1 PID #數字格式 kill -HUP PID #簡寫名稱 kill -SIGHUP PID #完整名稱 kill -s SIGHUP PID
用法示例:
獲得指定信號的數值:
[root@loaclhost ~]# kill -l SIGHUP 1 [root@loaclhost ~]# kill -l HUP 1 [root@loaclhost ~]# kill -l SIGKILL 9 [root@loaclhost ~]# kill -l SIGCONT 18
在不重啓服務的狀況下重讀httpd配置文件:
[root@loaclhost ~]# pidof httpd #查看httpd的幾個進程號; 1934 1933 1932 1931 1930 1929 1928 [root@loaclhost ~]# kill -1 1934 #向進程號1934發送SIGHUP信號;
先用ps查找進程,再用kill殺掉:
[root@loaclhost ~]# ps aux | grep ping | grep -v grep root 2032 0.1 0.1 147344 1940 pts/1 S+ 17:25 0:00 ping www.baidu.com [root@loaclhost ~]# kill 2032 [root@loaclhost ~]# kill 2032 -bash: kill: (2032) - No such process #顯示錯誤,由於沒有找到該進程,說明該進程已被殺死; [root@loaclhost ~]#
終止指定用戶的全部進程:
[root@loaclhost ~]# ps aux | grep ^Tab #首先查看用戶Tab的相關進程; Tab 2235 0.0 0.2 116036 2712 pts/2 Ss 17:43 0:00 -bash Tab 2288 0.0 0.4 151188 4856 pts/2 T 17:43 0:00 vim hello Tab 2343 0.0 0.1 147344 1944 pts/2 T 17:45 0:00 ping www.baidu.com Tab 2350 2.0 0.2 116028 2644 pts/2 S+ 17:46 0:00 bash [root@loaclhost ~]# [root@loaclhost ~]# kill -9 $(ps -ef | grep ^Tab | awk '{print $2}') [root@loaclhost ~]# [root@loaclhost ~]# ps aux | grep ^Tab #再查看該用戶的全部進程; [root@loaclhost ~]# #沒有任何顯示,說明進程已被殺死;此時終端用戶Tab [root@loaclhost ~]# 被迫退出bash;
killall命令:
kill processes by name
經過進程名向進程發送信號。
命令格式:
killall [-SIGNAL] program
用法示例:
殺死主機上全部ping進程:
[root@loaclhost ~]# ps aux | grep ping | grep -v grep #查看全部ping進程; root 2592 0.0 0.1 147344 1940 pts/1 S+ 17:59 0:00 ping www.baidu.com root 2593 0.0 0.1 132108 1472 pts/3 S+ 17:59 0:00 ping www.google.com Tab 2594 0.0 0.1 127912 1228 pts/2 S+ 17:59 0:00 ping 114.114.114.114 root 2648 0.0 0.1 127912 1224 pts/4 S+ 18:00 0:00 ping 223.5.5.5 root 2696 0.1 0.1 147344 1936 pts/5 S+ 18:00 0:00 ping mirrors.163.com [root@loaclhost ~]# killall -9 ping #殺死全部ping進程; [root@loaclhost ~]# ps aux | grep ping | grep -v grep #再次查看是否還有ping進程; [root@loaclhost ~]# #沒有任何顯示,說明已殺死;