Jmeter分佈式壓力測試(史上最全)

Jmeter分佈式壓力測試(史上最全)

壓測問題

社羣小夥壓測問題一

jmeter 測試網關,單體吞吐量7000,分佈式才600

問題還在解決中,後面會再次貼出解決方案

此文的作用

下面講分佈式測試過程中分析問題,用到的命令,工具,統一記錄下來

供大家參考

Jmeter分佈式測試

使用Jmeter分佈式測試的背景:

1、GUI、非GUI的區別

首先,我們知道Jmeter有兩種運行方式,GUI、非GUI。

GUI:在Windows系統上運行,圖形化界面,方便查看測試結果,但是消耗壓力機資源較高,容易卡死,有併發限制。

非GUI:通過命令行運行,無圖形化界面,不方便查看測試結果,但是消耗壓力機資源較低,可以支持較大併發。

2、GUI、非GUI遇到的問題

Jmeter是基於java程序運行的,在windows上使用Jmeter進行性能測試時,非常耗費客戶機的CPU和內存,如果併發數稍微大一點(比如100、1000...併發),單臺電腦的配置經常無法支持,很容易卡死,即使不卡死也會使電腦運行很慢,導致我們沒辦法進行其它操作。

通過cmd命令行,或者是在Linux上使用Jmeter進行性能測試時,能夠大大縮減所需要的系統資源;但是需要將jmeter腳本上傳到Linux上使用命令行方式運行,如果腳本經常改動就要頻繁上傳;測試完成後要把結果數據下載到本地GUI環境中查看,當結果文件較大時,下載要花費大量時間,總是有很多不方便。

3、如何解決?

以上問題,都可以使用Jmeter的分佈式測試功能來解決:

通過Jmeter遠程啓動功能,把一臺windows機器做爲控制器,遠程控制其它多個windows或linux壓力機,從而把壓力分散到多臺機器上,實現高併發功能;並在master上收集測試結果。

jmeter分佈式原理

二、jmeter分佈式原理

jmeter的分佈式控制,說的通俗一點,就是指遠程啓動功能,具體原理如下圖:
img img
1、客戶端機器(window系統)作爲一個控制器controller,控制多臺slave機器的操作。

2、Controller和slave機器上最好裝有相同版本的jdk和jmeter,並配置好環境變量,安裝和配置方法跟windows環境類似。

3、controller通過GUI界面啓動slave機器,將jmeter壓測腳本發送給每臺啓動的slave,slave獲得腳本後開始執行。slave本地不需預先存儲腳本,但是需要有腳本中的依賴文件(如csv文件等)。

4、各臺slave執行完成後,將結果傳回給controller,controller收集後整合顯示出來。

jmeter分佈式配置

三、jmeter分佈式(遠程啓動)配置

1、slave遠程機配置

slave遠程機需安裝jdk和jmeter,最好與controller上的版本保持一致,無法滿足時至少保證slave上的jmeter能正常運行(如jmeter3.0以後需要jdk1.7及以上版本)。

啓動salve機的jmeter-server

在slave的%JMETER_HOME%bin目錄下執行./jmeter-server命令啓動jmeter服務,啓動成功如下圖:
img

修改slave機jmeter默認端口

上圖紅框中的ip爲slave機的ip地址,紅框中的端口號port爲啓動 jmeter服務監聽的port,一般會有個默認端口號1099,但最好自定義,確保端口號不衝突。修改方法如下:

在slave機器的%JMETER_HOME%bin目錄下找到jmeter.properties,修改文件中server_port和server.rmi.localport,即可自定義端口號:

server_port=1029

server.rmi.localport=1029

注意這兩項必須同時修改,且一樣。

修改後執行slave的jmeter-server即可看到控制檯消息中修改是否生效;

2、控制機controller配置

在控制機上要保證執行命令能發送到遠程slave機,需要在控制機上配置遠程機的ip地址和port。

