最近遇到两起Linux的内存问题,其一是触发了oom-killer导致系统挂
1. 首先确认该系统的版本是32位
#uname -a Linux alarm 2.6.9-67.ELsmp #1 SMP Wed Nov 7 13:58:04 EST 2007 i686 i686 i386 |
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
-bash-3.00# free -lm total used free shared buffers cached Mem: 2026 1973 52 0 36 1303 Low: 874 823 51 High: 1151 1150 1 -/+ buffers/cache: 633 1392 Swap: 3067 142 2924
4. 所以我们需要保护LowMem,在2.6内核引入了lower_zone_protection,这将让内核愿意保护low memory,从而在分配内存时优先考虑从high memory分配。
-bash-3.00# cat /proc/sys/vm/lower_zone_protection 0 -bash-3.00#echo 400 > /proc/sys/vm/lower_zone_protection |
另一起问题是24G内存的系统,空闲内存已经不到50M
1. 确认该系统的版本是64位
# uname -a Linux gxgd-nms-app 2.6.18-194.el5xen #1 SMP Tue Mar 16 22:01:26 EDT 2010 x86_64 x86_64 x86_64 GNU/Linux |
2. 用ps查看各进程的内存,大约就占用了4G, 绝大部分内存都是被Page Cache所占用。Linux内核的策略是最大程度的利用内存cache 文件系统的数据,提高IO速度,虽然在机制上是有进程需要更大的内存时,会自动释放Page Cache,但不排除释放不及时或者释放的内存由于存在碎片不满足进程的内存需求。
所以我们需要一个方法,能够限定PageCache的上限。
Linux 提供了这样一个参数min_free_kbytes,用来确定系统开始回收内存的阀值,控制系统的空闲内存。值越高,内核越早开始回收内存,空闲内存越高。
[root@zyite-app01 root]# cat /proc/sys/vm/min_free_kbytes 163840 echo 963840 > /proc/sys/vm/min_free_kbytes |
其他可选的临时解决方法:
关闭oom-killer
echo "0" > /proc/sys/vm/oom-kill
vi /etc/sysctl.conf
vm.oom-kill = 0
2. 清空cache (可选)
echo 1 > /proc/sys/vm/drop_caches
相关推荐
- 如果上述优化措施无法解决问题,可能需要考虑增加服务器的物理内存,或者采用更高效能的硬件。 8. **保持MySQL版本更新**: - 确保MySQL版本是最新的,以获得已知问题的修复和性能改进。 总之,解决MySQL触发...
在实际应用中,避免触发OOM Killer的方法包括合理分配内存,及时释放不再使用的资源,以及使用内存限制工具(如cgroups)来控制进程的内存使用。同时,对于某些对内存需求较高的服务,可以考虑使用专用的内存交换...
计算结果越高,表示进程占用的内存越多,越容易被OOM Killer杀掉。 在选择“bad”进程时,OOM Killer还会考虑到进程的其他信息,如进程的优先级、内存占用情况等。这样可以确保OOM Killer杀掉的进程是真正的内存...
如果一个应用持续占用大量内存,系统为了保护整体稳定性和用户体验,可能会触发OOM Killer,选择性地杀死一些内存占用高的进程。 **内存泄露分析:** 内存泄露是导致OOM的常见原因之一。当一个对象不再使用但仍然被...
而"oom_kill_process()->dump_header()->show_mem()"则提供了系统内存状态的详细视图,包括匿名页面、Page Cache等,让我们了解系统在触发OOM时的整体内存分配情况。 "oom_kill_process()->dump_header()->dump_...
- 当内存资源紧张时,Linux会触发一系列机制,如OOM Killer(Out of Memory Killer),以防止系统崩溃。 9. **物理地址空间与线性地址空间**: - **物理地址**是硬件实际的内存地址。 - **线性地址**是进程看到...
6. **内存压榨(OOM,Out-Of-Memory)**:当系统完全耗尽内存时,内核会触发OOM killer,选择并终止某些进程以释放内存。了解OOM的工作原理和避免策略对于系统稳定至关重要。 7. **内存泄漏检测**:程序运行过程中...
8. 内存交换(OOM Killer):如果系统内存极度不足,Linux会触发Out-Of-Memory(OOM)机制,选择一些进程进行杀掉,以防止系统崩溃。 9. slab分配器:Linux内核采用slab分配器来管理内核对象的内存,它预分配内存并...
这可能导致在需要大块内存时,即使总空闲内存充足,也会因物理内存不足触发OOM Killer。 - 未释放的内存块不仅阻碍内核回收,也妨碍C库的内存合并,加剧碎片问题。 4. **处理与定制**: - 为防止碎片积累,可以...
- **背景**:当系统内存不足时,OOM Killer会被触发,它会选择并杀死某些进程来释放内存。 - **原理**:通过评估各个进程的重要性以及其对系统的影响程度来决定哪些进程应该被终止。 #### 2. Swap Management - **...
8. **内存压力与OOM Killer**:当系统面临内存压力时,Linux内核会触发Out-of-Memory (OOM) killer,选择并终止一些进程以释放内存,防止系统崩溃。 9. **内存故障恢复**:内核还包含错误检测和处理机制,如对内存...
在Linux系统中,当系统内存不足时,OOM killer会被触发,它会选择并终止某些进程以回收内存,从而防止系统完全崩溃。描述提到的“oom_adj”是Linux内核中的一个参数,用于调整进程的OOM分数。将其设置为-17意味着这...
当进程试图占用的内存超过限制时,访问内存时发生缺页,又没有足够的非活动内存页可以换出时会触发 oom 杀死进程,从而造成可用性问题。 在 memory 子系统中,还有一个 memory.soft_limit_in_bytes,和 memory....
2. **触发时机:** OOMKiller通常在尝试分配内存失败时触发,位于`mm/page_alloc.c`中的`__alloc_pages_may_oom`函数会调用`oom_kill.c`中的`out_of_memory`函数来选择并终止一个进程。而LMK则是在内存紧张时主动...
- **触发时机不同**:OOM通常在内存分配失败时触发,而LowMemoryKiller则是基于周期性的检查,只要检测到空闲内存低于特定阈值就会启动,提供了一种更为前置的内存管理策略。 #### 四、LowMemoryKiller的实现 Low...
`OOM Killer`被触发通常是因为内存不足,需要检查内存使用情况和设置。有时即使CPU占用率不高,网络性能下降可能是因为某些进程消耗了大量网络带宽,这需要使用`strace`等工具深入分析。 - 对于内存消失的情况,...
- **触发时机不同**:OOM 只有在尝试分配内存失败时才会被触发;而 LowMemoryKiller 则会在定期检查时主动评估系统内存状态,并根据阈值决定是否需要释放内存。 ##### 1.3 LowMemoryKiller 的实现 LowMemoryKiller...
2. OOM killer 是被谁触发的。 3. 我的服务器内存去哪儿了。 4. CPU 占用不高但网络性能很差的一个原因。 三、Linux 主机网络问题 Linux 主机网络问题是 ECS 用户最常见的问题之一。该部分总结了一些可能会引起 ...