Linux有一个特性:OOM Killer,一个保护机制,用于避免在内存不足的时候不至于出现严重问题,把一些无关的进程优先杀掉,即在内存严重不足时,系统为了继续运转,内核会挑选一个进程,将其杀掉,以释放内存,缓解内存不足情况,不过这种保护是有限的,不能完全的保护进程的运行。
在很多情况下,经常会看到还有剩余内存时,oom-killer依旧把进程杀死了,现象是在/var/log/messages日志文件中有如下信息:
Out of Memory: Killed process [PID] [process name].
该问题是low memory耗尽,因为内核使用low memory来跟踪所有的内存分配。
当low memory耗尽,不管high memory剩多少,oom-killer都会杀死进程,以保持系统的正常运行。
在32位CPU下寻址范围是有限的,Linux内核定义了下面三个区域:
# DMA: 0x00000000 - 0x00999999 (0 - 16 MB)
# LowMem: 0x01000000 - 0x037999999 (16 - 896 MB) - size: 880MB
# HighMem: 0x038000000 - <硬件特定>
LowMem区(也叫NORMAL ZONE)共880MB,并且是固定不能变的(除非使用hugemem内核),对于高负荷的系统,可能因为LowMem使用不好而触发了OOM Killer机制。因为内存分配是一个连续的区域,在此时,如果LowMem里存在很多碎片或者LowFree太少,此时无法分配到一块连续的内存区域,就触发了OOM Killer。
查看当前LowFree值:
cat /proc/meminfo | grep LowFree
查看LowMem内存碎片:
cat /proc/buddyinfo
上面这命令需要在2.6内核才有效。
有如下方法可以解决该问题:
1、升级到64位系统,这是最好的方法,因为此时所有的内存都属low memory,如此时提示out of memory,则真的是low memory耗尽,真的OOM了。
2、如必须使用32位系统,那么可以使用hugemem内核,此时内核会以不同的方式分割low/high memory,而大多数情况下会提供足够多的low memory至high memory的映射,此时很简单的一个修复方法是可以安装hugemem内核包,然后重启。
3、如果hugemem内核也用不了,那么我们可以尝试将/proc/sys/vm/lower_zone_protection的值设为250或更大,可使用如下命令查看和设置该值:
cat /proc/sys/vm/lower_zone_protection
echo 250 > /proc/sys/vm/lower_zone_protection
或者可以修改/etc/sysctl.conf文件,以便重启后生效,添加的内容如下:
vm.lower_zone_protection = 250
4、实在没办法,那么我们把oom-killer关掉,不过该选项可能导致系统挂起,故要看实际情况使用。
查看当前的oom-killer的状态:cat /proc/sys/vm/oom-kill
关闭/打开oom-killer:
echo "0" > /proc/sys/vm/oom-kill
echo "1" > /proc/sys/vm/oom-kill
或者直接加到/etc/sysctl.conf文件,内容如下:
vm.oom-kill = 0
此时,当进程被oom-killer尝试杀死而没有成功时,会把相关信息记录到/var/log/messages文件中,信息如下:
"Would have oom-killed but /proc/sys/vm/oom-kill is disabled"
5、或者不把oom-killer关掉,只针对单一进程处理,把某个进程保护起来,此时,我们可以使用如下命令:
echo -17 > /proc/[pid]/oom_adj
/proc/[pid]/oom_adj中oom_adj的取值范围是-17~15,当该值为-17时,系统将不会杀死指定pid的进程,而-16~15则会使得进程的/proc/[pid]/oom_adj值呈指数(K*2^n)形式递增,即它们被杀掉的可能性呈指数递增。针对init(进程号为1)这个进程,无论该值设为多少都不会被杀。
以上是从网络上查到,结合自己的问题进行下补充:
一开始由于系统配置是2G,而且没有交换分区,所以每天导致out of memory,后来增加了物理内存,并做了交换分区,情况有所改善,但是运行2-3天后还是会出现out of memory的情况,后来分析日志文件messages发现粗体部分,分析是low memory不足导致,后来自己试验用sync ;echo 3 >> /proc/sys/vm/drop_caches可以将内存释放出来,查看/proc/buddyinfo内存释放出来。
Jun 10 13:33:11 xx user.warn kernel: DMA free:3548kB min:68kB low:84kB high:100kB active:0kB inactive:0kB present:16384kB pages_scanned:0 all_unreclaimable? yes
Jun 10 13:33:11 xx user.warn kernel: lowmem_reserve[]: 0 0 880 4080
Jun 10 13:33:11 xx user.warn kernel: DMA32 free:0kB min:0kB low:0kB high:0kB active:0kB inactive:0kB present:0kB pages_scanned:0 all_unreclaimable? no
Jun 10 13:33:11 xx user.warn kernel: lowmem_reserve[]: 0 0 880 4080
Jun 10 13:33:11 xx user.warn kernel: Normal free:1340kB min:3756kB low:4692kB high:5632kB active:0kB inactive:28kB present:901120kB pages_scanned:2456536 all_unreclaimable? yes
Jun 10 13:33:11 xx user.warn kernel: lowmem_reserve[]: 0 0 0 25600
Jun 10 13:33:11 xx user.warn kernel: HighMem free:1615600kB min:512kB low:3928kB high:7344kB active:274112kB inactive:24928kB present:3276800kB pages_scanned:0 all_unreclaimable? no
Jun 10 13:33:11 xx user.warn kernel: lowmem_reserve[]: 0 0 0 0
Jun 10 13:33:11 xx user.warn kernel: DMA: 1*4kB 1*8kB 1*16kB 0*32kB 1*64kB 1*128kB 1*256kB 0*512kB 1*1024kB 1*2048kB 0*4096kB = 3548kB
Jun 10 13:33:11 xx user.warn kernel: DMA32: empty
Jun 10 13:33:11 xx user.warn kernel: Normal: 1*4kB 1*8kB 1*16kB 1*32kB 0*64kB 0*128kB 1*256kB 0*512kB 1*1024kB 0*2048kB 0*4096kB = 1340kB
Jun 10 13:33:11 CHINASOFT user.warn kernel: HighMem: 8192*4kB 7506*8kB 5166*16kB 2932*32kB 1528*64kB 688*128kB 253*256kB 86*512kB 67*1024kB 12*2048kB 234*4096kB = 1615600kB
相关推荐
标题与描述中的关键词“Tomcat Out of Memory Solution”指向了在运行Tomcat服务器时遇到内存溢出错误(Out of Memory Error)的解决方法。在IT领域,尤其是Java应用服务器环境中,Tomcat作为一款广泛使用的开源轻量...
MySQL数据库在运行过程中遇到“mysqld-nt: Out of memory (Needed 1677720 bytes)”错误,通常表示服务器在处理查询时内存不足。这个问题可能由多种因素引起,包括不当的配置参数、内存限制以及系统架构。以下是一些...
今天在执行npm run build 的时候突然出现下面图片所示错误 这个错误的意思时内存溢出,为什么会内存溢出呢? 原来 nodejs 默认限制了最大可使用的内存大小。...// mac/linux export NODE_OPTIONS=
NBMiner_42.2发布,解锁LHR版本显卡百分百算力。 ETH、ETC 5月25日更新42.2版本 提升稳定性,更新支持所有GPU。 5月11日更新41.3版本: 提高LHR解锁器的稳定性。...旧版驱动和内核会导致6G显卡显存不足out of memory
虚拟内存管理还包括内存泄漏检测、oom killer(Out-Of-Memory杀手)等功能。内存泄漏检测可以帮助开发者找出程序中未释放的内存,防止系统资源耗尽。oom killer在系统面临内存耗尽时,会选择杀死一些低优先级的进程...
8. OOM(Out-Of-Memory)杀手:当系统内存耗尽时,Linux会启动OOM killer,选择杀死一些进程以释放内存。选择哪个进程被杀取决于其内存使用情况和优先级。 9. 内存管理工具:`free`命令显示当前系统的内存使用情况...
6. **内存换出策略**:Linux的OOM(Out-of-Memory)杀手是一种防止系统崩溃的机制,当内存耗尽时,它会选择并终止一些进程以释放内存。此外,LRU(最近最少使用)算法用于决定哪些页应该被换出。 7. **缓存和预读取...
MySQL中的"Sort aborted: Out of sort memory, consider increasing server sort buffer size"错误通常发生在数据库执行涉及排序操作的查询时,如ORDER BY或GROUP BY语句。这个错误表明MySQL在执行查询过程中分配的...
在配置GRUB2时,可能需要了解一些常见的配置命令,例如设置启动时的菜单显示时间(`GRUB_TIMEOUT`)、更改默认启动项(`GRUB_DEFAULT`)、设置启动命令行(`GRUB_CMDLINE_LINUX`)等。此外,GRUB2支持通过在启动时按...
参赛者需利用提供的Linux内核日志和内存错误日志,预测服务器在未来7天内是否可能出现内存故障,以及故障的具体发生时间。 **特征工程**是整个解决方案的关键环节。由于日志数据主要由分类属性构成,这给特征提取...
OOM(Out Of Memory)导致的panic:当系统内存资源耗尽,内核无法找到可杀进程时,会触发“Kernel panic - not syncing: Out of memory and no killable processes...”。这类问题通常与内存管理有关,可能涉及某些...
"memory test"是一个针对Linux环境的工具,主要用于测试系统中运行的程序对CPU和内存资源的利用情况。本文将深入探讨Linux内存测试的重要性和方法,以及如何使用`MemTest-shangchuan.sh`这个脚本来进行测试。 首先...
OOM(Out of Memory)是Linux内存管理中的一种机制,用于描述内存不足的情况。KSM(Kernel Samepage Merging)是Linux内存管理中的一种机制,用于描述内存的共享机制。巨型页是Linux内存管理中的一种机制,用于描述...
GNU/Linux Application Programming takes a holistic approach to teaching developers the ins-and-outs of GNU/Linux programming using APIs, tools, communication, and scripting. Covering a variety of ...
You'll learn what conditions bring out Linux's best performance, and how it meets the challenge of providing good system response during process scheduling, file access, and memory management in a ...
标准Linux内核使用的是OOM(Out of Memory)策略,而Android则采用了更适应移动设备的内存管理机制,以防止在资源有限的环境中出现内存耗尽的情况。 通过对Android内核与标准Linux内核的深入比较,我们可以看到...
它还包括内存换页策略,如OOM(Out of Memory)杀手,防止系统因内存耗尽而崩溃。 3. **文件系统**:Linux支持多种文件系统,如EXT4、XFS、Btrfs等。文件系统管理磁盘上的数据结构,实现文件的创建、读写和删除操作...
- **启用并分析垃圾收集日志**:通过 `-verbose:gc` 参数启用垃圾收集日志,帮助诊断内存使用情况。 #### 六、总结 针对 Tomcat 出现 `java.lang.OutOfMemoryError: PermGen space` 和 `java.lang....
Chapter 2, "A Peek Inside the Kernel," takes a brisk peek into the innards of the Linux kernel and teaches you some must-know kernel concepts. It first takes you through the boot process and then ...