Linux oom MySQL被杀

本文探讨了Linux系统中MySQL因内存不足被系统杀死的问题,分析了系统日志,提出了调整MySQL的oom_score_adj参数以避免被OOM killer选中杀掉的方法,并尝试了减少php-fpm子进程数量作为解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

linux系统,2G内存,MySQL经常被杀,

查看系统日志:

less /var/log/messages

以下是部分日志内容:

Apr  7 10:24:45 localhost kernel: Out of memory: Kill process 53320 (mysqld) score 93 or sacrifice child
Apr  7 10:24:45 localhost kernel: Killed process 53320 (mysqld) total-vm:1445004kB, anon-rss:16532kB, file-rss:0kB, shmem-rss:0kB
Apr  7 10:24:52 localhost kernel: mysqld invoked oom-killer: gfp_mask=0x201da, order=0, oom_score_adj=0
Apr  7 10:24:52 localhost kernel: mysqld cpuset=/ mems_allowed=0
Apr  7 10:24:52 localhost kernel: CPU: 1 PID: 57992 Comm: mysqld Kdump: loaded Not tainted 3.10.0-957.21.3.el7.x86_64 #1
Apr  7 10:24:52 localhost kernel: Hardware name: Red Hat KVM, BIOS 0.5.1 01/01/2011
Apr  7 10:24:52 localhost kernel: Call Trace:
Apr  7 10:24:52 localhost kernel: [<ffffffffa4b63107>] dump_stack+0x19/0x1b
Apr  7 10:24:52 localhost kernel: [<ffffffffa4b5db2a>] dump_header+0x90/0x229
Apr  7 10:24:52 localhost kernel: [<ffffffffa4501292>] ? ktime_get_ts64+0x52/0xf0
Apr  7 10:24:52 localhost kernel: [<ffffffffa45584df>] ? delayacct_end+0x8f/0xb0
Apr  7 10:24:52 localhost kernel: [<ffffffffa45ba834>] oom_kill_process+0x254/0x3d0
Apr  7 10:24:52 localhost kernel: [<ffffffffa45ba2dd>] ? oom_unkillable_task+0xcd/0x120
Apr  7 10:24:52 localhost kernel: [<ffffffffa45ba386>] ? find_lock_task_mm+0x56/0xc0
Apr  7 10:24:52 localhost kernel: [<ffffffffa45bb076>] out_of_memory+0x4b6/0x4f0
Apr  7 10:24:52 localhost kernel: [<ffffffffa4b5e62e>] __alloc_pages_slowpath+0x5d6/0x724
Apr  7 10:24:52 localhost kernel: [<ffffffffa45c1454>] __alloc_pages_nodemask+0x404/0x420
Apr  7 10:24:52 localhost kernel: [<ffffffffa460e308>] alloc_pages_current+0x98/0x110
Apr  7 10:24:52 localhost kernel: [<ffffffffa45b6697>] __page_cache_alloc+0x97/0xb0
Apr  7 10:24:52 localhost kernel: [<ffffffffa45b92f8>] filemap_fault+0x298/0x490
Apr  7 10:24:52 localhost kernel: [<ffffffffc03ce186>] ext4_filemap_fault+0x36/0x50 [ext4]
Apr  7 10:24:52 localhost kernel: [<ffffffffa45e47ea>] __do_fault.isra.59+0x8a/0x100
Apr  7 10:24:52 localhost kernel: [<ffffffffa45e4d9c>] do_read_fault.isra.61+0x4c/0x1b0
Apr  7 10:24:52 localhost kernel: [<ffffffffa45e9744>] handle_pte_fault+0x2f4/0xd10
Apr  7 10:24:52 localhost kernel: [<ffffffffa45ec27d>] handle_mm_fault+0x39d/0x9b0
Apr  7 10:24:52 localhost kernel: [<ffffffffa4b70603>] __do_page_fault+0x203/0x4f0
Apr  7 10:24:52 localhost kernel: [<ffffffffa4b709d6>] trace_do_page_fault+0x56/0x150
Apr  7 10:24:52 localhost kernel: [<ffffffffa4b6ff62>] do_async_page_fault+0x22/0xf0
Apr  7 10:24:52 localhost kernel: [<ffffffffa4b6c798>] async_page_fault+0x28/0x30

