Linux 記憶體及cpu解析
1、free :檢視記憶體、swap
[root@admin home]# free
total used free shared buffers cached
Mem: 1922264 222580 1699684 204 28104 61788
-/+ buffers/cache: 132688 1789576
Swap: 4194300 0 4194300
注意:檢視記憶體還剩多少空間時,只能看-/+ buffers/cache這行的數字,上行只能參考。
Linux的特性,將開啟過的檔案放到cached裡邊,所做過關於目錄結果的操作會放到buffers裡邊,當再次需要這些資料時,就會很快給開啟,這兩會不停的佔用記憶體,但是當記憶體不夠時,這兩部分空間會被瞬間被釋放。
2、uptime : 檢視load,啟動多少時間,目前有多少個使用者
這是cpu的效能檢視命令。
[[email protected] ~]# uptime
10:17:52 up 1 min, 2 users, load average: 0.12, 0.08, 0.03
各項資料解析:
10:17:52 : 系統幾點啟動的
up 1 min : 啟動多少時間,當這個時間超過180天時,系統重啟時會做檔案系統檢測,ext3有個特性,自檢特別慢。
2 users :當前有多少使用者在登入
load average: 0.12, 0.08, 0.03 : 平均負載 : 1分鐘平均,5分鐘平均,15分鐘平均
load average中這三個數很重要,主要衡量cpu工作的情況。這些數值的安全值計算方法為:cpu總核數 * 0.7,當1分鐘平均值 < 安全值時,說明這機器是健康的,運算能力能承載其任務量的。如果超過了,就很危險,而且會累計的,如果一直累計不釋放的話,就會導致機器宕機。
例項解析:
假如機器有 10 個核心,則安全值為 :10 * 0.7 = 7
例項一:
當load average三個數分別為:5,5,5,也就是說在1分鐘,5分鐘,15分鐘平均值都是5,也就是說機器穩定在5個任務,但是我機器是10核的cpu,總是可以滿足任務量的。這三個數要衡量著來看。例項二:
當load average三個數分別為:15,10,5,1分鐘,5分鐘,15分鐘平均值是15,10,5,這個時候說明1分鐘平均值高於了15分鐘的平均值,說明在1分鐘內機器的要處理的任務量突然升高,可以看出這個機器時一個突發的cpu增高,此時我們應該做的不是立刻去kill掉一些程序,而是先觀察1分鐘的平均值,如果在下降為5,10,15,說明近期內機器的任務量下去了,或者是任務被處理掉了等,說明機器已經回到平穩階段了。但是如果這個值在不停的增加,比如變成25,11,5,此時說明,機器確實存在問題了,在短期內有任務量劇增,這時就必須去檢視是什麼原因引起。
3、cat /proc/cpuinfo : 檢視cpu的核數
檔案/proc/cpuinfo裡面存著cpu的很多基本資訊,如核數。
4、vmstat :LInux/Unix監控工具
vmstat命令可以展現在給定時間間隔伺服器的狀態值,包括伺服器的CPU使用率、記憶體使用情況、虛擬記憶體互動情況、IO讀寫情況等。
vmstat工具的使用是通過兩個數字引數來完成的,第一個引數是取樣的時間間隔數,單位是秒,第二個引數是取樣的次數,但是我們一般用第一個引數就行。
解析:
2表示每2秒採集一次,都是平均值,這裡採集了4次就按ctrl + c停止了。其中第一行是開機到現在的平均值,下邊是沒2秒計算一次的平均值,這樣就有一個對比。
下面是每個欄位分別代表的意思:
(1)程序procs:
r : 代表執行佇列中程序數量。基本上可以反應uptime中load average的值,基本上相等。當這個值超過CPU數目,就會出現CPU瓶頸了。
b : 等待磁碟IO的程序數量,也表示阻塞的程序數量。這個值反應的是後面的wa的情況,它兩是聯動的。通常情況下,該引數的值都是0,一般都在0,1,2..然後又回到0,這都是正常情況。如果這個數出現了長時間的累加,說明磁碟出問題了,系統即將崩潰,有可能IO寫不進去了,所有的程序都在等待寫。
r + b的值就是load average的值,也就是說r + b的值不能長時間超過CPU核數 * 0.7,尤其是CPU的核數。也可以是長時間不能超過 CPU核數 * 0.7 * n ,n表示的1顆cpu的執行緒數。
(2)Linux 記憶體監控記憶體memoy:
swpd :虛擬記憶體已使用的大小,如果大於0,表示你的機器實體記憶體不足了,如果不是程式記憶體洩露的原因,那麼你該升級記憶體了或者把耗記憶體的任務遷移到其他機器。
free = buff + cache,一般直接使用free命令檢視
(3) Linux 記憶體監控swap交換頁面
si : 每秒從交換區寫到記憶體的大小。如果這個值大於0,表示實體記憶體不夠用或者記憶體洩露了,要查詢耗記憶體程序解決掉。我的機器記憶體充裕,一切正常。
so : 每秒從記憶體寫到交換區的大小。如果值大於0,同上。
(4)Linux 記憶體監控 io塊裝置:
bi : 對系統來說,每秒讀取的塊數(從磁碟讀取)
bo : 對系統來說,每秒寫入的塊數(像磁碟寫)。bi 和 bo的值的大小(一般都是接近0 的)會直接影響到b wa的值。
(5)Linux 記憶體監控system系統:
in : 每秒CPU的中斷次數,包括時間中斷。
cs : 每秒上下文切換次數,例如呼叫系統函式時,就要進行上下文切換,執行緒切換等,也要程序上下文切換,這個值要越小越好,太大了,要考慮調低執行緒或者程序的數目,例如在apache和nginx這種web伺服器中,我們一般做效能測試時會進行幾千併發甚至幾萬併發的測試,選擇web伺服器的程序可以由程序或者執行緒的峰值一直下調,壓測,直到cs到一個比較小的值,這個程序和執行緒數就是比較合適的值了。系統呼叫也是,每次呼叫系統函式,我們的程式碼就會進入核心空間,導致上下文切換,這個是很耗資源,也要儘量避免頻繁呼叫系統函式。上下文切換次數過多表示你的CPU大部分浪費在上下文切換,導致CPU幹正經事的時間少了,CPU沒有充分利用,是不可取的。
(6)Linux 記憶體監控cpu中央處理器:
us : 使用者程序佔用CPU的時間,是一個百分比。
sy : 系統程序佔用CPU的執行時間,如系統核心,bash等。
id : CPU空閒時間,在LInux系統上這個值經常性要大於50%,機器才算正常。
wa : CPU等待IO所佔時間的百分比。通常不能超過20%,如果長時間超過會因為等待IO,而造成大量的運算資源堆積,運算速度越來越慢,也就是說磁碟的讀寫速度跟不上你的機器的運算速度了,需要考慮提升磁碟的讀寫速度,最簡單的就是換一塊SSD盤(固態盤)。
5、pidstat :實時監控執行程序命令
pidstat主要用於監控全部或指定程序佔用的系統資源的情況,如CPU,記憶體,裝置IO,任務切換,執行緒等。pidstat首次執行時顯示自系統啟動開始的各項統計資訊,之後執行pidstat將顯示自上次執行該命令以後的統計資訊。使用者可以通過指定統計的次數和時間來獲得所需要的統計資訊。
6、ps :列出系統中當前執行的程序,相當於Windows的工作管理員
ps是顯示瞬間行程的狀態,並不動態連線,如果想對程序執行時間監控,應該用top工具,kill用於殺死程序。
使用該命令可以確定有哪些程序正在執行和執行的狀態、程序是否結束、程序有沒有僵死、哪些程序佔用了過多的資源等等。
Linux上程序的5種狀態:
- 執行(正在執行或在執行對列中等待)
- 中斷(休眠中,受阻,在等待某個條件的形成或接受訊號)
- 不可中斷(收到訊號不喚醒和不可執行,程序必須等待直到有中斷髮生)
- 僵死(程序已終止,但程序描述符存在,直到父程序呼叫wait4()系統呼叫後釋放)
- 停止(程序收到SIGSTOP,SIGSTP,SIGTIN,SIGTOU訊號後停止執行)
ps工具標識程序的5中狀態碼:
- D 不可中斷 uninterruptible sleep (usually IO)
- R 執行 runnable (on run queue)
- S 中斷 sleeping
- T 停止 traced or stopped
- Z 僵死 a defunct (”zombie”) process
命令引數:
a:顯示所有程序
-a:顯示同一終端下的所有程序
c:顯示程序的真實名稱
-e:顯示所有程序
e:顯示環境變數
f:顯示程式間的關係
-u: 顯示指定使用者的所有程序
aux:顯示所有包含其他使用者的行程
ps 常與 grep組合使用,查詢特定的程序,如ps -ef | grep ssh
[root@admin ~]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 07:37 ? 00:00:01 /sbin/init
root 2 0 0 07:37 ? 00:00:00 [kthreadd]
相關資訊的意義:
UID :程式被UID所擁有
PID :程序的ID
PPID :上級父程序的ID
C :佔用CPU的百分比
STIME :啟動時間,超過1年就變成年了,超過1天就變成日期了
TTY :登入者的終端機位置
TIME : 使用掉的CPU時間
CMD :程序的名稱
[root@admin ~]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 19364 1524 ? Ss 07:37 0:01 /sbin/init
root 2 0.0 0.0 0 0 ? S 07:37 0:00 [kthreadd]
各項引數解析:
%CPU :佔CPU的百分比
%MEM :佔記憶體的百分比
VSZ :使用的虛擬記憶體量
RSS :程序佔用實際的固定記憶體量
STAT :S:休眠的程序,sn :表示處於休眠的優先順序較低的程序,Ss :表示有子程序,S < s :表示優先順序比較高的程序,Z :代表僵死程序
7、top :實時監控Linux的系統狀況
top是最重要的效能分析命令,是一個動態顯示過程,實時對系統處理器的狀態監視,將顯示系統中CPU最敏感的任務列表。
[root@admin ~]# top
top - 09:42:39 up 2:04, 2 users, load average: 0.00, 0.00, 0.00
Tasks: 89 total, 1 running, 88 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.2%us, 0.0%sy, 0.0%ni, 99.8%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 1922264k total, 217996k used, 1704268k free, 27864k buffers
Swap: 4194300k total, 0k used, 4194300k free, 61616k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
12 root 20 0 0 0 0 S 0.3 0.0 0:03.25 events/1
1835 root 20 0 15032 1168 912 R 0.3 0.1 0:00.82 top
解釋:
top命令跟ps很像。top第一行的數值跟uptime很像
Tasks: 89 total, 1 running, 88 sleeping, 0 stopped, 0 zombie表示有89個任務,1個在執行,88個在休眠,0個在後臺執行,0個僵死程序,通過ctrl + z可以造出stopped程序,但最好不用這個,這個不是個好習慣。
PR :優先順序
NI :負值表示低優先順序,正直表示高優先順序,大部分是0
VIRT : 虛擬記憶體
RES :實際使用的記憶體
SHR :share記憶體,共享記憶體,有可能被別的程序用到
調整顯示的列方法:
在top執行介面按一下f 鍵,可以進入到需要顯示列的選擇介面,然後按最前面對應的字母鍵,就可以選中需要顯示的列,然後按任意鍵,通常為空格,就可以回到top執行介面,可以看到剛選中需要顯示的列的值。
調整顯示的順序方法:
在top執行介面,按 o 鍵,進入到顯示先後順序介面,如p字母,按小寫的p就是像下移動,按shift + p,就是像上移動。
按照某個列排序顯示調整方法:
按大寫的F或O,進入到調整介面,同樣按前面對應的字母然後再按任意鍵出去就ok了。
top是很耗資源的,當機器記憶體嚴重不足時,最好別用這個命令,有可能讓機器徹底宕機。
8、sar :系統性能分析工具
sar(System Activity Reporter系統活動情況報告)是目前Linux上最為全面的系統系統性能分析工具之一,可以從多方面對系統的活動進行報告,包括:檔案的讀寫情況、系統呼叫的使用情況、磁碟I/O、CPU效率、記憶體使用狀況、程序活動及IPC有關的活動等。
sar命令常用格式:
sar [options] [-A] [-o file] t [n]
引數說明:
t :取樣間隔,預設為1
n :取樣次數,預設為1
-o file 將命令結果以二進位制格式存放到檔案中,file是檔名。
options:命令列選項。常見命令如下:
- -A:所有報告的總和
- -u:輸出CPU使用情況的統計資訊
- -v:輸出inode、檔案和其他核心表的統計資訊
- -d:輸出每一個塊裝置的活動資訊
- -r:輸出記憶體和交換空間的統計資訊
- -b:顯示I/O和傳送速率的統計資訊
- -a:檔案讀寫情況
- -c:輸出程序統計資訊,每秒建立的程序數
- -R:輸出記憶體頁面的統計資訊
- -y:終端裝置活動情況
- -w:輸出系統交換活動資訊
9、kill :殺程序命令
格式:
kill [-s signal | -p ] [-a] pid ...
kill -l [signal ]
引數:
-s :指定傳送的訊號
-p :模擬傳送的訊號
-l :指定訊號的名稱列表
pid :要中止程序的ID號
signal :表示信
kill -9 :強制中止一個程序,但是隻殺當前的程序,與當前相關的程序殺不掉,比如說如果殺了某個程序的父程序,那麼其子程序就被留下了,怎麼也殺不掉了,這時只能重啟機器了。所以一般不用這個命令。