CentOS ip_conntrack: table full, dropping packet 的解决方法

那么,为什么会出现 ip_conntrack: table full, dropping packet 呢?iptables 使用一张连接跟踪表,来描述连接状态,当这张表满了,就会在日志里面写入该信息。这可能有点难以理解,那么到底在什么情况下,我们需要在日志里面查找这条记录呢?

当你发现,PING 服务器的结果,出现丢包,或者出现延迟不稳定,忽高忽低,在排除线路因素之后,就应当考虑 ip_conntrack: table full, dropping packet 。

下面介绍 ip_conntrack: table full, dropping packet 的解决方法:

CentOS 6 /RHEL 5 下的解决方法:

1.运行

复制代码

代码如下:

sysctl -w net.ipv4.netfilter.ip_conntrack_max=100000.sysctl -w net.ipv4.netfilter.ip_conntrack_max=100000

2.在 /etc/sysctl 中加入:

复制代码

代码如下:

net.ipv4.netfilter.ip_conntrack_max = 100000.net.ipv4.netfilter.ip_conntrack_max = 100000

3.使其生效:

复制代码

代码如下:

sysctl -p.sysctl -p

CentOS 6 /RHEL 6 下的解决方法:

1.运行

复制代码

代码如下:

sysctl -w net.nf_conntrack_max=100000.sysctl -w net.nf_conntrack_max=100000

2.在 /etc/sysctl 中加入:

复制代码

代码如下:

net.nf_conntrack_max = 100000.net.nf_conntrack_max = 100000

3.使其生效:

复制代码

代码如下:

sysctl -p.sysctl -p

*** 如果 Xen DomU 出现零星丢包或者 PING 忽高忽低,同时关闭 iptables 后 ping 正常,则多半是这个问题。

或参考下面的方法试试

一。服务器出现了大量的丢包现象,通过查看message出现了下面的错误:
kernel:ip_conntrack:table full,dropping packet

解决的方法:

复制代码

代码如下:

显示当前的会话数:
cat /proc/net/ip_conntrack | wc -l
显示系统目前配置的最大 conntrack 数:
cat /proc/sys/net/ipv4/ip_conntrack_max
# 一旦前者的数字大于后者时,系统就报错,解决办法:
echo “” > /proc/sys/net/ipv4/ip_conntrack_max
# 然后写入
/etc/sysctl.conf
net.ipv4.ip_conntrack_max =


有两点我们要注意.

-conntrack最大数量.叫做conntrack_max
-存储这些conntrack的hash表的大小,叫做hashsize
当conntrack入口数大于conntrack_max时,在hash表中每一个conntrack list中的存储的入口将不可控.(conntrack_mark/hashsize 为每个list所能存储的入口的数量)
hash表存在于固定的的不可swap的内存中. conntrack_mark决定占用多少这些不可swap的内存.
缺省的hashsize
——————————–
conntrack_max=hashsize*8
i386中 hashsize=conntrack_max/8=ramsize(in bytes)/131072=ramsize(in MegaBytes)*8.
所以32位pc,512M内存可以存512*1024^2/128/1024=512*8=4096(连接池list)
但是正确的算法是:
hashsize=conntrack_max/8=ramsize(in bytes)/131072/(x/32)
x表示使用的指针类型是(32位还是64的)
—————————-\
读取conntrack_max值
2.4内核
cat /proc/sys/net/ipv4/ip_conntrack_max
2.6内核
cat /proc/sys/net/ipv4/netfilter/ip_conntrack_max

读取hashsize值
cat /proc/sys/net/ipv4/netfilter/ip_conntrack_buckets
——————————
你可修改这两个值以适应高负载的netfilter的应用
系统默认为conntrack_max:hashsize是8:1,你可以设成1:1以提高性能.
————————-
设置conntrack_max
echo $CONNTRACK_MAX > /proc/sys/net/ipv4/ip_conntrack_max
设置hashsize
如果(netfilter conntrack静态编译在内核中),2.4中可以在编译时设置,2.6可以在启动中(boot时)加入ip_conntrack.hashsize=$hashsize
如果为modules,则可以使用 modprobe ip_conntrack hashsize=$hashsize
#####################################
实践过方法:
Vi /etc/modprobe.conf
添加:
options ip_conntrack hashsize=524288

