在网站访问慢的时候,要能迅速查找慢的原因,这其中,检查web状态至关重要,web状态是指目前网站的并发数、等待数、QPS/TPS等信息,如何获取这些状态信息呢,需要使用多个命令组合来完成,这里就web日常运维中经常用到的一些命令和组合分享给大家,作为调优依据。

1、查看TCP连接状态
netstat -nat |awk '{print $6}'|sort|uniq -c|sort -rn
netstat -n |awk '/^tcp/ {print $NF}'|sort|uniq -c|sort -rn
netstat -n | awk '/^tcp/ {++S[$NF]};END {for(a in S) print a, S[a]}'
netstat -n | awk '/^tcp/ {++state[$NF]}; END {for(key in state) print key,"\t",state[key]}'
netstat -n | awk '/^tcp/ {++arr[$NF]};END {for(k in arr) print k,"\t",arr[k]}'
netstat -ant | awk '{print $NF}' | grep -v '[a-z]' | sort | uniq -c
上面这些命令的输出内容大致一样,只是输出方式不同而已,各取所好即可。例如:
[root@test ~]# netstat -n |awk '/^tcp/ {print $NF}'|sort|uniq -c|sort -rn
1739 ESTABLISHED
159 TIME_WAIT
7 FIN_WAIT1
2 LAST_ACK
2 CLOSE_WAIT
1 SYN_RECV
从输出可以看到,这些都是TCP的连接状态,第一列输出的是每个连接状态的目前连接数量,第二列对应的是目前的TCP连接状态。那么重点要注意的是TIME_WAIT,这个TIME_WAIT是指在四次挥手过程中,首先调用关闭连接发起的一方,在发送最后一个ACK之后就会进入TIME_WAIT的状态,过多的TIME_WAIT连接,有什么坏处呢,我们来解释一下:
在高并发短连接的TCP服务器上,当服务器处理完请求后,会立刻主动正常关闭连接,此时就会出现大量socket处于TIME_WAIT状态,如果客户端的并发量持续增高,此时部分客户端就会显示连接不上服务器,为什么呢,因为服务器端资源用完了。这里的资源主要指服务器临时连接端口。
服务器可用的端口有个0~65535这么多,其实这真的很少,再刨除系统和其他服务要用的,剩下的就更少了。而高并发短连接场景可以让服务器在短时间范围内同时占用大量端口。
举个例子:
比如访问一个web页面,一秒钟的http短连接处理完成后,在关闭连接之后,这个业务用过的端口会停留在TIME_WAIT状态几分钟,而这几分钟,其它HTTP请求过来的时候是无法占用此端口的(典型的占着茅坑不。。。)。如果此时监控服务器的利用率会发现,服务器干正经事的时间和端口(资源)被挂着无法被使用的时间比例是1比几百,这就导致服务器资源严重浪费。
所以,过多的TIME_WAIT严重影响业务的正常运行。

2、查找较多TIME_WAIT、SYN连接的IP
这个命令比较常用,命令组合如下:
netstat -n|grep TIME_WAIT|awk '{print $5}'|sort|uniq -c|sort -rn|head -n20
例如:
[root@localhost ~]# netstat -n|grep TIME_WAIT|awk '{print $5}'|sort|uniq -c|sort -rn|head -n20
1 94.191.97.234:64866
1 94.191.93.141:57715
1 94.191.91.162:54785
还可以使用这个命令组合:
netstat -an | grep SYN | awk '{print $5}' | awk -F: '{print $1}' | sort | uniq -c | sort -nr | more
例如:
[root@localhost ~]# netstat -an | grep SYN | awk '{print $5}' | awk -F: '{print $1}' | sort | uniq -c | sort -nr | more
2 60.190.233.106
2 39.179.58.66

3、用tcpdump嗅探80端口看看哪个IP访问最频繁
通过tcpdump命令集合awk过滤来实现:
tcpdump -i eth0 -tnn dst port 80 -c 1000 | awk -F"." '{print $1"."$2"."$3"."$4}' | sort | uniq -c | sort -nr |head -n 20
来看个例子:
[root@test ~]# tcpdump -i eth0 -tnn dst port 80 -c 1000 | awk -F"." '{print $1"."$2"."$3"."$4}' | sort | uniq -c | sort -nr |head -n 20
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
1000 packets captured
1000 packets received by filter
0 packets dropped by kernel
290 IP 183.215.254.13
264 IP 111.39.161.182
251 IP 211.143.17.76

4、查找请求数请10个IP
这个命令组合常用来查找网站攻 击来源IP,命令如下:
netstat -anlp|grep 80|grep tcp|awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -nr|head -n10
netstat -ant |awk '/:80/{split($5,ip,":");++A[ip[1]]}END{for(i in A) print A[i],i}' |sort -rn|head -n10
这个命令最经常使用,特别是当网站访问量莫名升高的时候,例如:
[root@test ~]# netstat -anlp|grep 80|grep tcp|awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -nr|head -n5
124 27.148.154.216
85 27.148.154.162
82 27.148.154.217
81 27.148.154.159
78 221.235.244.60

5、查看有哪些爬虫在抓取我的网站
这个命令也非常有帮助,因为有时候大量爬虫,特别是流氓爬虫来爬取网站的时候,会占用大量服务器资源,针对这种情况,必须禁止这些爬虫的爬取:
tcpdump -i eth0 -l -s 0 -w - dst port 80 | strings | grep -i user-agent | grep -i -E 'bot|crawler|slurp|spider'
例如:
[root@test ~]# tcpdump -i eth0 -l -s 0 -w - dst port 80 | strings | grep -i user-agent | grep -i -E 'bot|crawler|slurp|spider'
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 7_0 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11A465 Safari/9537.53 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)
User-Agent: Mozilla/5.0 (compatible; Baiduspider-render/2.0; +http://www.baidu.com/search/spider.html)
User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1 (compatible; Baiduspider-render/2.0; +http://www.baidu.com/search/spider.html)
从输出可看出,有百度、bing等爬虫目前再爬我的网站。

6、获取访问次数最多的文件或页面,取前10
先来看个例子:
[root@test logs]# cat miivey_access.log |awk '{print $11}'|sort|uniq -c|sort -nr|head -n 10
12817067 "http://www.abc.com/"
1279583 "http://www.abc.com/cn/"
387843 "http://www.habcd.com/"
335286 "http://www.abc.com/cn/m/index.html"
这个命令组合主要是读取日志文件,然后获取访问量最高的文件或页面。

7、统计http连接状态
首先统计出日志中所有的连接状态码,以及每个状态码的数量:
[root@test logs]# cat miivey_access.log |awk '{print $9}'|sort|uniq -c|sort -rn
457030 200
17035 404
2189 304
1953 499
426 405
可以看出,状态码为200的数量有457030个,状态码为404的数量为17035,也非常多,这么多的404状态,肯定会对网站有影响,那么接下来就看看就有哪些404页面:
[root@test logs]# awk '($9 ~/404/)' miivey_access.log | awk '{print $9,$7}' | sort
404 /zzb.php
404 //zzk.aspx
404 //zzk.aspx
404 //zzk.aspx
404 //zzk.aspx
这个命令组合中,主要是扑获访问出现404状态的页面是哪些,从输出可以看到哪些页面是404,找到了具体的页面,就可以进行具体的处理了。