调整mysql 的oom_score值。

我们可以在用户空间通过操作每个进程的 oom_adj 内核参数来决定哪些进程不这么容易被 OOM killer 选中杀掉。比如,如果不想 MySQL 进程被轻易杀掉的话可以找到 MySQL 运行的进程号后,调整 oom_score_adj 为 -15(注意 points 越小越不容易被杀)

查看当前mysql 的oom_score值:

cat /proc/$(pidof mysqld)/oom_score

当前配置mysql的值:

cat /proc/$(pidof mysqld)/oom_score_adj

修改配置:

echo '-20' > /proc/$(pidof mysqld)/oom_score_adj

 

先观察观察运行情况吧,不知道是否有用。

参考:https://www.cnblogs.com/luckyall/p/11946943.html

http://blog.chinaunix.net/uid-25206403-id-3549190.html

 

更新:2020.4.8好像不是这个的问题,MySQL再次停止了。

试试减少php-fpm子进程数量,将max_children的值由50改为25。

 

参考:【解决Linux下php-fpm进程过多导致内存耗尽问题】https://www.jb51.net/article/129528.htm

 

 

<think>好的,用户的问题是Linux服务器因为内存不足导致MySQL服务被关闭,需要解决方案。首先,我得回忆一下常见的内存不足问题可能有哪些原因。可能的情况包括MySQL配置不当占用过多内存、服务器上其他进程消耗内存过多,或者系统没有正确配置交换空间。 首先,我应该考虑检查MySQL的内存使用配置。MySQL有几个关键参数,比如innodb_buffer_pool_size,这个参数设置得过高会占用大量内存。用户可能没有根据服务器的实际内存来调整这个值,导致内存耗尽。另外,像max_connections这样的参数如果设置过高,每个连接都会占用一定内存,大量连接也会导致内存不足。 接下来,系统层面的内存管理也很重要。比如是否启用了交换空间(swap),交换空间可以在物理内存不足时提供虚拟内存,防止OOM Killer终止进程。如果用户的服务器没有配置足够的交换空间,可能在内存紧张时直接触发OOM KillerMySQL进程。这时候建议增加交换空间,或者调整swappiness参数,让系统更倾向于使用交换空间而不是直接进程。 另外,需要查看服务器上是否有其他进程消耗大量内存。使用top或htop命令可以查看内存使用情况,找出是否有异常进程。如果有其他服务占用了太多内存,可能需要优化这些服务或者迁移到其他服务器,以释放资源给MySQL。 还有,OOM Killer的机制是当系统内存严重不足时,根据进程的oom_score来决定终止哪个进程。MySQLoom_score可能较高,所以需要调整OOM优先级,降低MySQL被终止的概率。这可以通过修改/proc文件系统中的oom_score_adj值来实现。 此外,监控和警报也很重要。设置内存使用监控,比如使用Prometheus、Nagios等工具,可以在内存接近阈值时提前报警,让管理员有机会处理问题,避免服务被终止。 最后,如果问题依然存在,可能需要考虑升级服务器硬件,增加物理内存,或者对数据库进行分片、优化查询语句、减少锁竞争等,从应用层面降低内存使用。 现在需要把这些思路整理成步骤,并且结合用户提供的引用内容。用户提供的引用[2]提到了定时数据库备份,引用[3]提到了资源管理的问题,可能与Hadoop相关,但当前问题主要是MySQL和内存,所以可能引用[2]中的备份策略可以作为一个补充建议,确保数据安全,避免因OOM导致的数据丢失。引用[1]提到使用SQL数据库如MySQL,所以正确配置MySQL的内存参数是关键。 需要确保建议中的每个步骤都清晰,比如具体如何调整MySQL配置,如何配置交换空间,如何监控内存,以及如何调整OOM设置。同时,要使用中文回答,符合格式要求,行内公式用$...$,独立公式用$$...$$,但这个问题可能涉及较少的数学公式,不过如果有内存计算的例子,可能需要用LaTeX表达。例如,计算innodb_buffer_pool_size的值,可以给出一个公式:通常设置为物理内存的60%-70%,即如果物理内存是8GB,则设置为$0.6 \times 8 = 4.8$ GB。 还需要生成相关问题,比如如何监控内存使用,如何优化MySQL配置,或者OOM Killer的工作原理等。 检查是否有遗漏的要点,比如日志分析,查看/var/log/messages或dmesg日志确认OOM事件,或者使用工具如vmstat、free -m来检查内存使用情况。这些细节都应该包含在解决方案中。 最后,确保回答结构清晰,分步骤说明,每个步骤有具体的命令或配置示例,帮助用户逐步解决问题,并引用相关的引用内容。例如,在备份部分引用[2],在资源管理部分引用[3]可能不太相关,但引用[1]提到使用MySQL,所以在配置MySQL参数时可以提到引用[1]中的数据库设计考虑。</think>### 解决Linux服务器内存不足导致MySQL被关闭的方法 #### 1. **优化MySQL内存配置** MySQL的默认配置可能占用过多内存。需调整以下参数(通常在`/etc/my.cnf`或`/etc/mysql/my.cnf`): - **`innodb_buffer_pool_size`**:设置为物理内存的**60%-70%**。例如,8GB内存可设为: $$ \text{innodb_buffer_pool_size} = 0.7 \times 8\text{GB} = 5.6\text{GB} $$ - **`max_connections`**:减少最大连接数(默认151),如设为100,并配合`thread_cache_size`优化。 - **`query_cache_size`**:若查询缓存未频繁使用,可设为`0`以释放内存[^1]。 ```bash # 示例配置片段 [mysqld] innodb_buffer_pool_size = 5G max_connections = 100 query_cache_size = 0 ``` --- #### 2. **配置交换空间(Swap)** - **检查现有Swap**: ```bash free -h ``` - **新增Swap文件**(例如4GB): ```bash sudo fallocate -l 4G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab ``` - **调整`swappiness`**(建议值10-60): ```bash echo 'vm.swappiness=30' | sudo tee -a /etc/sysctl.conf sudo sysctl -p ``` --- #### 3. **监控内存使用** - **实时查看内存**: ```bash top # 按内存排序按`Shift + M` htop # 更友好的交互式工具 ``` - **分析OOM日志**: ```bash dmesg | grep -i "oom" grep -i "oom" /var/log/messages ``` --- #### 4. **调整OOM Killer优先级** 降低MySQL进程被终止的概率: ```bash # 获取MySQL进程ID pgrep mysqld # 手动调整优先级(值越小越不易被终止) echo -1000 | sudo tee /proc/[PID]/oom_score_adj ``` 永久生效需在启动脚本中添加调整命令。 --- #### 5. **限制其他进程资源** - **使用`cgroups`限制非关键进程的内存**: ```bash # 示例:限制备份进程最多使用1GB内存 systemd-run --scope -p MemoryLimit=1G tar -zcf /backup/mysql.tar.gz /var/lib/mysql ``` --- #### 6. **定期维护与备份** - 结合**定时任务清理日志和临时文件**(引用[^2]): ```bash # 每日清理MySQL旧日志 0 3 * * * find /var/log/mysql -type f -mtime +7 -exec rm {} \; ``` - 使用`mysqldump`或`xtrabackup`定期备份,避免数据丢失。 --- #### 7. **升级硬件或架构** - 若问题持续,考虑: - 增加物理内存。 - 将数据库与高内存消耗服务分离部署(引用[^3]中提到Hadoop资源管理思路)。 - 使用读写分离或分库分表降低单节点压力。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值