vi /etc/sysctl.conf
net.ipv4.netfilter.ip_conntrack_max = 524288 (根据自己的物理内存算出来的)
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 180
##########################################
————————–
conntrack使用的内存计算
size_of_mem_used_by_conntrack (in bytes) =
CONNTRACK_MAX * sizeof(struct ip_conntrack) +
HASHSIZE * sizeof(struct list_head)
其中sizeof(struct ip_conntrack)大概在192-352字节之间.
sizeof(struct list_head) = 2 * size_of_a_pointer(i386中为4字节)
一个例子512m内存,使用384m来用于conntrack则
384*1024*1024/(352+8)(使用它是保守计算) =~1143901 (此为conntrack:hashszie为1:1,352为sizeof(ip_conntrack),8为sizeof(list_head).
由于hash最好设为2的乘方的数,所以为1048576(2^20).
———————
附相关设置及命令:
ip_conntrack timeout 原值432000秒(5天)
可改为10小时,echo “600″ > /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established
ip_conntrack buffer使用情况
grep conn /proc/slabinfo
例ip_conntrack 188069 229570 336 11 1 : tunables 54 27 8 : slabdata 20870

相关修改:
echo “1024 65000″ > /proc/sys/net/ipv4/ip_local_port_range
echo “100 1200 128 512 15 5000 500 1884 2″>/proc/sys/vm/bdflush
echo “1″ > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
echo “1″ > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
echo “1048576″ > /proc/sys/net/ipv4/netfilter/ip_conntrack_max
echo “1″ > /proc/sys/net/ipv4/ip_forward
echo “268435456″ >/proc/sys/kernel/shmall
echo “536870912″ >/proc/sys/kernel/shmmax
echo “600″ > /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established
echo “1024″ > /proc/sys/net/ipv4/neigh/default/gc_thresh1
echo “2048″ > /proc/sys/net/ipv4/neigh/default/gc_thresh2
echo “4096″ > /proc/sys/net/ipv4/neigh/default/gc_thresh3
echo “52428800″ > /proc/sys/net/ipv4/route/max_size
echo “1″ > /proc/sys/net/ipv4/conf/all/proxy_arp
echo “1″ > /proc/sys/net/ipv4/tcp_window_scaling

分类:RedHat/Centos 时间:2012-11-15 人气:1
本文关键词: table ip_conntrack Full dropping packet
分享到:

相关文章

  • iptables的conntrack表满了导致访问网站很慢 2014-09-13

      现象:突然发现访问网站很慢,服务器的cpu、内存和磁盘使用率都正常   分析过程及解决方案:查询/var/log/message日志发现有这样的记录“ip_conntrack table full dropping packet”。kernel 用 ip_conntrack 模块来记录 iptables 网络包的状态,并保存到 table 里(这个 table 在内存里),如果网络状况繁忙,比如高连接,高并发连接等会导致逐步占用这个 table 可用空间,一般这个 table 很大不容易占满

  • sql语句中删除表数据drop.truncate和delete的用法 2013-07-19

      虽然绿色资源网小编不建议大家去用命令删除数据库表中的东西,但是这些删除命令总有用的着的地方。   说到删除表数据的关键字,大家记得最多的可能就是delete了   然而我们做数据库开发,读取数据库数据.对另外的两兄弟用得就比较少了   现在来介绍另外两个兄弟,都是删除表数据的,其实也是很容易理解的   老大------drop   出没场合:drop table tb --tb表示数据表的名字,下同   绝招:删除内容和定义,释放空间。简单来说就是把整个表去掉.以后要新增数据是不可能的,除非

  • sql语句中----删除表数据drop.truncate和delete的用法 2013-10-06

    虽然西西不建议大家去用命令删除数据库表中的东西,但是这些删除命令总有用的着的地方。 说到删除表数据的关键字,大家记得最多的可能就是delete了 然而我们做数据库开发,读取数据库数据.对另外的两兄弟用得就比较少了 现在来介绍另外两个兄弟,都是删除表数据的,其实也是很容易理解的 老大------drop 出没场合:drop table tb --tb表示数据表的名字,下同 绝招:删除内容和定义,释放空间。简单来说就是把整个表去掉.以后要新增数据是不可能的,除非新增一个表, 例如:一个班就是一个表,

  • Hierarchical query-层次查询之START WITH CONNECT BY用法 2012-01-01

    Hierarchical query-层次查询中start with...connect by prior子句用法; connect by 是结构化查询中用到的,其基本语法是: select ... from tablename start with 条件1 connect by 条件2 where 条件3; 例: select level,empno,ename,job,mgr from emp start with empno=7566 or empno=7788 connect by pr

  • ORACLE临时表总结 2012-02-02

    临时表概念 临时表就是用来暂时保存临时数据(亦或叫中间数据)的一个数据库对象,它和普通表有些类似,然而又有很大区别。它只能存储在临时表空间,而非用户的表空间。ORACLE临时表是会话或事务级别的,只对当前会话或事务可见。每个会话只能查看和修改自己的数据。 临时表语法 临时表分类 ORACLE临时表有两种类型:会话级的临时表和事务级的临时表。 1)ON COMMIT DELETE ROWS 它是临时表的默认参数,表示临时表中的数据仅在事物过程(Transaction)中有效,当事物提交(COMMI

  • [每日一题] OCP1z0-047 :2013-07-22 group by子句 2012-02-20

    [每日一题] OCP1z0-047 :2013-07-22 group by子句 这道题就是考where group by having的顺序。。。 答案A不正确:where应该放在group by前面 答案B不正确:having子句是用多行函数(sum,avg,max,min,count)等做为条件 答案C不正确:where应该放在group by前面 参考如下:(其实having 也可以放在group by前面) SELECT column, group_function FROM tabl

  • [每日一题] OCP1z0-047 :2013-08-08相关子查询中EXISTS的使用 2012-02-27

    [每日一题] OCP1z0-047 :2013-08-08相关子查询中EXISTS的使用 正确答案是:AC EXISTS谓词非常简单,它是对一个非空集的测试。如果在其子查询中存在任何行,则返回TRUE,否则为FALSE。该谓词不会返回UNKNOWN结果。EXIST()谓词语法如下: <EXISTS谓词>::=[NOTEXISTS]<表子查询> 对exists的测试,看执行计划: [html] [email protected]> create table t3(id number,n

  • oracle,sqlserver,MySQL数据库语句对照表 2012-03-09

    -- 创建表语句 ORACLE: create table _table_name( column1 varchar2(10) primary key, column2 number(5) not null, memo varchar2(100) ); comment on column _table_name.column1 is '这是column1的注释'; SQLSERVER: create table _table_name( column1 varchar(10) primary k

  • MySQL权限的详细解答 2012-05-08

       - 一.权限表 mysql数据库中的3个权限表:user 、db、 host 权限表的存取过程是: 1)先从user表中的host、 user、 password这3个字段中判断连接的IP、用户名、密码是否存在表中,存在则通过身份验证; 2) 通过权限验证,进行权限分配时,按照user?db?tables_priv?columns_priv的顺序进行分配。即先检查全局权限表 user,如果user中对应的权限为Y,则此用户对所有数据库的权限都为Y,将不再检查db, tables_priv,

Copyright (C) quwantang.com, All Rights Reserved.

趣玩堂 版权所有 京ICP备15002868号

processed in 0.088 (s). 10 q(s)