1、查看apache当前并发访问数:

#对比httpd.conf中MaxClients的数字差距多少。

netstat -an | grep ESTABLISHED | wc -l


2、查看httpd进程数(即prefork模式下Apache能够处理的并发请求数):

ps aux|grep httpd|wc -l


3、可以使用如下参数查看数据


ps -ef|grep httpd|wc -l

#1388

#统计httpd进程数,连个请求会启动一个进程,使用于Apache服务器。

#表示Apache能够处理1388个并发请求,这个值Apache可根据负载情况自动调整。

netstat -nat|grep -i "80"|wc -l

#4341

#netstat -an会打印系统当前网络链接状态,而grep -i "80"是用来提取与​​80端口​​有关的连接的,wc -l进行连接数统计。

#最终返回的数字就是当前所有​​80端口​​的请求总数。

netstat -na|grep ESTABLISHED|wc -l

#376

#netstat -an会打印系统当前网络链接状态,而grep ESTABLISHED 提取出已建立连接的信息。 然后wc -l统计。


#最终返回的数字就是当前所有​​80端口​​的已建立连接的总数。

netstat -nat||grep ESTABLISHED|wc

#可查看所有建立连接的详细记录


4、查看Apache的并发请求数及其TCP连接状态:


netstat -n | awk '/^tcp/ {++S[$NF]} END {for (a in S) print a, S[a]}'


(这条语句是从 ​​新浪​​互动社区事业部 ​​新浪​​互动社区事业部技术总监王老大那儿获得的,非常不错)返回结果示例:



LAST_ACK 5

​SYN_RECV​​ 30

ESTABLISHED 1597

FIN_WAIT1 51

FIN_WAIT2 504

TIME_WAIT 1057


其中:

  ​​SYN_RECV​​表示正在等待处理的请求数;

  ESTABLISHED表示正常数据传输状态;

  TIME_WAIT表示处理完毕,等待超时结束的请求数。


5、输出每个ip的连接数,以及总的各个状态的连接数

netstat -n | awk '/^tcp/ {n=split($(NF-1),array,":");if(n<=2)++S[array[(1)]];else++S[array[(4)]];++s[$NF];++N} END {for(a in S){printf("%-20s %s\n", a, S[a]);++I}printf("%-20s %s\n","TOTAL_IP",I);for(a in s) printf("%-20s %s\n",a, s[a]);printf("%-20s %s\n","TOTAL_LINK",N);}'


​​



fin_wait1状态是在server端主动要求关闭tcp连接,并且主动发送fin以后,等待client端回复ack时候的状态。


fin_wait1的产生原因有很多,需要结合netstat的状态来分析。

netstat -nat|awk '{print awk $NF}'|sort|uniq -c|sort -n

上面的命令可以帮助分析哪种tcp状态数量异常

netstat -nat|grep ":80"|awk '{print $5}' |awk -F: '{print $1}' | sort| uniq -c|sort -n

则可以帮助你将请求80服务的client ip按照连接数排序。

回到fin_wait1这个话题,如果发现fin_wait1状态很多,并且client ip分布正常,那可能是有人用肉鸡进行​​ddos攻击​​、又或者最近的程序改动引起了问题。一般说来后者可能性更大,应该主动联系程序员解决。

但是如果有某个ip连接数非常多,就值得注意了,可以考虑用iptables直接封了他。


​​