在控制機jmeter安裝目錄的bin文件夾下,找到jmeter.properties,修改配置如下圖,其中ip和port即爲上一步slave的ip和port,如上圖中jmeter-server啓動時紅框中顯示的內容。多個slave機器的配置可通過逗號分隔。

remote_hosts=10.165.124.6:1029

若要添加多個slave機,重複上面的步驟即可。

3、遠程啓動和停止

配置完成後打開控制機jmeter的GUI界面,在運行-遠程啓動中即可看到自己配置的slave機器。
img img 添加一個腳本,點擊遠程啓動即可啓動運行slave機器,此時在slave機上可看到控制檯信息,在控制機通過監聽器-聚合報告或察看結果樹可看到執行結果。
img
同樣的,也可以進行遠程停止操作:
img img 需要注意的問題:

1、修改配置文件後必須重啓jmeter才能生效

2、在控制機上遠程啓動之前,必須先運行slave機的jmeter-server.bat

3、當jmeter腳本中需要依賴csv等數據文件時,該文件需上傳至slave機,並需要設置正確的路徑。

4、先配置一個slave機成功後,再依次配置多個slave機

5、當slave機是linux系統時,一般只配置一個slave機即可,除非併發特別大時,才需要配置多個slave.

6、分佈式運行時,總併發數是腳本中設置的線程數 * slave機的個數,如線程數設置爲10,使用3個slave機運行,則總併發數是30.

Linux內網網絡測速

一、iperf 和 iperf3 介紹

perf是一個網絡性能測試工具。

  • 可以測試TCP和UDP帶寬質量,
  • -可以測量最大TCP帶寬,
  • 具有多種參數和UDP特性,
  • 可以報告帶寬,
  • 延遲抖動
  • 數據包丟失。
  • Iperf在linux和windows平臺均有二進制版本供自由使用。

iperf3是用來測量一個網絡最大帶寬的工具。

  • 它支持調節各種參數比如發送持續時間,
  • 發送/接收緩存,
  • 通信協議。
  • 每次測試,它都會報告網絡帶寬,丟包率和其他參數。
  • 更多信息請登陸官網:https://iperf.fr/

二、安裝

rpm -i iperf3-3.1.3-1.fc24.x86_64.rpm
或
yum install iperf3.x86_64 -y

ipert 和 ipert3 服務和客戶端

1、iperf
server端:

iperf -s -p 25001 -B 192.168.33.103 (-u)
- s  指定server端
- p 指定端口(要和客戶端一致)
- B 綁定ip地址 
- u  udp協議,,默認是tcp協議

client端:

iperf -c -p 25001 -B 192.168.33.104 -4 -f K -n 10M -b 10M (-u)
- c 指定client端
- p 指定端口(要和服務器端一致)
- B 綁定客戶端的ip地址
- 4 指定ipv4
- f 格式化帶寬數輸出
- n 指定傳輸的字節數
- b 使用帶寬數量 
- u 指定udp協議

2、iperf3

server端:

iperf3 -s -p 25001
- s 指定服務器端
- p 指定端口號   

iperf3的server端不支持“-u”參數,,默認可以測試tcp和udp

client端:

iperf3 -c -p 25001 -B 192.168.33.104 -4 -f K -n 10M -b 10M --get-server-output(-u)
- c 指定client端
- p 指定端口(要和服務器端一致)
- B 綁定客戶端的ip地址
- 4 指定ipv4
- f 格式化帶寬數輸出
- n 指定傳輸的字節數
- b 使用帶寬數量 
- u 指定udp協議
--get-server-output 獲取來自服務器端的結果

區別:
1、iperf3不支持雙工模式測試

本機連接測試

  1. 服務器端:在t1中輸入命令:
iperf3 -s
  1. 客戶端:在t2中輸入命令:
iperf3 -c 127.0.0.1 -t 10

本例中t2向t1發送10秒中的數據包

  1. 結果
