参考原文 中文版 说是zz,好歹也是自己看完以后的zz,所以组织语言次序都是自己来: 首先解释两个概念性的名词

conntrack最大数量.叫做conntrack_max 存储这些conntrack的hash表的大小,叫做hashsize hash表存在于固定的的不可swap的内存中. conntrack_mark决定占用多少这些不可swap的内存 hashsize=conntrack_max/8=ramsize(in bytes)/131072/(x/32) x表示使用的指针类型是(32位还是64的)

读取conntrack_max值 cat /proc/sys/net/ipv4/ip_conntrack_max

读取hashsize值 cat /proc/sys/net/ipv4/netfilter/ip_conntrack_buckets

ip_conntrack buffer使用情况 grep conn /proc/slabinfo

文章提出的sysctl参数修改:

#允许TCP/UDP打开的本地端口范围
echo "1024 65000" > /proc/sys/net/ipv4/ip_local_port_range
#内存脏数据回收参数,2.6内核中没有……
echo "100 1200 128 512 15 5000 500 1884 2">/proc/sys/vm/bdflush
#禁止ICMP ECHO响应
echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
#记录伪装广播帧响应日志
echo "1" > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
#允许转发
echo "1" > /proc/sys/net/ipv4/ip_forward
#可用的共享内存总量(bytes)
echo "268435456" >/proc/sys/kernel/shmall
#内核允许的最大共享内存段大小(bytes)
echo "536870912" >/proc/sys/kernel/shmmax
#链接跟踪库允许的最大值
echo "1048576" > /proc/sys/net/ipv4/netfilter/ip_conntrack_max
#TCP链接established状态的超时时间,同理,还有wait/close/last_ack等的超时时间设定
echo "600" > /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established
#决定检查一次相邻层记录的有效性的周期
echo "240" > /proc/sys/net/ipv4/neigh/default/gc_stale_time
#存在于ARP高速缓存中的最少层数,如果少于这个数,垃圾收集器将不会运行
echo "1024" > /proc/sys/net/ipv4/neigh/default/gc_thresh1
#保存在 ARP 高速缓存中的最多的记录软限制。垃圾收集器在开始收集前,允许记录数超过这个数字 5 秒
echo "2048" > /proc/sys/net/ipv4/neigh/default/gc_thresh2
#保存在 ARP 高速缓存中的最多记录的硬限制,一旦高速缓存中的数目高于此,垃圾收集器将马上运行
echo "4096" > /proc/sys/net/ipv4/neigh/default/gc_thresh3
#路由缓存最大值
echo "52428800" > /proc/sys/net/ipv4/route/max_size
#允许中继网络中的arp包
echo "1" > /proc/sys/net/ipv4/conf/all/proxy_arp
#TCP/IP会话的滑动窗口大小可变
echo "1" > /proc/sys/net/ipv4/tcp_window_scaling

最直接看到的两个调整,就是ip_conntrack_max和ip_conntrack_tcp_timeout_established了。 而gc_*四个参数,是修改内核维护ARP表的参数,当arp -an|wc -l大于300的话,就需要修改这些参数,不然会出现“neighbour table overflow”或者“kernel: printk: 24 messages suppressed”这样的syslog,导致服务器ssh、ping无响应!