linux内存分类
按用途分
stack heap(brk,sbrk , mmap), 文件映射, bss, data , text, 还有page cache, slab(kmalloc连续), vmalloc等内核深处的。
属性
进程OOM
对于进程来说,堆泄漏在死亡时是没问题
但是对于不断获得内存,导致系统内存不足时会触发oom killer。
系统内存不足时会唤醒OOM killer来选择一个进程给杀掉,在我们这个例子中它杀掉了这个正在内存泄漏的程序,该进程被杀掉后,整个系统也就变得安全了。但是你要注意,OOM killer选择进程是有策略的,它未必一定会杀掉正在内存泄漏的进程,很有可能是一个无辜的进程被杀掉
缺点:而OOM这里又有一个全局锁(oom_lock)来进行保护
如果此时系统中有很多进程都在申请内存,那么这些申请内存的进程都会被阻塞在这里,这就形成了一个恶性循环,甚至会引发系统长时间无响应(假死)
一个例子就是oom日志打印太多,有两个解决方法:1. 在发生OOM时尽可能少地打印信息 2.调整串口打印级别,不将OOM信息打印到串口-
很重要的系统服务的oom_score_adj配置为-1000,比如sshd。but 它又不能被杀掉,这就会导致随着它的内存开销变大,OOM killer不停地被唤醒,从而把其他进程一个个给杀掉,我们之前在生产环境中就遇到过类似的案例
访问过程,可以想想hard_design.
观察内存方法
首先是top
然后是cat /proc/meminfo
这两个是最开始排查的用的
一个例外
内核泄漏
可以通过meminfo几个信息看出
- 在生产环境中可以使用tracepoint或者kprobe,来追踪特定类型内核内存的申请和释放,从而帮助我们判断是否存在内存泄漏。但这往往需要专业的知识,你在不明白的时候可以去请教一些内核专家;
- 内核内存泄漏通常都是第三方驱动或者自己写的一些内核模块导致的,在出现内核内存泄漏时,你可以优先去排查它们。
- top工具和/proc/meminfo文件是分析Linux上内存泄漏问题,甚至是所有内存问题的第一步,我们先找出来哪个进程或者哪一项有异常,然后再针对性地分析;
- 应用程序的内存泄漏千奇百怪,所以你需要掌握一些通用的分析技巧,掌握了这些技巧很多时候就可以以不变应万变。但是,这些技巧的掌握,是建立在你的基础知识足够扎实的基础上。你需要熟练掌握我们这个系列课程讲述的这些基础知识,熟才能生巧。
- 一般是系统调用才能造成内存泄漏,strace, pidstat也很有用