[root@iZbp11sdj1sc8o3r17rnwgZ ~]#   iperf3 -s
-----------------------------------------------------------
Server listening on 5201
-----------------------------------------------------------
Accepted connection from 127.0.0.1, port 44816
[  5] local 127.0.0.1 port 5201 connected to 127.0.0.1 port 44818
[ ID] Interval           Transfer     Bitrate
[  5]   0.00-1.00   sec  4.18 GBytes  35.9 Gbits/sec                  
[  5]   1.00-2.00   sec  3.61 GBytes  31.0 Gbits/sec                  
[  5]   2.00-3.00   sec  4.27 GBytes  36.7 Gbits/sec                  
[  5]   3.00-4.00   sec  3.56 GBytes  30.5 Gbits/sec                  
[  5]   4.00-5.00   sec  4.43 GBytes  38.1 Gbits/sec                  
[  5]   5.00-6.00   sec  3.67 GBytes  31.5 Gbits/sec                  
[  5]   6.00-7.00   sec  4.45 GBytes  38.2 Gbits/sec                  
[  5]   7.00-8.00   sec  4.45 GBytes  38.2 Gbits/sec                  
[  5]   8.00-9.00   sec  4.36 GBytes  37.5 Gbits/sec                  
[  5]   9.00-10.00  sec  4.09 GBytes  35.1 Gbits/sec                  
[  5]  10.00-10.04  sec   116 MBytes  25.0 Gbits/sec                  
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate
[  5]   0.00-10.04  sec  41.2 GBytes  35.2 Gbits/sec                  receiver
-----------------------------------------------------------
Server listening on 5201
-----------------------------------------------------------
[root@iZbp11sdj1sc8o3r17rnwgZ ~]# iperf3 -c 127.0.0.1 -t 10
Connecting to host 127.0.0.1, port 5201
[  5] local 127.0.0.1 port 44818 connected to 127.0.0.1 port 5201
[ ID] Interval           Transfer     Bitrate         Retr  Cwnd
[  5]   0.00-1.00   sec  4.30 GBytes  36.9 Gbits/sec    1   3.06 MBytes       
[  5]   1.00-2.00   sec  3.61 GBytes  31.0 Gbits/sec    2   3.31 MBytes       
[  5]   2.00-3.00   sec  4.27 GBytes  36.7 Gbits/sec    1   3.31 MBytes       
[  5]   3.00-4.00   sec  3.56 GBytes  30.5 Gbits/sec    1   3.31 MBytes       
[  5]   4.00-5.00   sec  4.43 GBytes  38.1 Gbits/sec    0   3.31 MBytes       
[  5]   5.00-6.00   sec  3.67 GBytes  31.5 Gbits/sec    0   3.12 MBytes       
[  5]   6.00-7.00   sec  4.45 GBytes  38.2 Gbits/sec    0   3.12 MBytes       
[  5]   7.00-8.00   sec  4.44 GBytes  38.2 Gbits/sec    0   3.12 MBytes       
[  5]   8.00-9.00   sec  4.37 GBytes  37.5 Gbits/sec    0   3.12 MBytes       
[  5]   9.00-10.00  sec  4.09 GBytes  35.1 Gbits/sec    5   3.12 MBytes       
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate         Retr
[  5]   0.00-10.00  sec  41.2 GBytes  35.4 Gbits/sec   10             sender
[  5]   0.00-10.04  sec  41.2 GBytes  35.2 Gbits/sec                  receiver

iperf Done.

在併發度默認爲 1 且未做任何調優的情況下,傳輸就達到了 41Mbps。

網卡流量監控

iftop

iftop可以用來監控網卡的實時流量(可以指定網段)、反向解析IP、顯示端口信息等

圖片

界面參數說明

=>代表發送數據
<=代表接收數據
TX:發送流量
RX:接收流量
TOTAL:總流量
Cumm:運行iftop到目前時間的總流量
peak:流量峯值
rates:分別表示過去 2s 10s 40s 的平均流量

