對于Linux 環境,top
命令是使用頻繁且信息較全的命令, 它對于所有正在運行的進行和系統負荷提供實時更新的概覽信息。stress
是個簡單且全面的性能測試工具。通過它可以模擬各種高負載情況。
通過top
與stress
這兩個命令的結合使用,基本可以達到壓力測試的目的。
1. 查看硬件資源
# 查看cpu個數
cat /proc/cpuinfo# 查看內存大小
cat /proc/meminfo# 查看當前內存使用情況
free -h# 查看磁盤大小
df -h# 查看當前文件夾已用磁盤大小
du -sh ./*
2. 查看資源實時使用率——top命令
執行top
命令
2.1 第一行
top - 03:13:05 up 7 days, 1:29, 4 users, load average: 0.85,0.67.0.57
- top: 當前時間
- up: 機器運行了多長時間
- users: 當前登錄用戶數
- load average: 系統負載,即任務隊列的平均長度。三個數值分別為 過去的1分鐘、5分鐘和15分鐘里,有多少進程在等待CPU資源。 如果這幾個數字高于了CPU核心數(比如在4核CPU上,如果3個數字之和超過了4,就表示負載較大),則說明系統負載較高,需要優化,否則就表示系統運行穩定。
2.2 第二行
Tasks: 182 total, 1 running, 181 sleeping, 0 stopped, 0 zombie
- Tasks: 當前有多少進程。
- running: 正在運行的進程數 。
- sleeping: 正在休眠的進程數 。
- stopped: 停止的進程數 。
- zombie: 僵尸進程數。
2.3 第三行
%Cpu(s):3.6 us, 5.1 sy, 0.0 ni, 91.2 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
- us:用戶空間占CPU的百分比(像shell程序、各種語言的編譯器、各種應用、web服務器和各種桌面應用都算是運行在用戶地址空間的進程,這些程序如果不是處于idle狀態,那么絕大多數的CPU時間都是運行在用戶態)。
- sy:內核空間占CPU的百分比(所有進程要使用的系統資源都是由Linux內核處理的,對于操作系統的設計來說,消耗在內核態的時間應該是越少越好,在實踐中有一類典型的情況會使sy變大,那就是大量的IO操作,因此在調查IO相關的問題時需要著重關注它)。
- ni:用戶進程空間改變過優先級(ni是nice的縮寫,可以通過nice值調整進程用戶態的優先級,這里顯示的ni表示調整過nice值的進程消耗掉的CPU時間,如果系統中沒有進程被調整過nice值,那么ni就顯示為0)。
- id:空閑CPU占用率。
- wa:等待輸入輸出的CPU時間百分比(和CPU的處理速度相比,磁盤IO操作是非常慢的,有很多這樣的操作,比如,CPU在啟動一個磁盤讀寫操作后,需要等待磁盤讀寫操作的結果。在磁盤讀寫操作完成前,CPU只能處于空閑狀態。Linux系統在計算系統平均負載時會把CPU等待IO操作的時間也計算進去,所以在我們看到系統平均負載過高時,可以通過wa來判斷系統的性能瓶頸是不是過多的IO操作造成的)。
- hi:硬中斷占用百分比(硬中斷是硬盤、網卡等硬件設備發送給CPU的中斷消息,當CPU收到中斷消息后需要進行適當的處理,消耗CPU時間)。
- st:軟中斷占用百分比(軟中斷是由程序發出的中斷,最終也會執行相應的處理程序,消耗CPU時間)。
- st:steal time, 系統花了百分之多少等待得到真正的cpu資源 。
2.4 第四行
KiB Mem :7888320 total, 1695796 free, 4378504 used, 1814020 buff/cache
- total:物理內存總量。
- free:空閑內存量。
- used:使用的內存量。
- buffer/cache:用作內核緩存的內存量。
2.5 第五行
KiB Swap: 8126460 total, 8126460 free, 0 used. 3156100 avail Mem
- total:交換區內存總量。
- free:空閑交換區總量。
- used:使用的交換區總量。
- buffer/cache:緩沖的交換區總量。
第四第五行分別是內存信息和swap信息,所有程序的運行都是在內存中進行的,所以內存的性能對與服務器來說非常重要。不過當內存的free變少的時候,其實我們并不需要太緊張。真正需要看的是Swap中的used信息。
Swap分區是由硬盤提供的交換區,當物理內存不夠用的時候,操作系統才會把暫時不用的數據放到Swap中。所以當這個數值變高的時候,說明內存是真的不夠用了。
2.6 進程信息
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
- PID: 進程id
- USER: 進程所有者的用戶名
- PR:優先級
- NI: nice值,負值表示高優先級,正值表示低優先級
- VIRT: 進程使用的虛擬內存總量,單位kb。VIRT=SWAP+RES
- RES: 進程使用的、未被換出的物理內存大小,單位kb。RES=CODE+DATA
- SHR: 共享內存大小,單位kb
- S: 進程狀態。D=不可中斷的睡眠狀態 R=運行 S=睡眠 T=跟蹤/停止 Z=僵尸進程
- %CPU: 上次更新到現在的CPU時間占用百分比
- %MEM: 進程使用的物理內存百分比
- TIME+: 進程使用的CPU時間總計,單位1/100秒
- COMMAND: 命令名/命令行
3. 壓力測試工具——stress
3.1 安裝
-
在RHEL/CentOS 系統可以使用
yum install stress
-
在Debian/Ubuntu系統中,可以使用
apt-get install stress
-
源碼離線安裝 stress-1.0.4.tar.gz
tar -zxvf stress-1.0.4.tar.gz
cd stress-1.0.4
./configure
make
make install
3.2 壓測命令
幫助命令:stress --help
`stress' imposes certain types of compute stress on your systemUsage: stress [OPTION [ARG]] ...-?, --help show this help statement--version show version statement顯示版本號-v, --verbose be verbose顯示詳細的信息-q, --quiet be quiet程序在運行的過程中不輸出信息-n, --dry-run show what would have been done輸出程序會做什么而并不實際執行相關的操作-t, --timeout N timeout after N seconds在 N 秒后結束程序--backoff N wait factor of N microseconds before work starts等待N微妙后開始運行-c, --cpu N spawn N workers spinning on sqrt()產生 N 個進程,每個進程都反復不停的計算隨機數的平方根-i, --io N spawn N workers spinning on sync()產生 N 個進程,每個進程反復調用 sync() 將內存上的內容寫到硬盤上-m, --vm N spawn N workers spinning on malloc()/free()產生 N 個進程,每個進程不斷分配和釋放內存--vm-bytes B malloc B bytes per vm worker (default is 256MB)指定分配內存的大小--vm-stride B touch a byte every B bytes (default is 4096)不斷的給部分內存賦值,讓 COW(Copy On Write)發生--vm-hang N sleep N secs before free (default none, 0 is inf)指示每個消耗內存的進程在分配到內存后轉入睡眠狀態 N 秒,然后釋放內存,一直重復執行這個過程--vm-keep redirty memory instead of freeing and reallocating 一直占用內存,區別于不斷的釋放和重新分配(默認是不斷釋放并重新分配內存)。-d, --hdd N spawn N workers spinning on write()/unlink()產生 N 個不斷執行 write 和 unlink 函數的進程(創建文件,寫入內容,刪除文件)--hdd-bytes B write B bytes per hdd worker (default is 1GB)指定文件大小Example: stress --cpu 8 --io 4 --vm 2 --vm-bytes 128M --timeout 10sNote: Numbers may be suffixed with s,m,h,d,y (time) or B,K,M,G (size).
stress常用壓測命令
# CPU壓力測試
# 啟動2個CPU進程
stress -c 2
# 啟動2個CPU進程,持續時間為60s
stress -c 2 -t 60# 內存壓測
# 啟動2個進程,每個進程分配1G內存,分配后不釋放
stress --vm 2 --vm-bytes 1G --vm-keep# IO壓測
# 啟動4個進程,將內存上的內容寫到硬盤上,top命令可看到sy升高,wa升高
stress -i 4# 磁盤IO壓測
# 創建一個進程不斷地在磁盤上創建10M大小的文件并寫入內容
stress -d 1 --hdd-bytes 10M