一,CPU
cpu負載是邏輯的判斷與處理(類似人的大腦),
CPU 主要是運行程序的速度,影響速度的主要是主頻(越高越快,但不是線性關系)、外頻(基准頻率、外頻決定整個主板運行速度,超頻就是超外頻,超頻會導致不穩定)、緩存容量(緩存的大小對cpu速度影響很大,緩存大,命中率高,速度就快,L1緩存與處理器同頻運行,二級緩存內部和主頻相同,外部是主頻的一半,但比內存快得多)、邏輯結構
查看指令:
1,cat /proc/cpuinfo
2,top
使用格式: top [-] [d] [p] [q] [c] [C] [S] [s] [n] 參數說明: d:指定每兩次屏幕信息刷新之間的時間間隔。當然用戶可以使用s:交互命令來改變之。 p:通過指定監控進程ID來僅僅監控某個進程的狀態。 i:使top不顯示任何閑置或者僵死進程。 c:顯示整個命令行而不只是顯示命令名
top 運行中內部命令如下:
s – 改變畫面更新頻率
l – 關閉或開啟第一部分第一行 top 信息
t – 關閉或開啟第一部分第二行 Tasks 和第三行 Cpus 信息
m – 關閉或開啟第一部分第四行 Mem 和 第五行 Swap 信息
N – 以 PID 的大小的順序排列表示進程列表
P – 以 CPU 占用率大小的順序排列進程列表
M – 以內存占用率大小的順序排列進程列表
T – 按消耗cpu時間排序
h – 顯示幫助
n – 設置在進程列表所顯示進程的數量
q – 退出 top
= - 移除所有任務顯示限制
H - 切換線程和進程模式
U - 指定用戶相關進程
r - 重新設定進程的nice值
W - 存儲當前設定
top 信息詳解:
當前系統時間 啟動時間長度 3個用戶 最近5、10、15分鍾平均負載----cpu+io等待
進程 總共192個進程 1個運行 191個休眠 0個停止 0個僵屍(進程的一種狀態)
%us 用戶進程的cpu時間 %sy系統內核進程的cpu時間 %ni niced:運行已調整優先級的用戶進程的CPU時間 %wa IO wait: 用於等待IO完成的CPU時間 %hi hi:處理硬件中斷的CPU時間 %si: 處理軟件中斷的CPU時間 %st:強制上下文切換消耗的cpu時間
Mem 總物理內存 used 使用內存 free剩余內存 buffers 緩沖區 存放將要寫入磁盤的數據
Swap 虛擬內存 一小部分內存和一大部分磁盤一起虛擬出來的空間 total 總虛擬內存 Free 空閑虛擬內存 持續減少一點是內存有瓶頸了(物理內存不夠用) Cached 緩存區,是高速緩存,cpu頻繁讀的數據放入緩存區 , 從Cache中讀取數據會更快,減少了CPU等待的時間,提高了系統的性能。
PID:進程ID,進程的唯一標識符
USER:進程所有者的實際用戶名。
PR:進程的調度優先級。這個字段的一些值是'rt'。這意味這這些進程運行在實時態。
NI:進程的nice值(優先級)。越小的值意味着越高的優先級。負值表示高優先級,正值表示低優先級,默認20
VIRT:進程使用的虛擬內存。進程使用的虛擬內存總量,單位kb。VIRT=SWAP+RES RES:駐留內存大小。駐留內存是任務使用的非交換物理內存大小。進程使用的、未被換出的物理內存大小,單位kb。
RES=CODE+DATA
SHR:SHR是進程使用的共享內存。共享內存大小,單位kb
S:這個是進程的狀態。它有以下不同的值: D - 不可中斷的睡眠態。 R – 運行態 S – 睡眠態 T – 被跟蹤或已停止 Z – 僵屍態
%CPU:自從上一次更新時到現在任務所使用的CPU時間百分比。 %MEM:進程使用的可用物理內存百分比。
TIME+:任務啟動后到現在所使用的全部CPU時間,精確到百分之一秒。
COMMAND:運行進程所使用的命令。進程名稱(命令名/命令行)
VIRT:virtual memory usage 虛擬內存
1、進程“需要的”虛擬內存大小,包括進程使用的庫、代碼、數據等
2、假如進程申請100m的內存,但實際只使用了10m,那么它會增長100m,不是實際使用量
RES:resident memory usage 常駐內存
1、進程當前使用的內存大小,但不包括swap out,包含其他進程的共享
2、如果申請100m的內存,實際使用10m,它只增長10m,與VIRT相反
3、關於庫占用內存的情況,它只統計加載的庫文件所占內存大小
SHR:shared memory 共享內存
1、除了自身進程的共享內存,也包括其他進程的共享內存
2、雖然進程只使用了幾個共享庫的函數,但它包含了整個共享庫的大小
3、計算某個進程所占的物理內存大小公式:RES – SHR
DATA:
1、數據占用的內存。如果top沒有顯示,按s鍵可以顯示出來。
2、真正的該程序要求的數據空間,是真正在運行中要使用的。
top的交互命令:
h 切換到交互命令窗口
1 顯示多核的cpu占用情況
f 進入新試圖 排基本試圖的顯示字段 如 s 顯示data
U 輸入用戶名選項查看對應用戶的進程
K 輸入進程號和信號 終止進程 15普通終止 9 強制終止
b 打開和關閉行高亮
x 打開和關閉排序列高亮
------------------------------------------------------------
cpu高的定位方法:
1、查看那個進程占用CPU高 執行Top
2、查看進程下的那個線程占用CPU高 Top –H –p 進程號
3、按CPU排序-輸入P 定位到那個線程CPU占用高 再查詢此線程執行的方法
------------------------------------------------------------
vmstat的使用方法:
-a:顯示活躍和非活躍內存
-f:顯示從系統啟動至今的fork數量(linux下創建進程調用fork方法)
-m:顯示slabinfo(內核創建的一些小對象的信息展示)
-n:只在開始時顯示一次各字段名稱。
-s:顯示內存相關統計信息及多種系統活動數量。
delay:刷新時間間隔。如果不指定,只顯示一條結果。
count:刷新次數。如果不指定刷新次數,但指定了刷新時間間隔,這時刷新次數為無窮。
-d:顯示磁盤相關統計信息。
-p:顯示指定磁盤分區統計信息
-S:使用指定單位顯示。參數有 k 、K 、m 、M ,分別代表1000、1024、1000000、1048576字節(byte)。默認單位為K(1024 bytes)
-V:顯示vmstat版本信息
vmstat 2 5 :每2秒采集一次,共計采集5次
Procs 進程
r cpu正在運行的進程數,如果超過cpu核數,cpu有瓶頸
b 等待資源的進程數,比如等待io或者cpu運行的進程數,大於0說明cpu有瓶頸
Memory內存
Swpd 虛擬內存已使用的大小,如果大於0,表示你的機器物理內存不足了
Free 空閑的物理內存大小,默認KB
Buff 已經使用的buff大小
Cache 已使用的cache大小
Swap虛擬內存
Si 每秒從虛擬內存寫入內存的大小(KB/s),如果長期大於0,說明內存不足
So 每秒從內存寫到虛擬內存的大小(KB/s),如果長期大於0,說明內存不足
io 磁盤io
Bi 表示由每秒讀入的塊 Bo 表示寫的塊 單位block 硬盤讀寫的最小單位是扇區,一個扇區是512 bytes,一次讀寫的數據量就稱為1個block,基本可以按乘512來根據block計算出讀寫的實際數據量
System
In 表示每秒產生的中斷次數
Cs 每秒產生的上下文切換次數,in和cs越大,表示內存消耗的cpu越多
Cpu
Us 用戶消耗的cpu百分比,如果大於50%需要關注了
Sy 內核消耗的cpu百分比,如果us+sy大於80%需要關注
Id cpu處於空閑時間的百分比
Wa 等待所占的cpu百分比,wa值高,說明io等待嚴重,磁盤有瓶頸,不超20%
St 被動上下文切換消耗cpu時間,如果in、cs和st高的話,可以通過pidstat -wt -u 1 命令查看是主動切換(cswch)還是被動切換(nswch),進一步分析,如果是被動切換比較高,說明是磁盤io有問題
------------------------------sar------------------------------------------
sar(System ActivityReporter系統活動情況報告)是目前Linux上最為全面的系統性能分析工具之一,可以從多方面對系統的活動進行報告,包括:文件的讀寫情況、系統調用的使用情況、磁盤I/O、CPU效率、內存使用狀況、進程活動及IPC有關的活動等,sar命令由sysstat安裝包安裝
用法: sar [ 選項 ] [ <時間間隔> [ <次數> ] ] 選項: [ -A ] [ -B ] [ -b ] [ -C ] [ -d ] [ -H ] [ -h ] [ -p ] [ -q ] [ -R ] [ -r ] [ -S ] [ -t ] [ -u [ ALL ] ] [ -V ] [ -v ] [ -W ] [ -w ] [ -y ] [ -I { <中斷> [,...] | SUM | ALL | XALL } ] [ -P { <cpu> [,...] | ALL } ] [ -m { <關鍵詞>
Sar 使用語法:
-A:所有報告的總和
-b:顯示I/O和傳遞速率的統計信息(緩沖區使用情況)
-B:顯示換頁狀態
-d:輸出每一塊磁盤的使用信息
-e:設置顯示報告的結束時間
-q:顯示運行的隊列大小,它與系統當時的平均負載相同
-i:設置狀態信息刷新的間隔時間
-P:報告每個CPU的狀態
-r:顯示內存狀態
–u:輸出cpu使用情況和統計信息
–v:顯示進程、索引節點、文件和其他內核表的狀態
-W:顯示交換分區的狀態
-n:顯示網絡使用情況
這個命令主要是監控cpu的,每2秒收集一次,總共收集3次。等同於sar -p 2 3
%usr 用戶進程消耗的cpu時間百分比
%nice 改變過優先級的進程的占用CPU時間的百分比
%system 系統進程消耗的cpu時間百分比
%iowait I/O等待所占cpu時間百分比
%steal (Steal time)是當hypervisor服務另一個虛擬處理器的時候,虛擬CPU等待實際CPU的時間的百分比;高steal值可能意味着主機供應商在服務器上過量地出售虛擬機。steal值還是不降的話,你應該尋找另一家服務供應商。
%idle cpu空閑狀態的時間占比
需要注意的指標:%iowait和%idle,%wio過高表示磁盤I/O瓶頸;%idle值高表示cpu空閑,%idle值持續低於10%,表示cpu存在性能瓶頸
Sar –q 信息詳解-查看cpu性能問題:
Runq-sz 運行隊列的長度(等待運行的進程數,每核的CP不能超過3個)
plist-sz 進程列表中的進程(processes)和線程數(threads)的數量
ldavg-1 最后1分鍾的CPU平均負載,即將多核CPU過去一分鍾的負載相加再除以核心數得出的平均值
ldavg-5 最后5分鍾的CPU平均負載
ldavg-15 最后15分鍾的CPU平均負載
Sar –r 信息詳解—查看內存使用情況:
Kbmemfree 空閑的物理內存大小
Kbmemused 使用的物理內存
%memused 物理內存使用率(占比)
Kbbuffers 內核中作為緩沖區使用的物理內存大小,kbbuffers和kbcached:這兩個值就是free命令中的buffer和cache以核心數得出的平均值
Kbcached 緩存的文件大小
Kbcommit 保證當前系統正常運行所需要的最小內存,即為了確保內存不溢出而需要的最少內存(物理內存+Swap分區)
%commit 這個值是kbcommit與內存總量(物理內存+swap分區)的一個百分比的值
Sar –B 信息詳解:
Pgpgin/s 表示每秒從磁盤或SWAP置換到內存的字節數(KB)
Pgpgout/s 表示每秒從內存置換到磁盤或SWAP的字節數(KB)
Fault/s 每秒鍾系統產生的缺頁數,即主缺頁與次缺頁之和
Majflt/s 每秒鍾產生的主缺頁數
Pgfree/s 每秒被放入空閑隊列中的頁個數
Pgscank/s 每秒被kswapd掃描的頁個數
Pgscand/s 每秒直接被掃描的頁個數
Pgsteal/s 每秒鍾從cache中被清除來滿足內存需要的頁個數
%vmeff 每秒清除的頁(pgsteal)占總掃描頁(pgscank+pgscand)的百分比
Sar –v 信息詳解:
Dentunusd 在緩沖目錄條目中沒有使用的條目數量
File-nr 被系統使用的文件句柄數量
Inode-nr 已經使用的索引數量
Pty –nr 使用的pty數量 這里面的索引和文件句是sysctl.conf里面定義的和內核相關的值, max-file表示系統級別的能夠打開的文件句柄的數量, 可以sysctl -a | grep file查看,具體含義如下: file-max中指定了系統范圍內所有進程可打開的文件句柄的數量限,當收到"Too many open files in system"這樣的錯誤消息時, 就應該曾加這個值了。
-------------------------IO-------------------------------
Tps 磁盤每秒鍾的IO總數,等於iostat中的tps
Rtps 每秒鍾從磁盤讀取的IO總數
Wtps 每秒鍾從寫入到磁盤的IO總數
Bread/s 每秒鍾從磁盤讀取的塊總數
Bwrtn/s 每秒鍾此寫入到磁盤的塊總數
一次I/O 當進程發起系統調用時,系統調用就進入內核模式, 然后開始I/O操作 I/O操作分為倆個步驟:
1) 磁盤把數據裝載進內核的內存空間
2) 內核的內存空間的數據copy到用戶的內存空間中(此過程才是真正I/O發生的地方)
一次io的詳細處理過程分析:
進程需要對磁盤中的數據進行操作,則會向內核發起一個系統調用,然后此進程,將會被切換出去;此進程會被掛起或者進入睡眠狀態,也叫不可中 斷的睡眠,因為數據還沒有得到,只有等到系統調用的結果完成后,則進程會被喚醒,繼續接下來的操作,從系統調用的開始到系統調用結束經過的步驟:
1,進程向內核發起一個系統調用,
2,內核接到系統調用,知道是對文件的請求,於是告訴磁盤,把文件讀取出來
3,磁盤接收到來着內核的命令后,把文件載入到內核的內存空間里面
4,內核的內存空間接收到數據之后,把數據copy到用戶進程的內存空間(此過程是I/O發生的地方)
5,進程內存空間得到數據后,給內核發送通知
6,內核把接收到的通知回復給進程,此過程為喚醒進程,然后進程得到數據,進行下一步操作
Sar –d 信息詳解—查看磁盤是否有瓶頸:
Dentunusd 在緩沖目錄條目中沒有使用的條目數量
Tps 每秒I/O的次數
Rd_sec/s 每秒讀扇區的大小
Wr_sec/s 每秒寫扇區的大小
Avgrq-sz 每次操作的I/o大小
Avgqu-sz 磁盤隊列的長度,反映磁盤的繁忙程度
Await 操作磁盤的平均處理時間,等於尋道時間+隊列時間+服務時間(毫秒)
Svctm 每次磁盤處理消耗的時間,不包含隊列時間,不大於0.5,體現磁盤性能
%util I/O請求占用的CPU百分比,值越高,說明I/O越慢
Sar –w 信息詳解-查看內存是否有瓶頸:
Pswpin/s 每秒換入的交換頁面(swap page)數量
Pswpout/s 每秒換出的交換頁面(swap page)數量
----------------------------網絡-----------------------------------------
sar -n DEV 信息詳解-查看網絡瓶頸:
Iface 網卡名稱
Rxpck/s 每秒接收的數據包
Txpck/s 每秒發送的數據包
rxkB/s 每秒接收的字節數,單位kb(重點看)
txkB/S 每秒發送的字節數,單位kb(重點看)
Rxcmp/S 每秒鍾接受的壓縮數據包
Txcmp/S 每秒鍾發送的壓縮包
Rxmcst/S 每秒鍾接收的多播數據包
場景:如果我監控的數據是120000kb,負載機和被壓測的服務器之間的帶寬是1GB(調研所得),壓測結果監控網卡的數據為120000kb,120000KB*8=960000KB,960000KB/1024=937.5Mb,非常接近帶寬
1KB=8kb
1MB=1024KB
1GB=1024MB
sar -n SOCK 信息詳解查看連接數:
Totsck 當前被使用的socket總數
Tcpsck 當前正在被使用的TCP的socket總數
Udpsck 當前正在被使用的UDP的socket總數
Rawsck 當前正在被使用於RAW的skcket總數
Ip-frag 當前的IP分片的數目
Tcp-tw TCP套接字中處於TIME-WAIT狀態的連接數量
--------------------iostat-----------------
Iostat 使用語法:
用法:iostat [ 選項 ] [ <時間間隔> [ <次數> ]] 常用選項說明:
-c:只顯示系統CPU統計信息,即單獨輸出avg-cpu結果,不包括device結果
-d:單獨輸出Device結果,不包括cpu結果
-k/-m:輸出結果以kB/mB為單位,而不是以扇區數為單位
-x:輸出更詳細的io設備統計信息
interval/count:每次輸出間隔時間,count表示輸出次數,不帶count表示循環輸出
Iostat –x信息詳解:
%user 用戶進程消耗CPU時間的百分比
%nice 改變過優先級的進程的占用CPU時間的百分比
%system 系統進程消耗的CPU時間的百分比
%iowait I/O等待所占cpu時間百分比
%steal (Steal time)是當hypervisor服務另一個虛擬處理器的時候,虛擬CPU等待實際CPU的時間的百分比,如果高說明虛擬機虛的cpu太多了;
%idle cpu空閑狀態的時間占比
%rrqm/s 每秒進行合並的讀操作次數
%wrqm 每秒進行合並的寫操作次數
%r/s 每秒完成讀的I/O設備的次數
%w/s 每秒完成寫的I/O設備的次數
%rsec/s 每秒讀的扇區
%wsec/s 每秒寫的扇區
Avgrq-sz 每個請求平均大小,單位是扇區數
Avgqu-sz 平均等待處理的io請求隊列長度
Await 每次I/O操作磁盤的平均時間,等待時間+磁盤處理時間,單位毫秒,一般低於5毫秒,大於10毫秒就比較大了
Svctm 平均每次磁盤處理時間,真正的磁盤操作耗時,不包含等待,單位毫秒
%util 一秒鍾用於I/O操作的時間占比,超過80%認為I/O繁忙
Iostat –c 信息詳解:
%user 用戶進程消耗CPU時間的百分比
%nice 改變過優先級的進程的占用CPU時間的百分比
%system 系統進程消耗的CPU時間的百分比
%iowait I/O等待所占cpu時間百分比
%steal (Steal time)是當hypervisor服務另一個虛擬處理器的時候,虛擬CPU等待實際CPU的時間的百分比,如果高說明虛擬機虛的cpu太多了;
%idle cpu空閑狀態的時間占比
Iostat –d 信息詳解:
ps 磁盤每秒鍾的IO總數
Blk_read/s 每秒讀取的數據塊數
Blk_wrtn/s 每秒寫入的數據塊數
Blk_read 讀取的數據塊總數
Blk_wrtn 寫入的數據塊總數
塊是個虛擬出來的概念,操作系統與磁盤打交道的最小單位是磁盤塊。一般是4k大小必須是扇區(512k)的整數倍。操作系統操作磁盤,也需要通過磁盤驅動器進行。所以離不開扇區的;fdisk –l 查看扇區信息
----------------free--------------------
free 命令語法:
參 數:
-b 以Byte為單位顯示內存使用情況。
-k 以KB為單位顯示內存使用情況。
-m 以MB為單位顯示內存使用情況。
-o 不顯示緩沖區調節列。
-s<間隔秒數> 持續觀察內存使用狀況。
-t 顯示內存總和列。
-V 顯示版本信息。
total:表示物理內存總量(total = used + free)
used:表示總計分配給緩存(包含buffers 與cache )使用的數量,但其中可能部分緩存並未實際使用
free:未被分配的內存
shared:多個進程的共享內存總和
buffers:系統分配但未被使用的buffers 數量
cached:系統分配但未被使用的cache 數量
-------------------------netstat-------------------
Netstat 使用語法:
語法
netstat [-acCeFghilMnNoprstuvVwx][-A<網絡類型>][--ip]
參數說明:
-a或--all 顯示所有連線中的Socket
-c或--continuous 持續列出網絡狀態
-e或--extend 顯示網絡其他相關信息
-i或--interfaces 僅列出有在listen(監聽)的服務狀態
-n或--numeric 直接使用IP地址,而不通過域名服務器。
-p或--programs 顯示正在使用Socket的程序識別碼和程序名稱。
-r或--route 顯示R路由信息和當前有效連接
-s或--statistice 顯示網絡工作信息統計表,按協議統計
-t或--tcp 顯示TCP傳輸協議的連線狀況
-u或--udp 顯示UDP傳輸協議的連線狀況
MTU 表示最大傳輸單元,單位字節
RX-OK/TX-OK 表示已准確地接收/發送了多少數據包(重點)
RX-ERR/ TX-ERR 表示接收/發送數據包時產生了多少錯誤(重點,不能有值,有值就說明有錯誤)
RX-DRP/TX –DRP 表示接收/發送數據包時丟棄了多少數據包(重點,不能有值,有值就說明有錯誤)
RX-OVR/TX-OVR 表示由於誤差而丟失了多少數據包(重點,不能有值,有值就說明有錯誤)
FLG 表示接口標記,其中:
B 已經設置了一個廣播地址
L 該接口是一個回送設備
M 接收所有數據包(混亂模式)
N 避免跟蹤 O 在該接口上,禁止ARP
P 這是一個點到點鏈接
R 接口正在雲
U 接口處於“活動”狀態
RX-ERR/ TX-ERR,RX-DRP/TX –DRP,RX-OVR/TX-OVR 應該為0或者接近0,如果持續很大,網絡質量肯定有問題
Netstat 常用命令:
netstat -an | awk '/^tcp/ {++S[$NF]} END {for (a in S) print a,S[a]} '
netstat -ap | grep ssh ----->找出程序運行的端口
netstat -pt ---->輸出中顯示 TCP連接信息
----------------------------uptime------------------------------------
19:31:50 當前時間
up 9 days, 6:55 運行了多久
1 user 運行了1個用戶
Load average 在特定時間間隔內運行隊列中進程數
當單cpu單核時,load averages>1則系統繁忙且面臨崩潰
當單cpu多核時,load averages=1則運行正常,通常我們先看15分鍾load,如果load很高,再看1分鍾和5分鍾負載,查看是否有下降趨勢,1分鍾負載值 > 1,那么我們不用擔心,但是如果15分鍾負載都超過1,我們要趕緊看看發生了什么事情。所以我們要根據實際情況查看這三個值
ps 監測當前進程的情況:
參數:
-A 所有的進程均顯示出來,與 -e 具有同樣的效用
-a 顯示現行終端機下的所有進程,包括其他用戶的進程
-u 以用戶為主的進程狀態 -x 通常與 a 這個參數一起使用,可列出較完整信息
-e 命令之后顯示環境
輸出格式規划:
l 較長、較詳細的將該PID 的的信息列出
j 工作的格式 (jobs format)
-f :做一個更為完整的輸出
ps –aux|more信息詳解:
User 運行進程的用戶
Pid 運行的進程id,kill進程就是k這個id
%CPU 進程占用CPU的百分比
% MEM 進程占用內存的百分比
VSZ 占用的虛擬記憶體大小
RSS 占用的記憶體大小
TTY 終端的次要裝置號碼 (minor device number of tty)
STAT 該行程的狀態 START 進程啟動時間
TIME 進程執行的時間
COMMAND 所執行的指令
-----------------------strace---------------------------------
Strace 命令:
常用來跟蹤進程執行的系統調用和接收的信號,linux下,進程不能直接訪問硬件設備,當進程需要訪問硬件設備(比如讀取磁盤文件,接收網絡數據等等)時,必須由用戶態模式切換至內核態模式,通過系統調用訪問硬件設備。strace可以跟蹤到一個進程產生的系統調用,包括參數,返回值,執行消耗時間
常用選項:
-tt 在每行輸出的前面,顯示毫秒級別的時間
-T 顯示每次系統調用所花費的時間
-v 對於某些相關調用,把完整的環境變量,文件stat結構等打出來。
-f 跟蹤目標進程,以及目標進程創建的所有子進程
-e 控制要跟蹤的事件和跟蹤行為,比如指定要跟蹤的系統調用名稱
-o 把strace的輸出單獨寫到指定的文件
-s 當系統調用的某個參數是字符串時,最多輸出指定長度的內容,默認是32個字節
-p 指定要跟蹤的進程pid, 要同時跟蹤多個pid, 重復多次-p選項即可。