首先解释两个概念:
swap:在linux里面,当物理内存不够用了,而又有新的程序请求分配内存,那么linux就会选择将其他程序暂时不用的数据交换到物理磁盘上(swap out),等程序要用的时候再读进来(swap in)。这样做的坏处显而易见,swap in/swap out这里的代价比较大,相比数据一直放在内存里面,多了读磁盘的操作,而磁盘IO代价。。大家都懂的。
OOM:out of memory,指在linux里面,由于系统内存压力,系统会选择保护一些系统进程,而将一些其他的进程kill掉,释放内存。
那么在linux里面怎么可以做到这两点呢?
一、禁止使用swap
1. 可以设置/proc/sys/vm/swappiness=0,不过这就禁用了所有进程使用swap
2. 给进程分配内存的时候,让它使用hugepage内存。设置方法:
1>vi /etc/sysctl.conf ; 添加 vm.nr_hugepages=hugepage_num(多少页大页内存,这个必须大于进程需要的最大内存,比如mysqld buffer pool=5G,那么hugepage_num*page_size>5G) ; sysctl -p 生效。
2>这样可以防止进程使用hugepage的原因:在进程使用hugepage分配内存时,是一次性分配、且独占的,既然一次性已经分配满了那也不存在使用swap的理由,你可以通过top命令看到进程一开始就占用了你所为它设定大小的内存。
3. 可以设置/proc/sys/vm/overcommit_memory=2(其他值代表什么含义,可以自己www.linuxidc.com,另外自己测试中发现这个值如果大于2,那么效果和2一样) 在值为2的情况下,可以分配的内存最大大小在swap size + RAM*((/proc/sys/vm/overcommit_ratio) / 100)),如果大于这个直接返回错误,这个也是类似hugepage分配内存,也是一次性,独占(不能100%肯定),但是利用top命令查看,它显示当前已占用的内存大小不是我们为他设定的那个值。那为什么我认为它也是独占、且一次性分配呢?因为启动其他进程的时候,直接报错:
Error occurred during initialization of VM
Could not reserve enough space for object heap
4. 使用mysql自带的参数–memlock 它将内存锁定,原理同hugepage一样,不过缺陷是必须由root运行mysqld
二、怎么避免进程因为OOM机制被kill掉?
1. 与OOM相关的几个文件是 /proc/<pid>/oom_adj 、 /proc/<pid>/oom_score。前者是一个权值-17至15。设置为0表示永远不被kill,其余情况值越大越容易被kill。后者就是它计算出来的一个值,就是根据这个值来选择哪些进程被kill掉的。
2. 上面放置使用swap中的第三个方法 overcommit参数,因为它分配不出内存就会返回错误,所以永远也不能达到内存被耗尽。OOM也就不会有影响了。
如果有兴趣你也可以自己测试一下,或许还能发现新问题~
Linux下防止进程使用swap及防止OOM机制导致进程被kill掉
转载请注明出处:服务器评测 » Linux下防止进程使用swap及防止OOM机制导致进程被kill掉
相关推荐
- 本周期限时特惠:AMD EPYC 7402 高性能服务器,月付仅89美元 | NetDynamics 强力
- drServer.net 黑色星期五钜惠来袭:尊享专属服务器
- 新加坡&洛杉矶钜惠!AMD EPYC处理器专属服务器,限时特供!
- 【特殊IP服务器】低至$75/月起 | 美国/新加坡机房任选 | TetraHost
- HaBang网络:锐龙服务器极速性能 | 德/荷/法/美/加多地域覆盖 | 支持加密货币等灵活支付
- RackNerd 独服钜惠重磅来袭!SSD、NVMe及海量存储方案齐上线,月付$59轻松拥有!
- drServer.net – 美国高性价比SSD独立服务器 | 快速部署 | 无限流量
- ███ 16C/32T – 64GB RAM – 2x500GB SSD – 10Gbit端口 – 49美元███
服务器评测