常用的命令參數

-i設定監測的網卡,如:# iftop -i eth1
-B 以bytes爲單位顯示流量(默認是bits),如:# iftop -B
-n使host信息默認直接都顯示IP,如:# iftop -n
-N使端口信息默認直接都顯示端口號,如: # iftop -N
-F顯示特定網段的進出流量,如# iftop -F 10.10.1.0/24或# iftop -F 10.10.1.0/255.255.255.0
-h(display this message),幫助,顯示參數信息
-p使用這個參數後,中間的列表顯示的本地主機信息,出現了本機以外的IP信息;
-b使流量圖形條默認就顯示;
-f這個暫時還不太會用,過濾計算包用的;
-P使host信息及端口信息默認就都顯示;
-m設置界面最上邊的刻度的最大值,刻度分五個大段顯示,例:# iftop -m 100M
-P顯示端口號

用法示例:

#顯示網卡eth0的信息,主機通過ip顯示
> iftop -i eth0 -n
#顯示端口號(添加-P參數,進入界面可通過p參數關閉)
> iftop -n -P
#顯示將輸出以byte爲單位顯示網卡流量,默認是bit
> iftop -i eth0 -n -B
#顯示流量進度條
> iftop -i eth0 -n(進入界面後按下L)
#顯示每個連接的總流量
> iftop -i eth0 -n(進入界面後按下T)
#顯示指定ip 8.8.8.8的流量
> iftop -i eth0 -n(進入界面後按下l,輸入8.8.8.8回車) 

nethogs

有很多適用於Linux系統的開源網絡監視工具.比如說,你可以用命令iftop來檢查帶寬使用情況. netstat用來查看接口統計報告,還有top監控系統當前運行進程.但是如果你想要找一個能夠按進程實時統計網絡帶寬利用率的工具,那麼NetHogs值得一看。

NetHogs是一個小型的net top工具,不像大多數工具那樣拖慢每個協議或者是每個子網的速度而是按照進程進行帶寬分組.NetHogs不需要依賴載入某個特殊的內核模塊. 如果發生了網絡阻塞你可以啓動NetHogs立即看到哪個PID造成的這種狀況.這樣就很容易找出哪個程序跑飛了然後突然佔用你的帶寬.

簡單地說,可以通過nethogs查看linux下進程的流量。

nethogs --help

# nethogs --help
nethogs: invalid option -- '-'
usage: nethogs [-V] [-b] [-d seconds] [-t] [-p] [device [device [device ...]]]
        -V : prints version.
        -d : delay for update refresh rate in seconds. default is 1.
        -t : tracemode.
        -b : bughunt mode - implies tracemode.
        -p : sniff in promiscious mode (not recommended).
        device : device(s) to monitor. default is eth0

When nethogs is running, press:
 q: quit
 m: switch between total and kb/s mode

實例1:設置5秒鐘刷新一次,通過-d來指定刷新頻率

# nethogs -d 5

實例2:監視eth0網絡帶寬

# nethogs eth0

實例3:同時監視eth0和eth1接口

# nethogs eth0 eth1

交互命令:
以下是NetHogs的一些交互命令(鍵盤快捷鍵)
m : 修改單位
r : 按流量排序
s : 按發送流量排序
q : 退出命令提示符

關於NetHogs命令行工具的完整參數列表,可以參考NetHogs的手冊,使用方法是在終端裏輸入man nethogs。更多信息請參考nethogs主頁:
GitHub - raboof/nethogs: Linux 'net top' tool
https://github.com/raboof/nethogs#readme

iptraf

iptraf是一個基於ncurses開發的IP局域網監控工具,它可以實時地監視網卡流量,可以生成各種網絡統計數據,包括TCP信息、UDP統計、ICMP和OSPF信息、以太網負載信息、節點統計、IP校驗和錯誤和其它一些信息。

iptraf的參數列表
iptraf後面加上不同的參數,可以起到不同的作用,下面是iptraf的參數命令列表:

