MySQL OOM 系列一 Linux内存分配攻略
什么是OOM
OOM发生时,系统会杀掉一个或多个进程,来释放内存,让内存使用率回落到一个安全值。这个被杀掉的进程就成为了“OOM Killer”的牺牲品。
OOM为何会发生
OOM通常是由于系统内存不足而引起。当系统内存使用率超过其最大限制时,Linux内核将开始使用OOM Killer来释放内存。这是一种能够强制系统杀掉某些进程来释放内存的机制。
解决OOM问题
查看日志分析
Linux下的OOM Killer最常见的原因就是进程占用了过多的内存,或者多个进程一起占用了过多的内存。
在Linux系统中,有一个系统日志叫做/var/log/messages,在这个日志文件中通常记录着Linux操作系统的各种消息,包括OOM Killer杀掉进程的日志。
我们可以通过查看/var/log/messages文件来了解OOM Killer的情况,根据日志中的提示来寻找原因,进而解决问题。
例如:
kernel: Out of memory: Kill process 12345 (httpd) score 67 or sacrifice child
这个日志意味着进程12345正在占用大量内存(score 67),并需要被释放掉以获得足够的内存。为了实现这一目标,内核将考虑杀死该进程,或其它进程来实现目标。
配置内存超额限制(OOM Adj)或内存保留
OOM Adj允许你在内存获得极限时为你的进程指定杀死优先级,并在需要时将其杀死,而不是将某个虚拟内存页映射到磁盘交换文件。另一个不需要使用硬件资源的方法是使用cgroups来配置内存限制。
OOM保留是一种机制,其中系统管理员设置一个值来告诉内核,在最严重的情况下保留多少内存。这样,内核将为该内存保留空间,并在需要时使用该内存,以避免OOM Killer的情况。
避免内存泄漏
内存泄漏是指一个应用程序中的某些部分始终在分配并返回新内存,但从未释放分配的内存空间。
MySQL查询优化器不稳定的一个流行现象,就是执行计划中选择复杂而耗费资源的查询,而Oracle的查询优化器则更易于为查询找到更快的解决方案。
另一个常见的内存泄漏问题是忘记或使用不当的同步对象。这些对象可以导致程序在内存不断被分配,占据系统中越来越多的内存空间。为解决此类问题,需要仔细检查和修复代码。
结论
OOM问题产生的原因往往是进程内存占用过多,可以通过查看/var/log/messages日志来分析和解决,另外适当的配置内存超额限制也是一种有效的解决OOM问题的方法。同时,避免内存泄漏也是解决OOM问题的重点。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:MySQL OOM 系列一 Linux内存分配 - Python技术站