查看硬件信息
---------------------------------------------------------------------------------------------------------------------------------------------
主機 dmidecode|grep "Product Name"
CPU cat /proc/cpuinfo |grep name
內存 cat /proc/meminfo
網卡 dmesg|grep -i eth
系統版本 cat /etc/redhat-release
查看物理cpu個數 grep 'physical id' /proc/cpuinfo | sort -u | wc -l
查看核心數量 grep 'core id' /proc/cpuinfo | sort -u | wc -l
查看線程數 grep 'processor' /proc/cpuinfo | sort -u | wc -l
查看硬盤空間占用 du -h -x --max-depth=1
文件描述符 ulimit -a
應用配置內核參數 sysctl -p
模擬獲取 referrer
curl -voa http://cdn.abc.com/a_s.png -s http://www.abc.com
BASH腳本測試
while true;do curl -L http://192.168.0.134:8080/;sleep 1.5;done
關閉進程
$ 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
1.wrk 安裝及使用
---------------------------------------------------------------------------------------------------------------------------------------------
[root@centos ~]# cd /usr/local/src
[root@centos ~]# yum install git -y
[root@centos ~]# git clone https://github.com/wg/wrk.git
[root@centos ~]# cd wrk
[root@centos ~]# make
[root@centos ~]# ln -s /usr/local/src/wrk/wrk /usr/local/bin
[root@centos ~]# wrk -t 2 -c 50 -d 20 --latency http://localhost:5000
參數說明:
-t 需要模擬的線程數
-c 需要模擬的連接數
-d 測試的持續時間
--timeout 超時的時間
--latency 顯示延遲統計
結果顯示說明:
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
通過lsof來查看網絡端口的進程
[root@centos ~]# lsof -i :48774
中間的<= =>這兩個左右箭頭,表示的是流量的方向。
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. 網速測試(git clone https://github.com/sivel/speedtest-cli.git)
---------------------------------------------------------------------------------------------------------------------------------------------
/usr/local/src
wget https://raw.github.com/sivel/speedtest-cli/master/speedtest.py
chmod a+rx speedtest.py
chown root:root /usr/local/bin/speedtest
./speedtest
Retrieving speedtest.net configuration...
Testing from Tianxin Group Co., Limited (42.32.125.38)...
Retrieving speedtest.net server list...
Selecting best server based on ping...
Hosted by STC (Hong Kong) [0.00 km]: 7.242 ms
Testing download speed................................................................................
Download: 4.76 Mbit/s
Testing upload speed................................................................................................
Upload: 2.78 Mbit/s
5.測試最大連接數測試
---------------------------------------------------------------------------------------------------------------------------------------------
/usr/local/src
wget --no-check-certificate https://github.com/ideawu/c1000k/archive/master.zip
unzip master.zip
cd c1000k-master
make
./server 7000
./client 127.0.0.1 7000
connections: 153
error: Too many open files
6. 硬盤讀寫速度查看
---------------------------------------------------------------------------------------------------------------------------------------------
yum install hdparm -y
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硬盤的自動省電功能。
7.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)
worker_cpu_affinity 提定CPU
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;
8.查看那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 這個是全局的限制連接數
9.查看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崩潰。
10.網站高並發測試
---------------------------------------------------------------------------------------------------------------------------------------------
硬件:虛擬機 64U+64G
[root@test ~]# uname -a
Linux test 5.7.8 #1 SMP Tue Jul 21 16:41:54 CST 2020 x86_64 x86_64 x86_64 GNU/Linux
[root@test ~]# free -h
total used free shared buff/cache available
Mem: 62G 30G 31G 8.8M 263M 31G
Swap: 19G 0B 19G
[root@test ~]# grep 'processor' /proc/cpuinfo | sort -u | wc -l
64
[root@test ~]# vim /etc/security/limits.conf
* soft nofile 1025500
* hard nofile 1025500
* soft nproc 1025500
* hard nproc 1025500
[root@test ~]# ulimit -n
1025500
[root@test ~]# vim /etc/sysctl.conf
net.core.default_qdisc=fq
net.ipv4.tcp_congestion_control=bbr
fs.file-max=1025500
fs.nr_open = 1025500
net.ipv4.ip_local_port_range = 1024 65535
net.core.somaxconn = 20480
net.core.netdev_max_backlog = 20480
net.ipv4.tcp_max_syn_backlog = 20480
net.ipv4.tcp_max_tw_buckets = 800000
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_max_tw_buckets = 6000
[root@test ~]# sysctl -p
[root@test ~]# cat /opt/nginx/conf/nginx.conf
user www www;
worker_processes 64;
pid logs/nginx.pid;
worker_rlimit_nofile 1025500;
error_log /data/www/error.log info;
events {
use epoll;
multi_accept on;
worker_connections 1025500;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
tcp_nopush on;
keepalive_timeout 65;
gzip off;
access_log off;
server {
listen 8080 backlog=20480;
server_name 192.168.0.135;
root /data/www/web;
location / {
index index.html index.htm;
}
}
include /opt/nginx/conf/vhosts/*.conf;
}
[root@test ~]# cat /opt/nginx/conf/vhosts/webapi.conf
upstream api_server {
server 127.0.0.1:5000;
keepalive 5000;
}
server {
listen 80 backlog=20480;
server_name 192.168.0.135;
location / {
proxy_pass http://api_server;
proxy_set_header Connection "keep-alive";
proxy_http_version 1.1;
#proxy_ignore_client_abort on;
#proxy_connect_timeout 600;
#proxy_read_timeout 600;
#proxy_send_timeout 600;
}
}
[root@test ~]# vim /etc/systemd/system/nginx.service
PrivateTmp=true
LimitNOFILE=1025500
[root@bogon ~]# vim /etc/systemd/system.conf
DefaultLimitNOFILE=1025500
DefaultLimitNPROC=1025500
-------------------------------------------------------------------------------------------------------
[root@test www]# wrk -t128 -c50000 -d10 "http://127.0.0.1:8080"
Running 10s test @ http://127.0.0.1:8080
128 threads and 50000 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 66.33ms 94.09ms 1.52s 90.49%
Req/Sec 6.79k 6.34k 79.32k 88.99%
9139684 requests in 11.53s, 2.02GB read
Requests/sec: 792648.96
Transfer/sec: 179.13MB
[root@test www]# wrk -t64 -c10000 -d10 "http://127.0.0.1:5000/api/values"
Running 10s test @ http://127.0.0.1:5000/api/values
64 threads and 10000 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 24.53ms 17.14ms 266.90ms 89.48%
Req/Sec 6.72k 2.18k 61.62k 88.33%
4390789 requests in 10.10s, 745.35MB read
Requests/sec: 434705.59
Transfer/sec: 73.79MB
[root@test www]# wrk -t64 -c2000 -d10 "http://127.0.0.1/api/values"
Running 10s test @ http://127.0.0.1/api/values
64 threads and 2000 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 6.65ms 6.01ms 115.26ms 92.35%
Req/Sec 5.21k 1.25k 30.37k 69.26%
3324771 requests in 10.10s, 656.19MB read
Requests/sec: 329173.19
Transfer/sec: 64.97MB
---------------------------------------------------------------------------------------------------------------------------------------------
硬件:虛擬機 8U+8G
[root@website ~]# wrk -t8 -c100 -d10 "http://192.168.0.135:8080"
Running 10s test @ http://192.168.0.135:8080
8 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 2.18ms 20.14ms 502.22ms 99.54%
Req/Sec 19.84k 7.55k 38.82k 63.00%
1581635 requests in 10.06s, 358.92MB read
Requests/sec: 157211.22
Transfer/sec: 35.68MB
[root@website ~]# wrk -t8 -c100 -d10 "http://192.168.0.135:5000/api/values"
Running 10s test @ http://192.168.0.135:5000/api/values
8 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 1.81ms 5.77ms 148.63ms 99.24%
Req/Sec 8.19k 1.29k 12.02k 77.75%
653072 requests in 10.03s, 110.86MB read
Requests/sec: 65083.94
Transfer/sec: 11.05MB
[root@website ~]# wrk -t8 -c100 -d10 "http://192.168.0.135/api/values"
Running 10s test @ http://192.168.0.135/api/values
8 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 2.37ms 1.24ms 29.58ms 81.58%
Req/Sec 5.13k 512.40 6.53k 71.25%
409021 requests in 10.04s, 80.73MB read
Requests/sec: 40755.37
Transfer/sec: 8.04MB