參數命令 作用
-i iface 網絡接口:立即在指定網絡接口上開啓IP流量監視,iface爲all指監視所有的網絡接口,iface指相應的interface
-g 立即開始生成網絡接口的概要狀態信息
-d iface 網絡接口:在指定網絡接口上立即開始監視明細的網絡流量信息,iface指相應的interface
-s iface 網絡接口:在指定網絡接口上立即開始監視TCP和UDP網絡流量信息,iface指相應的interface
-z iface 網絡接口:在指定網絡接口上顯示包計數,iface指相應的interface
-l iface 網絡接口:在指定網絡接口上立即開始監視局域網工作站信息,iface指相應的interface
-t timeout 時間:指定iptraf指令監視的時間,timeout指監視時間的minute數
-B 將標註輸出重新定向到“/dev/null”,關閉標註輸入,將程序作爲後臺進程運行
-L logfile 指定一個文件用於記錄所有命令行的log,默認文件是地址:/var/log/iptraf
-I interval 指定記錄log的時間間隔(單位是minute),不包括IP traffic monitor
-u 允許使用不支持的接口作爲以太網設備
-f 清空所有計數器
-h 顯示幫助信息

高併發、大流量網卡調優

下面是關於網卡調優的相關知識,歡迎大家共同探討,讓我們的機器跑的更high。

1、Broadcom的網卡建議關閉GRO功能

ethtool -K eth0 gro off
ethtool -K eth1 gro off
ethtool -K eth2 gro off
ethtool -K eth3 gro off	

2、關閉irqbalance服務並手動分配網卡中斷

service irqbalance stop
chkconfig irqbalance off
# 查看網卡中斷號
grep ethx /proc/interrupts
# 分配到每顆顆CPU核上
cat /proc/irq/{84,85,86,87,88,89,90,91,92,93}/smp_affinity
echo 1 > /proc/irq/84/smp_affinity
echo 2 > /proc/irq/85/smp_affinity
echo 4 > /proc/irq/86/smp_affinity
echo 8 > /proc/irq/87/smp_affinity
echo 10 > /proc/irq/88/smp_affinity
echo 20 > /proc/irq/89/smp_affinity
echo 40 > /proc/irq/90/smp_affinity
echo 80 > /proc/irq/91/smp_affinity
echo 100 > /proc/irq/92/smp_affinity
echo 200 > /proc/irq/93/smp_affinity

PS:smp_affinity的值可以用下面腳本算哈,此腳本來自:http://rfyiamcool.blog.51cto.com/1030776/1335700

