Chinaunix首页 | 论坛 | 博客
  • 博客访问: 185860
  • 博文数量: 46
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 490
  • 用 户 组: 普通用户
  • 注册时间: 2017-03-26 14:22
个人简介

做最Low逼的DBA

文章分类

全部博文(46)

文章存档

2017年(46)

我的朋友

分类: LINUX

2017-04-26 23:06:02

--转载至其他大神的博客,如有侵权,请联系我删除
为什么会出现 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

阅读(2102) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~