注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

无明

 
 
 

日志

 
 

解決 Linux “ip_conntrack: table full ,dropping packet” 的方法  

2011-11-11 22:47:46|  分类: 报错 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

用Apache自带的压力测试程序对我的服务器进行测试的时候出现这种情况:

使用命令 ./ar -c100 -n10000 http://localhost/index.php>10000info

第一次测试一切正常,紧接着再次运行上面命令的时候,当运行到Completed 6000 requests的时候标准输出就会出现ip_conntrack: table full, dropping packet。估计是IP连接跟踪功能的相关设定所致,但是却无法下手。google了一下才知道在proc中可以直接查到ip_conntrack_max的值,输入如下命令:

cat /proc/sys/net/ipv4/ip_conntrack_max

命令输出16280


呵呵,原来如此,怪不得每次重新启动Apache后运行第二次压力测试到6000的时候就会出现table full。但是又想ip_conntrack的跟踪时间总得有个有效时间吧,其实也可以查到输入命令:

cat /proc/sys/net/ipv4/nerfilter/ip_conntrack_tcp_timeout_established

结果显示432000,呵呵12个小时啊!为什么系统默认的设定是这么久呢?不懂,难道是为了对付慢速扫描的黑客?以后继续研究,解决眼前问题先。


知道原因了,解决起来自然有方法了,方案有两条:1、加大ip_conntrack_max的值。2、减小ip_conntrack_tcp_timeout_established的数值。


对于Apache服务器来说,每天1W的IP访问量,这些访问量应该是集中在12小时的时间段内,每个IP平均10次服务器请求,所以这个值应该在10W左右,呵呵,这么算对不对?先这么办吧!


cat "100000" > /proc/sys/net/ipv4/ip_conntrack_max


这是暂时的效果,如果要每次开机都使用这个数值,将上面的命令写入/etc/rc.d/rc.local或是在/etc/sysctl.conf中加入net.ipv4.ip_conntrack_max = 10000  。或者使用命令 sysctl -w net.ipv4.ip_conntrack_max = 10000


2、设定时间:


echo "数值" >/proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established


设定自动开机启用同上

查出目前ip_conntrack buffer使用状况


命令:grep conn /proc/slabinfo

 

查出目前 ip_conntrack 记录最多的前五个IP

命令:


cat /proc/net/ip_conntrack | cut -d ' ' -f 10 |cut -d '=' -f2 |sort |uniq -c |sort -nr |head -n 5


上面命令的结果可以让你查出一些异常的IP连接你的apache服务器。

http://ltfan.blog.163.com/blog/#m=0

  评论这张
 
阅读(117)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018