#!/bin/bash
#
echo "統計cpu的16進制"
[ $# -ne 1 ] && echo ‘$1 is Cpu core number’ && exit 1
CCN=$1
echo “Print eth0 affinity”
for((i=0; i<${CCN}; i++))
do
echo ==============================
echo "Cpu Core $i is affinity"
((affinity=(1<<i)))
echo "obase=16;${affinity}" | bc
done

使用方法:sh 腳本名字 空格 cpu核數

3、開啓網卡的RPS功能 (Linux內核2.6.38或以上版本支持)

# Enable RPS (Receive Packet Steering)
rfc=4096
cc=$(grep -c processor /proc/cpuinfo)
rsfe=$(echo $cc*$rfc | bc)
sysctl -w net.core.rps_sock_flow_entries=$rsfe
for fileRps in $(ls /sys/class/net/eth*/queues/rx-*/rps_cpus)
do
echo fff > $fileRps
done
for fileRfc in $(ls /sys/class/net/eth*/queues/rx-*/rps_flow_cnt)
do
echo $rfc > $fileRfc
done
tail /sys/class/net/eth*/queues/rx-*/{rps_cpus,rps_flow_cnt}

獻上一個完整的腳本:

vi /opt/sbin/change_irq.sh
#!/bin/bash
ethtool -K eth0 gro off
ethtool -K eth1 gro off
ethtool -K eth2 gro off
ethtool -K eth3 gro off
service irqbalance stop
chkconfig irqbalance off
cat /proc/irq/{84,85,86,87,88,89,90,91,92,93}/smp_affinity
echo 1 > /proc/irq/84/smp_affinity
echo 2 > /proc/irq/85/smp_affinity
echo 4 > /proc/irq/86/smp_affinity
echo 8 > /proc/irq/87/smp_affinity
echo 10 > /proc/irq/88/smp_affinity
echo 20 > /proc/irq/89/smp_affinity
echo 40 > /proc/irq/90/smp_affinity
echo 80 > /proc/irq/91/smp_affinity
echo 100 > /proc/irq/92/smp_affinity
echo 200 > /proc/irq/93/smp_affinity
# Enable RPS (Receive Packet Steering)
rfc=4096
cc=$(grep -c processor /proc/cpuinfo)
rsfe=$(echo $cc*$rfc | bc)
sysctl -w net.core.rps_sock_flow_entries=$rsfe
for fileRps in $(ls /sys/class/net/eth*/queues/rx-*/rps_cpus)
do
echo fff > $fileRps
done
for fileRfc in $(ls /sys/class/net/eth*/queues/rx-*/rps_flow_cnt)
do
echo $rfc > $fileRfc
done
tail /sys/class/net/eth*/queues/rx-*/{rps_cpus,rps_flow_cnt}
chmod +x /opt/sbin/change_irq.sh
echo "/opt/sbin/change_irq.sh" >> /etc/rc.local

PS:記得修改網卡中斷號,別直接拿來用哦

每秒上下文切換數優化

在這裏插入圖片描述

策略: 保持通用的吞吐量的情況下,去調整線程數

vmstat命令

1、介紹

vmstat命令是最常見的Linux/Unix監控工具,屬於sysstat包。可以展現給定時間間隔的服務器的狀態值,包括服務器的CPU使用率,內存使用,虛擬內存交換情況,IO讀寫情況。這個命令是我查看Linux/Unix最喜愛的命令,一個是Linux/Unix都支持,二是相比top,我可以看到整個機器的CPU,內存,IO的使用情況,而不是單單看到各個進程的CPU使用率和內存使用率(使用場景不一樣)。

2、安裝

yum install -y sysstat
 
vmstat 2 1
表示每個兩秒採集一次服務器狀態,表示只採集一次
 
vmstat 2
這表示vmstat每2秒採集數據,一直採集,直到我結束程序

3、命令顯示字段

類別 項目 含義 說明
Procs(進程) r 等待執行的任務數 展示了正在執行和等待cpu資源的任務個數。當這個值超過了cpu個數,就會出現cpu瓶頸。
b 等待IO的進程數量
Memory(內存) swpd 正在使用虛擬的內存大小,單位k
free 空閒內存大小
buff 已用的buff大小,對塊設備的讀寫進行緩衝
cache 已用的cache大小,文件系統的cache
inact 非活躍內存大小,即被標明可回收的內存,區別於free和active
active 活躍的內存大小 具體含義見:概念補充(當使用-a選項時顯示)
Swap si 每秒從交換區寫入內存的大小(單位:kb/s)
so 每秒從內存寫到交換區的大小
IO bi 每秒讀取的塊數(讀磁盤) 塊設備每秒接收的塊數量,單位是block,這裏的塊設備是指系統上所有的磁盤和其他塊設備,現在的Linux版本塊的大小爲1024bytes
bo 每秒寫入的塊數(寫磁盤) 塊設備每秒發送的塊數量,單位是block
system in 每秒中斷數,包括時鐘中斷 這兩個值越大,會看到由內核消耗的cpu時間sy會越多
cs 每秒上下文切換數 秒, 上下文切換次數,例如我們調用系統函數,就要進行上下文切換,線程的切換,也要進程上下文切換,這個值要越小越好,太大了,要考慮調低線程或者進程的數目
CPU(以百分比表示) us 用戶進程執行消耗cpu時間(user time) us的值比較高時,說明用戶進程消耗的cpu時間多,但是如果長期超過50%的使用,那麼我們就該考慮優化程序算法或其他措施了
sy 系統進程消耗cpu時間(system time) sys的值過高時,說明系統內核消耗的cpu資源多,這個不是良性的表現,我們應該檢查原因。 這裏us + sy的參考值爲80%,如果us+sy 大於 80%說明可能存在CPU不足
Id 空閒時間(包括IO等待時間) 一般來說 us+sy+id=100
wa 等待IO時間 wa過高時,說明io等待比較嚴重,這可能是由於磁盤大量隨機訪問造成的,也有可能是磁盤的帶寬出現瓶頸。

4、常用參數

用法

vmstat [-a] [-n] [-S unit] [delay [ count]]

vmstat [-s] [-n] [-S unit]

vmstat [-m] [-n] [delay [ count]]

vmstat [-d] [-n] [delay [ count]]

vmstat [-p disk partition] [-n] [delay [ count]]

vmstat [-f]

vmstat [-V]

-a:顯示活躍和非活躍內存

-f:顯示從系統啓動至今的fork數量

-m:顯示slabinfo

-n:只在開始時顯示一次各字段名稱。

-s:顯示內存相關統計信息及多種系統活動數量。

delay:刷新時間間隔。如果不指定,只顯示一條結果。

count:刷新次數。如果不指定刷新次數,但指定了刷新時間間隔,這時刷新次數爲無窮。

-d:顯示磁盤相關統計信息。

-p:顯示指定磁盤分區統計信息

-S:使用指定單位顯示。參數有 k 、K 、m 、M ,分別代表1000、1024、1000000、1048576字節(byte)。默認單位爲K(1024 bytes)

-V:顯示vmstat版本信息。

5、常見性能問題分析

IO/CPU/men連鎖反應
1.free急劇下降
2.buff和cache被回收下降,但也無濟於事
3.依舊需要使用大量swap交換分區swpd
4.等待進程數,b增多
5.讀寫IO,bi bo增多
6.si so大於0開始從硬盤中讀取
7.cpu等待時間用於 IO等待,wa增加
內存不足
1.開始使用swpd,swpd不爲0
2.si so大於0開始從硬盤中讀取
io瓶頸
1.讀寫IO,bi bo增多超過2000
2.cpu等待時間用於 IO等待,wa增加 超過20
3.sy 系統調用時間長,IO操作頻繁會導致增加 >30%
4.wa io等待時間長
iowait% <20% 良好
iowait% <35% 一般
iowait% >50%
5.進一步使用iostat觀察
CPU瓶頸:load,vmstat中r列
1.反應爲CPU隊列長度
2.一段時間內,CPU正在處理和等待CPU處理的進程數之和,直接反應了CPU的使用和申請情況。
3.理想的load average:核數CPU數0.7
CPU個數:grep 'physical id' /proc/cpuinfo | sort -u
核數:grep 'core id' /proc/cpuinfo | sort -u | wc -l
4.超過這個值就說明已經是CPU瓶頸了
CPU瓶頸
1.us 用戶CPU時間高超過90%
涉及到web服務器,cs 每秒上下文切換次數
例如我們調用系統函數,就要進行上下文切換,線程的切換,也要進程上下文切換,這個值要越小越好,太大了,要考慮調低線程或者進程的數目,例如在apache和nginx這種web服務器中,我們一般做性能測試時會進行幾千併發甚至幾萬併發的測試,選擇web服務器的進程可以由進程或者線程的峯值一直下調,壓測,直到cs到一個比較小的值,這個進程和線程數就是比較合適的值了。系統調用也是,每次調用系統函數,我們的代碼就會進入內核空間,導致上下文切換,這個是很耗資源,也要儘量避免頻繁調用系統函數。上下文切換次數過多表示你的CPU大部分浪費在上下文切換,導致CPU幹正經事的時間少了,CPU沒有充分利用,是不可取的。
1.cs可以對apache和nginx線程和進程數限制起到一定的參考作用
2.我們一般做性能測試時會進行幾千併發甚至幾萬併發的測試,選擇web服務器的進程可以由進程或者線程的峯值一直下調,壓測,直到cs到一個比較小的值,這個進程和線程數就是比較合適的值了
較好的趨勢:主要是 swap使用少,swpd數值低。si so分頁讀取寫入數值趨近於零

6、其他說明:

b 表示阻塞的進程,這個不多說,進程阻塞,大家懂的。

swpd 虛擬內存已使用的大小,如果大於0,表示你的機器物理內存不足了,如果不是程序內存泄露的原因,那麼你該升級內存了或者把耗內存的任務遷移到其他機器。

free 空閒的物理內存的大小,我的機器內存總共8G,剩餘3415M。

buff Linux/Unix系統是用來存儲,目錄裏面有什麼內容,權限等的緩存,我本機大概佔用300多M

cache cache直接用來記憶我們打開的文件,給文件做緩衝,我本機大概佔用300多M(這裏是Linux/Unix的聰明之處,把空閒的物理內存的一部分拿來做文件和目錄的緩存,是爲了提高 程序執行的性能,當程序使用內存時,buffer/cached會很快地被使用。)

si 每秒從磁盤讀入虛擬內存的大小,如果這個值大於0,表示物理內存不夠用或者內存泄露了,要查找耗內存進程解決掉。我的機器內存充裕,一切正常。

so 每秒虛擬內存寫入磁盤的大小,如果這個值大於0,同上。

bi 塊設備每秒接收的塊數量,這裏的塊設備是指系統上所有的磁盤和其他塊設備,默認塊大小是1024byte,我本機上沒什麼IO操作,所以一直是0,但是我曾在處理拷貝大量數據(2-3T)的機器上看過可以達到140000/s,磁盤寫入速度差不多140M每秒

bo 塊設備每秒發送的塊數量,例如我們讀取文件,bo就要大於0。bi和bo一般都要接近0,不然就是IO過於頻繁,需要調整。

in 每秒CPU的中斷次數,包括時間中斷

cs 每秒上下文切換次數,例如我們調用系統函數,就要進行上下文切換,線程的切換,也要進程上下文切換,這個值要越小越好,太大了,要考慮調低線程或者進程的數目,例如在apache和nginx這種web服務器中,我們一般做性能測試時會進行幾千併發甚至幾萬併發的測試,選擇web服務器的進程可以由進程或者線程的峯值一直下調,壓測,直到cs到一個比較小的值,這個進程和線程數就是比較合適的值了。系統調用也是,每次調用系統函數,我們的代碼就會進入內核空間,導致上下文切換,這個是很耗資源,也要儘量避免頻繁調用系統函數。上下文切換次數過多表示你的CPU大部分浪費在上下文切換,導致CPU幹正經事的時間少了,CPU沒有充分利用,是不可取的。

us 用戶CPU時間,我曾經在一個做加密解密很頻繁的服務器上,可以看到us接近100,r運行隊列達到80(機器在做壓力測試,性能表現不佳)。

sy 系統CPU時間,如果太高,表示系統調用時間長,例如是IO操作頻繁。

id 空閒 CPU時間,一般來說,id + us + sy = 100,一般我認爲id是空閒CPU使用率,us是用戶CPU使用率,sy是系統CPU使用率。

wt 等待IO CPU時間。

參考文獻

https://www.xxshell.com/2664.html

https://blog.csdn.net/DeepMindMan/article/details/66973529

http://t.zoukankan.com/tcicy-p-10193615.html

https://blog.csdn.net/xiao_yi_xiao/article/details/120546346

http://blog.itpub.net/69942496/viewspace-2654371/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章