1.wrk 安裝及使用
--------------------------------------------------------------------------------------------------mysql
[root@centos ~]# cd /usr/local/srclinux
[root@centos ~]# yum install git -ynginx
[root@centos ~]# git clone https://github.com/wg/wrk.gitgit
[root@centos ~]# cd wrkgithub
[root@centos ~]# makesql
[root@centos ~]# ln -s /usr/local/src/wrk/wrk /usr/local/binshell
[root@centos ~]# wrk -t 2 -c 50 -d 20 --latency http://localhost:5000vim
參數說明:centos
-t 須要模擬的線程數
-c 須要模擬的鏈接數
-d 測試的持續時間
--timeout 超時的時間
--latency 顯示延遲統計api
結果顯示說明:
Latency:響應時間
Req/Sec:每一個線程每秒鐘的完成的請求數
Avg:平均
Max:最大
Stdev:標準差
2.bombardier 安裝及使用
--------------------------------------------------------------------------------------------------
https://github.com/codesenberg/bombardier
[root@centos ~]# cd /usr/local/src
[root@centos ~]# wget https://dl.google.com/go/go1.12.7.linux-amd64.tar.gz
[root@centos ~]# tar -C /opt -xzf go1.12.7.linux-amd64.tar.gz
[root@centos ~]# export PATH=$PATH:/opt/go/bin
[root@centos ~]# export GOPATH=/data/go
[root@centos ~]# go version && go env
[root@centos ~]# go get -u github.com/codesenberg/bombardier
[root@centos ~]# ln -s /data/go/bin/bombardier /bin
[root@centos ~]# bombardier -c 125 -n 10000 http://localhost:5000/api/values/5
Bombarding http://localhost:5000/api/values/5 with 10000 request(s) using 125 connection(s)
10000 / 10000 [================================================] 100.00% 19s
Done!
Statistics Avg Stdev Max
Reqs/sec 517.05 675.48 11754.62
Latency 175.86ms 0.92s 16.87s
HTTP codes:
1xx - 0, 2xx - 10000, 3xx - 0, 4xx - 0, 5xx - 0
others - 0
Throughput: 181.42KB/s
[root@centos ~]# bombardier -c 200 -ds -l http://localhost:5000/api/values/5
3.iftop 安裝及使用
--------------------------------------------------------------------------------------------------
[root@centos ~]# yum install flex byacc libpcap ncurses ncurses-devel libpcap-devel
[root@centos ~]# wget http://www.ex-parrot.com/pdw/iftop/download/iftop-0.17.tar.gz
[root@centos ~]# tar zxvf iftop-0.17.tar.gz && cd iftop-0.17
[root@centos ~]# ./configure && make && make install
中間的<= =>這兩個左右箭頭,表示的是流量的方向。
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
操做命令(注意大小寫)
按h切換是否顯示幫助;
按n切換顯示本機的IP或主機名;
按s切換是否顯示本機的host信息;
按d切換是否顯示遠端目標主機的host信息;
按t切換顯示格式爲2行/1行/只顯示發送流量/只顯示接收流量;
按N切換顯示端口號或端口服務名稱;
按S切換是否顯示本機的端口信息;
按D切換是否顯示遠端目標主機的端口信息;
按p切換是否顯示端口信息;
按P切換暫停/繼續顯示;
按b切換是否顯示平均流量圖形條;
按B切換計算2秒或10秒或40秒內的平均流量;
按T切換是否顯示每一個鏈接的總流量;
按l打開屏幕過濾功能,輸入要過濾的字符,好比ip,按回車後,屏幕就只顯示這個IP相關的流量信息;
按L切換顯示畫面上邊的刻度;刻度不一樣,流量圖形條會有變化;
按j或按k能夠向上或向下滾動屏幕顯示的鏈接記錄;
按1或2或3能夠根據右側顯示的三列流量數據進行排序;
按<根據左邊的本機名或IP排序;
按>根據遠端目標主機的主機名或IP排序;
按o切換是否固定只顯示當前的鏈接;
按f能夠編輯過濾代碼,這是翻譯過來的說法,我還沒用過這個!
按!可使用shell命令,這個沒用過!沒搞明白啥命令在這好用呢!
按q退出監控。
4.Nginx查看併發鏈接
--------------------------------------------------------------------------------------------------
配置文件
location /Nginxstatus {
stub_status on;
}
查看結果說明:http://localhsot/Nginxstatus
Active connections
//當前 Nginx 正處理的活動鏈接數.
server accepts handledrequests
//總共處理鏈接,成功建立握手,總共處理請求.
Reading //nginx 讀取到客戶端的 Header 信息數.
Writing //nginx 返回給客戶端的 Header 信息數.
Waiting //nginx 已經處理完正在等候下一次請求指令的駐留鏈接 (開啓 keep-alive,這個值等於active-reading-writing)
5.查看那mysql當前鏈接:(若是用普通帳號登陸,就只顯示這用戶的)
--------------------------------------------------------------------------------------------------
#mysql -uroot -p
mysql>
show processlist; 能夠顯示前100條鏈接信息
show full processlist; 能夠顯示所有。
查看這臺服務器設置。
#vi /etc/my.cnf
set-variable=max_user_connections=30 這個就是單用戶的鏈接數
set-variable=max_connections=800 這個是全局的限制鏈接數
6.查看Linux鏈接數
--------------------------------------------------------------------------------------------------
# yum install net-tools
# netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a,S[a]}'
LISTEN: 服務器在等待進入呼叫
SYN_RECV: 一個鏈接請求已經到達,等待確認
SYN_SENT: 應用已經開始,打開一個鏈接
ESTABLISHED: 正常數據傳輸狀態
FIN_WAIT1: 應用說它已經完成
FIN_WAIT2: 另外一邊已贊成釋放
ITMED_WAIT: 等待全部分組死掉
CLOSING: 兩邊同時嘗試關閉
TIME_WAIT: 另外一邊已初始化一個釋放
LAST_ACK: 等待全部分組死掉
經常使用的三個狀態是:ESTABLISHED 表示正在通訊,TIME_WAIT 表示主動關閉,CLOSE_WAIT 表示被動關閉。
TCP協議規定,對於已經創建的鏈接,網絡雙方要進行四次握手才能成功斷開鏈接,若是缺乏了其中某個步驟,將會使鏈接處於假死狀態,鏈接自己佔用的資源不會被釋放。網絡服務器程序要同時管理大量鏈接,因此頗有必要保證無用鏈接徹底斷開,不然大量僵死的鏈接會浪費許多服務器資源。在衆多TCP狀態中,最值得注意的狀態有兩個:CLOSE_WAIT和TIME_WAIT。
TIME_WAIT
TIME_WAIT 是主動關閉連接時造成的,等待2MSL時間,約4分鐘。主要是防止最後一個ACK丟失。 因爲TIME_WAIT 的時間會很是長,所以server端應儘可能減小主動關閉鏈接
CLOSE_WAIT
CLOSE_WAIT是被動關閉鏈接是造成的。根據TCP狀態機,服務器端收到客戶端發送的FIN,則按照TCP實現發送ACK,所以進入CLOSE_WAIT狀態。但若是服務器端不執行close(),就不能由CLOSE_WAIT遷移到LAST_ACK,則系統中會存在不少CLOSE_WAIT狀態的鏈接。此時,多是系統忙於處理讀、寫操做,而未將已收到FIN的鏈接,進行close。此時,recv/read已收到FIN的鏈接socket,會返回0。
爲何須要 TIME_WAIT 狀態?
假設最終的ACK丟失,server將重發FIN,client必須維護TCP狀態信息以即可以重發最終的ACK,不然會發送RST,結果server認爲發生錯誤。TCP實現必須可靠地終止鏈接的兩個方向(全雙工關閉),client必須進入 TIME_WAIT 狀態,由於client可能面 臨重發最終ACK的情形。
爲何 TIME_WAIT 狀態須要保持 2MSL 這麼長的時間?
若是 TIME_WAIT 狀態保持時間不足夠長(好比小於2MSL),第一個鏈接就正常終止了。第二個擁有相同相關五元組的鏈接出現,而第一個鏈接的重複報文到達,干擾了第二個鏈接。TCP實現必須防止某個鏈接的重複報文在鏈接終止後出現,因此讓TIME_WAIT狀態保持時間足夠長(2MSL),鏈接相應方向上的TCP報文要麼徹底響應完畢,要麼被 丟棄。創建第二個鏈接的時候,不會混淆。
TIME_WAIT 和CLOSE_WAIT狀態socket過多
若是服務器出了異常,百分之八九十都是下面兩種狀況:
1.服務器保持了大量TIME_WAIT狀態
2.服務器保持了大量CLOSE_WAIT狀態,簡單來講CLOSE_WAIT數目過大是因爲被動關閉鏈接處理不當致使的。
由於linux分配給一個用戶的文件句柄是有限的,而TIME_WAIT和CLOSE_WAIT兩種狀態若是一直被保持,那麼意味着對應數目的通道就一直被佔着,並且是「佔着茅坑不使勁」,一旦達到句柄數上限,新的請求就沒法被處理了,接着就是大量Too Many Open Files異常,Tomcat崩潰。
7.關閉進程
$ ps -ef | grep nginx | grep -v grep | cut -c 9-15 | xargs kill -s 9
$ pgrep nginx | xargs kill -s 9
$ kill -s 9 `ps -aux | grep nginx | awk '{print $2}'`
$ pkill -9 nginx
服務器硬盤讀寫速度查看
yum install hdparm
hdparm -t /dev/sda
參數:
-a<快取分區> 設定讀取文件時,預先存入塊區的分區數,若不加上<快取分區>選項,則顯示目前的設定。
-A<0或1> 啓動或關閉讀取文件時的快取功能。
-c<I/O模式> 設定IDE32位I/O模式。
-C 檢測IDE硬盤的電源管理模式。
-d<0或1> 設定磁盤的DMA模式。
-f 將內存緩衝區的數據寫入硬盤,並清楚緩衝區。
-g 顯示硬盤的磁軌,磁頭,磁區等參數。
-h 顯示幫助。
-i 顯示硬盤的硬件規格信息,這些信息是在開機時由硬盤自己所提供。
-I 直接讀取硬盤所提供的硬件規格信息。
-k<0或1> 重設硬盤時,保留-dmu參數的設定。
-K<0或1> 重設硬盤時,保留-APSWXZ參數的設定。
-m<磁區數> 設定硬盤多重分區存取的分區數。
-n<0或1> 忽略硬盤寫入時所發生的錯誤。
-p<PIO模式> 設定硬盤的PIO模式。
-P<磁區數> 設定硬盤內部快取的分區數。
-q 在執行後續的參數時,不在屏幕上顯示任何信息。
-r<0或1> 設定硬盤的讀寫模式。
-S<時間> 設定硬盤進入省電模式前的等待時間。
-t 評估硬盤的讀取效率。
-T 評估硬盤快取的讀取效率。
-u<0或1> 在硬盤存取時,容許其餘中斷要求同時執行。
-v 顯示硬盤的相關設定。
-W<0或1> 設定硬盤的寫入快取。
-X<傳輸模式> 設定硬盤的傳輸模式。
-y 使IDE硬盤進入省電模式。
-Y 使IDE硬盤進入睡眠模式。
-Z 關閉某些Seagate硬盤的自動省電功能。
主機
dmidecode|grep "Product Name"
CPU
cat /proc/cpuinfo |grep name
內存
cat /proc/meminfo
網卡
dmesg|grep -i eth
系統版本
cat /etc/redhat-release
文件描述符
ulimit -a
sysctl -p
1 修改系統鏈接數
vim /etc/security/limits.conf
* soft nofile 1025500
* hard nofile 1025500
* soft nproc 1025500
* hard nproc 1025500
vim /etc/sysctl.conf
fs.file-max=1025500
net.core.netdev_max_backlog = 30000
net.core.somaxconn = 10000
net.core.rps_sock_flow_entries = 32768
net.ipv4.tcp_max_syn_backlog = 10000
net.ipv4.tcp_max_tw_buckets = 10000
net.ipv4.tcp_fin_timeout = 0
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_synack_retries = 10
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_keepalive_time = 180
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 5
net.ipv4.ip_local_port_range = 1024 65535
————————————————
一個完整的內核優化配置
net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
net.ipv4.tcp_max_tw_buckets = 6000
net.ipv4.tcp_sack = 1
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_rmem = 4096 87380 4194304
net.ipv4.tcp_wmem = 4096 16384 4194304
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.netdev_max_backlog = 262144
net.core.somaxconn = 262144
net.ipv4.tcp_max_orphans = 3276800
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_mem = 94500000 915000000 927000000
net.ipv4.tcp_fin_timeout = 1
net.ipv4.tcp_keepalive_time = 30
net.ipv4.ip_local_port_range = 1024 65000
————————————————
worker_cpu_affinity
16核
0000000000000001 0000000000000010 0000000000000100 0000000000001000 0000000000010000 0000000000100000 0000000001000000 0000000010000000 0000000100000000 0000001000000000 0000010000000000 0000100000000000 0001000000000000 0010000000000000 0100000000000000 1000000000000000
24核
000000000000000000000001 000000000000000000000010 000000000000000000000100 000000000000000000001000 000000000000000000010000 000000000000000000100000 000000000000000001000000 000000000000000010000000 000000000000000100000000 000000000000001000000000 000000000000010000000000 000000000000100000000000 000000000001000000000000 000000000010000000000000 000000000100000000000000 000000001000000000000000 000000010000000000000000 000000100000000000000000 000001000000000000000000 000010000000000000000000 000100000000000000000000 001000000000000000000000 010000000000000000000000 100000000000000000000000;
模擬獲取 referrer
curl -voa http://cdn.abc.com/a_s.png -s http://www.abc.com
主機 dmidecode|grep "Product Name"
CPU cat /proc/cpuinfo |grep name
內存 cat /proc/meminfo
網卡 dmesg|grep -i eth
系統 cat /etc/redhat-release
1 修改系統鏈接數
vim /etc/security/limits.conf
* soft nofile 1025500
* hard nofile 1025500
* soft nproc 1025500
* hard nproc 1025500
vim /etc/sysctl.conf
fs.file-max=1025500
net.core.netdev_max_backlog = 30000
net.core.somaxconn = 10000
net.core.rps_sock_flow_entries = 32768
net.ipv4.tcp_max_syn_backlog = 10000
net.ipv4.tcp_max_tw_buckets = 10000
net.ipv4.tcp_fin_timeout = 0
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_synack_retries = 10
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_keepalive_time = 180
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 5
net.ipv4.ip_local_port_range = 1024 65535
阿里雲 64核 128G 10Mbps (本機壓力測試)
1.nginx 靜態: 35W,106M
2.core2: 28W,62M
3.nginx proxy 靜態: 11W,34M
4.nginx proxy core2:1.6W,4M
1.nginx 靜態:35W,106M
[root@iZwz91q8mnpcpkZ vhosts]# bombardier -c2048 -n1000000 http://172.18.126.70:8080
Bombarding http://172.18.126.70:8080 with 1000000 request(s) using 2048 connection(s)
1000000 / 1000000 [====================================] 100.00% 343783/s 2s
Done!
Statistics Avg Stdev Max
Reqs/sec 355351.18 61617.11 409626.78
Latency 5.54ms 6.38ms 173.53ms
HTTP codes:
1xx - 0, 2xx - 1000000, 3xx - 0, 4xx - 0, 5xx - 0
others - 0
Throughput: 106.01MB/s
2.core2:28W,62M
[root@iZwz91q8mnpcpkZ vhosts]# bombardier -c2048 -n1000000 http://172.18.126.70:5000/api/values/5
Bombarding http://172.18.126.70:5000/api/values/5 with 1000000 request(s) using 2048 connection(s)
1000000 / 1000000 [====================================] 100.00% 274591/s 3s
Done!
Statistics Avg Stdev Max
Reqs/sec 280606.34 78367.87 362676.23
Latency 7.07ms 24.06ms 3.12s
HTTP codes:
1xx - 0, 2xx - 1000000, 3xx - 0, 4xx - 0, 5xx - 0
others - 0
Throughput: 62.73MB/s
3.nginx proxy 靜態: 11W,34M
[root@iZwz91q8mnpcpkZ vhosts]# bombardier -c2048 -n1000000 http://172.18.126.70
Bombarding http://172.18.126.70 with 1000000 request(s) using 2048 connection(s)
1000000 / 1000000 [====================================] 100.00% 113281/s 8s
Done!
Statistics Avg Stdev Max
Reqs/sec 115372.57 38341.72 160595.25
Latency 16.56ms 136.76ms 6.02s
HTTP codes:
1xx - 0, 2xx - 1000000, 3xx - 0, 4xx - 0, 5xx - 0
others - 0
Throughput: 34.57MB/s
4.nginx proxy core2:1.6W,4M
[root@iZwz91q8mnpcpkZ vhosts]# bombardier -c512 -n100000 http://172.18.126.70/api/values/5Bombarding http://172.18.126.70:80/api/values/5 with 100000 request(s) using 512 connection(s) 100000 / 100000 [=================================================================================================================] 100.00% 16102/s 6sDone!Statistics Avg Stdev Max Reqs/sec 16502.91 6246.65 23818.54 Latency 27.22ms 206.82ms 5.10s HTTP codes: 1xx - 0, 2xx - 100000, 3xx - 0, 4xx - 0, 5xx - 0 others - 0 Throughput: 4.13MB/s