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