Linux下防止进程使用swap及防止OOM机制导致进程被kill掉

本文介绍如何在Linux系统中管理内存,包括禁用swap空间的方法及其替代方案,如使用hugepage内存和调整overcommit_memory参数。此外,还介绍了如何避免进程因OOM机制被系统终止。
首先解释两个概念:
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(实际上设置为0并不能完全禁止使用swap,而是只能尽量减少使用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(其他值代表什么含义,可以自己google,另外自己测试中发现这个值如果大于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。前者是一个权值-16至15,默认是0,设置为-17表示永远不被kill,其余情况值越大越容易被kill。后者就是它计算出来的一个值,就是根据这个值来选择哪些进程被kill掉的。
2.  上面放置使用swap中的第三个方法 overcommit参数,因为它分配不出内存就会返回错误,所以永远也不能达到内存被耗尽。OOM也就不会有影响了。

如果有兴趣你也可以自己测试一下,或许还能发现新问题~
<think> 首先,用户的问题是:“我想查找在Linux系统中排查进程被杀原因的方法 请问Linux系统排查进程被杀原因的方法”。这是在询问如何排查Linux系统中进程被终止的原因。 从系统级指令中,我有一些引用:[^1] 是关于查询和杀进程的基本方法,[^2] 和 [^3] 是关于Java进程Linux的原因分析,特别是涉及到内存不足和被OOM Killer杀的情况。 用户上一次的问题和我的回答:在这个对话中,用户之前的问题是关于“Linux系统查询进程,杀进程”,但现在的问题转向了如何排查进程被杀的原因。所以,我需要基于这些引用构建一个结构化的回答。 关键点: - 进程被杀的原因可能包括:手动终止、系统信号(如SIGKILL)、OOM Killer(Out-of-Memory Killer)等。 - 从引用[^2]和[^3],OOM Killer是常见原因,当系统内存不足时,它会杀高内存使用进程。 - 引用[^1]提供了查询和杀进程的方法,这可能有助于排查。 我的回答需要: - 使用中文。 - 结构清晰,逐步解决问题。 - 尽量真实可靠,基于提供的引用。 - 在引用段落末尾自然地添加引用标识。 - 生成相关问题。 - 对于数学表达式,使用指定格式(但在这个主题中,可能不涉及数学,除非有公式)。 结构回答: 1. **引言**:简要介绍进程被杀的可能原因。 2. **步骤**:提供排查方法。 - 检查系统日志。 - 检查OOM Killer事件。 - 分析进程状态。 - 使用命令如dmesg、journalctl等。 3. **引用支持**:自然地融入引用。 4. **总结**。 5. **生成相关问题**:在末尾添加。 步骤细化: - **检查系统日志**:使用dmesg或/var/log/messages查看OOM Killer日志。 - **检查OOM Killer**:如果进程OOM Killer杀,会有记录。 - **分析进程内存使用**:使用top、htop或查看/proc文件系统。 - **其他原因**:如手动kill、系统崩溃等。 基于引用: - 引用[^2]:讨论OOM Killer如何杀高内存进程。 - 引用[^3]:提供实例和内存使用分析。 - 引用[^1]:提供基础命令如查询进程。 生成相关问题:围绕进程排查、预防OOM Killer等。 完整回答框架: - 开头:解释常见原因。 - 方法1:检查日志。 - 方法2:识别OOM Killer。 - 方法3:其他排查工具。 - 结尾:总结。 - §§相关问题§§:列表几个问题。 确保语言自然,帮助用户逐步解决。 </think> ### Linux系统排查进程被杀原因的方法 在Linux系统中,进程被意外杀是常见问题,主要原因可能包括手动终止、系统信号(如SIGKILL)、内存不足触发OOM Killer(Out-of-Memory Killer)等[^1]。排查过程需要系统性地分析日志、进程状态和资源使用情况。以下是结构化的排查方法,基于实际系统命令和日志分析,帮助您逐步定位原因。所有命令均需在终端执行(需root或sudo权限)。 #### 步骤1: 检查系统日志确认事件细节 系统日志记录了进程被杀的详细信息,特别是OOM Killer事件。使用以下命令: - **查看内核日志**:运行`dmesg -T | grep -i "killed process"` 或 `dmesg -T | grep -i "oom"`。这会显示被杀进程的PID、内存使用量等关键信息[^2][^3]。例如: ```bash dmesg -T | grep -i "killed process" ``` 输出可能类似:`[Tue Jun 1 10:00:00 2023] Out of memory: Killed process 12345 (java) total-vm:8000000kB, anon-rss:3500000kB, file-rss:500000kB`,其中`total-vm`表示总内存,`anon-rss`是实际物理内存使用[^3]。 - **检查系统日志文件**:查看`/var/log/messages`或`/var/log/syslog`(根据发行版不同)。使用`journalctl`(systemd系统): ```bash journalctl --since "1 hour ago" | grep -i "killed" ``` 这能帮助定位时间点,确认是否因内存不足触发事件[^2]。 此步骤优先,因为日志直接记录事件原因。如果日志中有OOM Killer记录,则进程很可能因内存不足被杀[^2][^3]。 #### 步骤2: 分析进程内存使用OOM Killer行为 如果日志指示OOM Killer是原因,需检查进程内存使用情况: - **查询进程内存状态**:使用`top`、`htop`或`ps`命令。例如: ```bash ps -eo pid,comm,%mem,%cpu,rss --sort=-%mem | head -n 10 ``` 这会列出内存占用最高的进程(`%mem`是内存百分比,`rss`是物理内存大小)。对比日志中的内存数据,确认进程是否异常消耗内存[^3]。 - **检查OOM Killer评分**:OOM Killer基于评分(oom_score)决定杀哪个进程。查看进程的评分: ```bash cat /proc/<PID>/oom_score ``` 其中`<PID>`是进程ID。评分越高(通常>100),越容易被杀[^2]。优化内存使用或调整OOM Killer优先级可预防问题。 - **验证系统内存状态**:运行`free -h`或`vmstat 1`监控实时内存。如果`free`值接近0或`swap`使用率高,表明系统内存不足[^2]。 #### 步骤3: 排除其他原因并辅助工具排查 如果不是OOM Killer,检查其他可能: - **手动终止或信号**:使用`auditd`审计工具检查kill命令记录: ```bash ausearch -k -m KILL ``` 这会显示谁执行了`kill`操作。 - **系统稳定性问题**:检查系统崩溃日志(如`/var/crash/`)或运行`dmesg | grep -i "panic"`排除内核崩溃影响。 - **使用高级工具**: - `perf`:分析进程行为,`perf record -p <PID>`捕获性能数据。 - `strace`:跟踪进程系统调用,`strace -p <PID>`查看信号接收情况。 #### 总结 排查核心是日志分析(步骤1)和内存监控(步骤2)。多数案例中,进程被杀源于内存不足和OOM Killer[^2][^3]。确保进程内存优化(如Java应用设置`-Xmx`限制堆大小),并监控系统资源。如果问题复杂,提供更多上下文(如进程类型、系统负载)可进一步诊断。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值