一.Linux内存高,触发oom-killer问题解决
1.linux的内存问题,其一是触发了oom-killer导致系统挂
首先确认该系统的版本是32位,执行 uname -a
2.了解一下32位Linux的内存管理结构
# DMA: 0x00000000 - 0x00999999 (0 - 16 MB)
# LowMem: 0x01000000 - 0x037999999 (16 - 896 MB) - size: 880MB
# HighMem: 0x038000000 - <硬件特定>
内核使用low memory来跟踪所有的内存分配,这样的话一个16GB内存的系统比一个4GB内存的系统,需要消耗更多的low memory,当low memory耗尽,即便系统仍然有剩余内存,仍然会触发oom-killer。在2.6内核的表现是,杀掉占用内存最高的进程,所以会导致sshd等进程被杀掉,造成系统无法登录。
3. 如何查看lowMem
free -lm
所以我们需要保护LowMem,在2.6内核引入了lower_zone_protection,这将让内核愿意保护low memory,从而在分配内存时优先考虑从high memory分配。
cat /proc/sys/vm/lower_zone_protection
0
echo 400 > /proc/sys/vm/lower_zone_protection
如果该系统的版本是64位
用ps查看各进程的内存,大约就占用了4G, 绝大部分内存都是被Page Cache所占用。Linux内核的策略是最大程度的利用内存cache 文件系统的数据,提高IO速度,虽然在机制上是有进程需要更大的内存时,会自动释放Page Cache,但不排除释放不及时或者释放的内存由于存在碎片不满足进程的内存需求。所以我们需要一个方法,能够限定PageCache的上限。
Linux 提供了这样一个参数min_free_kbytes,用来确定系统开始回收内存的阀值,控制系统的空闲内存。值越高,内核越早开始回收内存,空闲内存越高。
cat /proc/sys/vm/min_free_kbytes
163840
echo 963840 > /proc/sys/vm/min_free_kbytes
其他可选的临时解决方法:
关闭oom-killer
cat /proc/sys/vm/oom-kill
echo "0" > /proc/sys/vm/oom-kill
vi /etc/sysctl.conf
vm.oom-kill = 0
2. 清空cache (可选)
echo 1 > /proc/sys/vm/drop_caches
二.nf_conntrack满之解决方法
1.现象
/var/log/message报错nf_conntrack: table full, dropping packet
2.排查思路
查看当前的连接数
grep nf_conntrack /proc/slabinfo
查出目前 nf_conntrack 的排名
cat /proc/net/nf_conntrack | cut -d ' ' -f 10 | cut -d '=' -f 2 | sort | uniq -c | sort -nr | head -n 10
查看对应参数默认配置
sysctl -a | grep nf_conntrack
lsmod | grep nf_conntrack
3.优化参数
状态跟踪表的最大行数的设定,理论最大值 CONNTRACK_MAX = RAMSIZE (in bytes) / 16384 / (ARCH / 32)
以64G的64位操作系统为例,CONNTRACK_MAX = 64*1024*1024*1024/16384/2 = 2097152
即时生效请执行:
sysctl –w net.netfilter.nf_conntrack_max = 524288 (16G)
其哈希表大小通常为总表的1/8,最大为1/2。CONNTRACK_BUCKETS = CONNTRACK_MAX / 8
同样64G的64位操作系统,哈希最佳范围是 262144 ~ 1048576 。
运行状态中通过 sysctl net.netfilter.nf_conntrack_buckets 进行查看,通过文件 /sys/module/nf_conntrack/parameters/hashsize 进行设置
或者新建 /etc/modprobe.d/iptables.conf ,重新加载模块才生效:
options nf_conntrack hashsize = 262144
modprobe
优化参数
net.netfilter.nf_conntrack_max = 1048576
net.netfilter.ip_conntrack_tcp_timeout_established = 3600
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120