在网站接见慢的时刻,要能迅速查找慢的缘故原由,这其中,检查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,找到了详细的页面,就可以举行详细的处置了。