推荐链接:
总结——》【Java】
总结——》【Mysql】
总结——》【Spring】
总结——》【SpringBoot】
总结——》【MyBatis、MyBatis-Plus】
正常访问数据库
mysql服务被linux系统kill掉
/var/log/messages

最占用内存的进程。
由于系统内存不足,触发 Linux 内核里的 Out of Memory (OOM) killer,OOM killer 会杀掉某个进程以腾出内存留给系统用,不致于让系统立刻崩溃。
Linux 内核根据应用程序的要求分配内存,通常来说应用程序分配了内存但是并没有实际全部使用,为了提高性能,这部分没用的内存可以留作它用,这部分内存是属于每个进程的,内核直接回收利用的话比较麻烦,所以内核采用一种过度分配内存(over-commit memory)的办法来间接利用这部分 “空闲” 的内存,提高整体内存的使用效率。一般来说这样做没有问题,但当大多数应用程序都消耗完自己的内存的时候麻烦就来了,因为这些应用程序的内存需求加起来超出了物理内存(包括 swap)的容量,内核(OOM killer)必须杀掉一些进程才能腾出空间保障系统正常运行。用银行的例子来讲可能更容易懂一些,部分人取钱的时候银行不怕,银行有足够的存款应付,当全国人民(或者绝大多数)都取钱而且每个人都想把自己钱取完的时候银行的麻烦就来了,银行实际上是没有这么多钱给大家取的。
:::info
Q:系统内存不足的原因?
A:
1、本身内存小
2、通常在多应用集中部署在一台机器上,管理不当或应用压力突增
:::
(1)增加系统内存,尽量保证内存充足
(2)在多实例应用部署时,需要注意对内存的分配。
(3)优化进程,使其占用内存降低
(4)使用oom_score_adj参数,这个参数会被计算入oom_score,可以避免进程被杀死(不推荐使用)。
在很多情况下,经常会看到还有剩余内存时,oom-killer依旧把进程杀死了,现象是在/var/log/messages日志文件中有如下信息:
Out of Memory: Killed process [PID] [process name].
OOM(out-of-memory) killer是通过/proc//oom_score这个值来决定哪个进程被干掉的。
这个值是系统综合进程的内存消耗量、CPU时间(utime + stime)、存活时间(uptime - start time)和oom_adj计算出的,消耗内存越多分越高,存活时间越长分越低。
总之,总的策略是:损失最少的工作,释放最大的内存同时不伤及无辜的用了很大内存的进程,并且杀掉的进程数尽量少。
Sep 19 14:58:00 test08 kernel: [ pid ] uid tgid total_vm rss cpu oom_adj oom_score_adj name
Sep 19 14:58:00 test08 kernel: [18871] 0 18871 502855 5227 0 0 0 mc-exe
Sep 19 14:58:00 test08 kernel: [18872] 0 18872 1842475 148013 1 0 0 mc-exe
Sep 19 14:58:00 test08 kernel: [18873] 0 18873 502855 3176 1 0 0 mc-exe
Sep 19 14:58:00 test08 kernel: Out of memory: Kill process 18872 (mc) score 43 or sacrifice child
Sep 19 14:58:00 test08 kernel: Killed process 18872, UID 0, (mc) total-vm:7369900kB, anon-rss:558044kB, file-rss:34008kB
其中,上面列表中total_vm,rss的单位是4K(单个内存页面的大小),18872进程使用了不到600M(anon-rss+file-rss)的内存,
根据每个进程的oom_score选出来了18872,kill掉了,18872进程并没有占用大量内存,也没有其他进程占用超过600M的物理内存,只是整个系统的物理内存(4G)不够用导致了,占用最大的进程被杀死了;
OOM触发的详细分析如下:
Sep 18 09:19:15 test08 kernel: mc invoked oom-killer: gfp_mask=0x280da, order=0, oom_adj=0, oom_score_adj=0
从上面日志看,gfp_mask=0x280da的低2位bit是2,表示此次申请内存是从Normal空间内存块申请内存,
Sep 18 09:19:15 test08 kernel: Node 0 Normal free:8356kB min:8464kB low:10580kB high:12696kB
上面的free表示Normal空间的空闲内存,min、low、high是三个阈值, 当free小于min时,会触发OOM
下面这行日志显示了Normal空间空闲的内存块的详细信息,也可以通过命令cat /proc/buddyinfo查看当前系统得空闲块