us, user : time running un-niced user processes 用户空间进程占用CPU时间百分比
sy, system : time running kernel processes 内核进程占用CPU时间百分比
ni, nice : time running niced user processes 用户空间内改变过优先级的进程占用CPU时间百分比
id, idle : time spent in the kernel idle handler 空闲CPU时间百分比(100%表示系统完全空闲)
wa, iowait : time waiting for I/O completion I/O等待占用的CPU时间百分比
hi : time spent servicing hardware interrupts 硬件中断占用CPU时间百分比
si : time spent servicing software interrupts 软件中断占用CPU时间百分比
st : time stolen from this vm by the hypervisor 虚拟化hypervisor从当前虚拟机vm偷走的时间
如果st这个值很高的话,说明你的VPS提供商的CPU资源有限,而你没能抢过别人,很有可能就是VPS提供商超售了.
按F選擇要顯示的欄位和查看每個欄位的意義,預設有下面這些欄位:
PID = Process Id
USER = Effective User Name
PR = Priority PR和NI的值越高越友好即越不竞争资源,比如PR 20和NI 0,另外,PR=NI+20.
NI = Nice Value 负值表示高优先级,正值表示低优先级,比如kworker的NI为-20,PR为0.
VIRT = Virtual Image (KiB)
RES = Resident Size (KiB) 常驻内存,按E切换单位.
SHR = Shared Memory (KiB)
S = Process Status
%CPU = CPU Usage 四核处理器在Tasks模式下满载为400%,在Threads模式(按H切换)下满载为100%(一个线程最多只能使用一个核心).按Shift+P按CPU使用率排序.
%MEM = Memory Usage (RES) 满载为100%,按Shift+M按RES内存排序.
TIME+ = CPU Time, hundredths 进程使用的CPU时间总计.比如2:32.45代表2分钟32.45秒.
COMMAND = Command Name/Line
看进程路径: top -p `pidof firefox` -c -n1
看进程线程: top -p `pidof firefox` -H -n1
Linux Process Status: http://blog.csdn.net/tianlesoftware/article/details/6457487
R (task_running) : 可執行狀態 S (task_interruptible): 可中斷的睡眠狀態 D (task_uninterruptible): 不可中斷的睡眠狀態 T (task_stopped or task_traed追蹤狀態 Z (task_dead - exit_zombie): 退出狀態,進程成為殭屍進程 X (task_dead - exit_dead): 退出狀態,進程即將被銷毀
新手回答一下,不勝惶恐:
QA:cpu使用率說的的雙核一起嗎?
多大才是正常?
先谷歌再問,你的收穫會更大
Linux新手,個人認為首先就應該了解一下top命令各項的含義.
不用有事就問什麼搜尋引擎,先看看man top.
這句等同於執行uptime 指令回傳的內容.
16:12:56 是當前時間(
date
).up 1 day, 22 min 表示系統已經運作1天又22分鐘(
uptime -p
).4 users 表示目前登入系統的使用者(
w,who
).load average 表示系統負載,分別是1分鐘,5分鐘,15分鐘前到現在的負載平均值.
Tasks: 158 total 表示系統的進程數(數目等於
ps -ef|wc -l
的值減去2),按大寫H可以切換到線程模式.running表示正在運行的進程,sleeping表示睡眠的進程,stopped表示暫停的進程,zombie表示已結束但尚未從進程表中刪除的殭屍進程.
total表示總內存,used表示已經使用的內存,free表示空閒的內存,按E可以切換單位.
buffers(Buffer Cache)表示區塊裝置的讀寫緩衝區所佔用的記憶體,cached(Page Cache)表示檔案系統快取所佔用的記憶體.
buffers:區塊裝置緩衝cached:檔案系統快取
如果cached的值很大,說明cache住的文件數很多.如果頻繁訪問到的文件都能被cache住,那麼磁碟的讀I/O就非常小.
所謂塊設備是指對其信息的訪問以"區塊"為單位,如通常的光碟,硬磁碟,軟磁碟,磁帶等,區塊長取512位元組或1024位元組或4096位元組.
區塊裝置可以直接透過區塊裝置特別檔案存取,為了提高資料傳輸效率,區塊裝置驅動程式內部採用區塊緩衝技術.
Swap是交換空間,交換空間在物理記憶體(RAM)被填滿時被使用.
如果系統需要更多的記憶體資源,而物理內存已經充滿,內存中不活躍的頁就會被移到交換空間去.
雖然交換空間可以為帶有少量內存的機器提供幫助,但是這種方法不應該被當做是對內存的取代.
交換空間位於硬碟上,它比進入實體記憶體慢.
load average的理解:
load average指的是處於task_running或task_uninterruptible狀態的程序(或線程)數的平均值.
處於task_running狀態的進程(或線程),可能正在使用CPU或排隊等待使用CPU.
處於task_uninterruptible狀態的進程(或執行緒),可能正在等待I/O,例如等待磁碟I/O.這時I/O等待佔用的CPU時間百分比iowait(wa)可能會比較高.
0.22 0.13 0.14表示在過去的1分鐘,5分鐘,15分鐘,
正在運行(task_running)或等待IO(task_uninterruptible)的任務的數量.
2/374中的2表示當前運行的執行緒數,374則表示系統目前存在的核心調度實體(行程/執行緒)的數量.
5306是系統最近建立的行程PID編號.
又例如:
表示在過去的1分鐘,5分鐘,15分鐘的時間裡,CPU任務隊列中平均有30個程式(這裡應該是30個Java線程)在使用CPU.
Java進程的CPU使用率%CPU達到3090%,表示這個Java進程正在使用31個CPU核心,
這樣對上了上面load average得出的數據,也就是有30個左右的Java線程正在使用30個CPU核心.
按H(區分大小寫)切換到執行緒模式,因為一個執行緒最多只能使用一個核心,所以在執行緒模式下顯示的CPU使用率不會超過100%.
當CPU和磁碟都忙不過來的時候,開再多的進程也沒有任何意義,只會徒增CPU上下文切換和磁碟I/O等待,得不償失.
系統負載高,普遍是因為系統進程數太多,I/O太多導致的.
load average小於1表示系統空閒,大於1表示系統開始繁忙.
Linux伺服器的任務(進程)數量保持在200個以下是比較好的,最好不要超過300個.
按F選擇要顯示的欄位和查看每個欄位的意義,預設有下面這些欄位:
按F進入域管理視窗後按A可以切換顯示模式,按空格選中要顯示的列,按S按指定列排序,用向右方向鍵選中列後可以調整順序.
修改後按Shift+W儲存設定到~/.toprc檔.
top裡面按Shift+M是按內存排序,按E是切換內存單位,按Shfit+W保存設定.
然後執行
top -n1 -b
可以看到按內存排序的所有進程的信息.或ps後面用sort排序:
top裡按C或使用-c參數可以看到進程的絕對路徑和啟動參數,就可以得到類似ps -ef和ps aux提供的資訊了.
Linux Process Status:
http://blog.csdn.net/tianlesoftware/article/details/6457487
R (task_running) : 可執行狀態
S (task_interruptible): 可中斷的睡眠狀態
D (task_uninterruptible): 不可中斷的睡眠狀態
T (task_stopped or task_traed追蹤狀態
Z (task_dead - exit_zombie): 退出狀態,進程成為殭屍進程
X (task_dead - exit_dead): 退出狀態,進程即將被銷毀
running行程:
只有在該狀態的行程才可能在CPU上運作。
而同一時刻可能有多個進程處於可執行狀態,這些進程的task_struct結構(進程控制塊)被放入對應CPU的可執行隊列中(一個進程最多只能出現在一個CPU的可執行隊列中)。
進程調度器的任務就是從各個CPU的可執行佇列中分別選擇一個進程在該CPU上運作。
許多作業系統教科書將正在CPU上執行的程序定義為RUNNING狀態、而將可執行但是尚未被調度執行的程序定義為READY狀態,這兩種狀態在Linux下統一為TASK_RUNNING狀態。
sleeping進程:
處於這個狀態的進程因為等待某某事件的發生(例如等待socket連接、等待信號量),而被掛起。
這些行程的task_struct結構被放入對應事件的等待佇列中。當這些事件發生時(由外部中斷觸發、或由其他程序觸發),對應的等待佇列中的一個或多個程序將會被喚醒。
透過ps指令我們會看到,一般情況下,行程清單中的絕大多數行程都處於task_interruptible狀態(除非機器的負載很高)。
畢竟CPU就這麼一兩個,進程動輒幾十上百個,如果不是絕大多數進程都在睡眠,CPU又怎麼響應得過來。
stopped程序:
向行程發送sigstop訊號,它就會因回應該訊號而進入task_stopped狀態,除非該行程本身處於task_uninterruptible狀態而不回應訊號。
sigstop與sigkill訊號一樣,是非常強制的。不允許使用者程序透過signal系列的系統呼叫重新設定對應的訊號處理函數。
向進程發送sigcont訊號,可以讓其從task_stopped狀態恢復到task_running狀態。
當進程正在被追蹤時,它處於task_traced這個特殊的狀態。 「正在被追蹤」指的是進程暫停下來,等待追蹤它的進程對它進行操作。
例如在gdb中對被追蹤的進程下一個斷點,進程在斷點處停下來的時候就處於task_traced狀態。而在其他時候,被追蹤的進程還是處於前面提到的那些狀態。
對於進程本身來說,task_stopped和task_traced狀態很類似,都是表示進程暫停下來。
而task_traced狀態相當於在task_stopped之上多了一層保護,處於task_traced狀態的進程不能響應sigcont訊號而被喚醒。
只能等到調試進程透過ptrace系統呼叫執行ptrace_cont、ptrace_detach等操作(透過ptrace系統呼叫的參數指定操作),或調試進程退出,被調試的進程才能恢復task_running狀態。
zombie進程:
在Linux進程的狀態中,殭屍進程是非常特殊的一種,它是已經結束了的進程,但是沒有從進程表中刪除。
太多了會導致進程表裡面條目滿了,進而導致系統崩潰,倒是不佔用其他系統資源。
它已經放棄了幾乎所有記憶體空間,沒有任何可執行程式碼,也不能被調度,
僅在進程列表中保留一個位置,記載該進程的退出狀態等資訊供其他進程收集,除此之外,殭屍行程不再佔有任何記憶體空間。
進程在退出的過程中,處於TASK_DEAD狀態。在這個退出過程中,流程佔有的所有資源將會被回收,除了task_struct結構(以及少數資源)以外。
於是進程就只剩下task_struct這麼個空殼,故稱為殭屍。
之所以保留task_struct,是因為task_struct裡面保存了進程的退出碼、以及一些統計資料。
而其父進程很可能會關心這些資訊。例如在shell中,$?變數就保存了最後一個退出的前台程序的退出碼,而這個退出碼往往被當作if語句的判斷條件。
當然,核心也可以將這些資訊保存在別的地方,而將task_struct結構釋放掉,以節省一些空間。
但是使用task_struct結構比較為方便,因為在核心中已經建立了從pid到task_struct查找關係,還有進程間的父子關係。
釋放掉task_struct,則需要建立一些新的資料結構,以便讓父程序找到它的子程序的退出資訊。
子行程在退出的過程中,核心會給予其父行程一個訊號,通知父行程來「收屍」。
父進程可以透過wait系列的系統呼叫(如wait4、waitid)來等待某個或某些子程序的退出,並取得它的退出資訊。
然後wait系列的系統呼叫會順便將子程序的屍體(task_struct)也釋放掉。
這個訊號預設是SIGCHLD,但是透過clone系統呼叫建立子程序時,可以設定這個訊號。
如果他的父進程沒安裝SIGCHLD訊號處理函數呼叫wait或waitpid()等待子程序結束,又沒有明確忽略該訊號,那麼它就一直保持殭屍狀態,子程序的屍體(task_struct)也就無法釋放掉。
如果這時父進程結束了,那麼init進程自動會接手這個子進程,為它收屍,它還是能被清除的。
但是如果如果父進程是循環,不會結束,那麼子進程就會一直保持殭屍狀態,這就是為什麼系統中有時會有很多的殭屍進程。
當進程退出的時候,會將它的所有子進程都託管給別的進程(使之成為別的進程的子進程)。
託管的進程可能是退出進程所在進程組的下一個進程(如果存在的話),或者是1號進程。
所以每個行程、每時每刻都有父行程存在。除非它是1號進程。 1號進程,pid為1的進程,又稱init進程。
Linux系統啟動後,第一個被建立的用戶態進程就是init進程。它有兩個使命:
1、執行系統初始化腳本,創建一系列的進程(它們都是init進程的子孫);
2、在一個死循環中等待其子進程的退出事件,並呼叫waitid系統呼叫來完成「收屍」工作;
init進程不會被暫停、也不會被殺死(這是由核心來保證的)。它在等待子程序退出的過程中處於task_interruptible狀態,「收屍」過程中則處於task_running狀態。
不要用
top
,試試htop
。