linux 内存

本文详细探讨了Linux系统中的内存分类,如栈、堆、文件映射、BSS、数据区等,涉及进程OOM处理、内存泄漏检测、OOM策略、内存大页和CPU优化等内容,包括内核管理机制和性能监控工具的使用方法。
摘要由CSDN通过智能技术生成

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也很有用

内存大页

如何开启内存大页:

always , madvise

HP就是透明大页,它是一个2M的连续物理内存。但是,因为这个时候物理内存中已经没有连续2M的内存空间了,所以触发了direct compaction(直接内存规整)

linux CPU观察

top命令cpu参数含义

  • 通过perf可以采集CPU的热点,看看sys利用率高时,哪些内核耗时的CPU利用率高;
  • 通过perf的call-graph功能可以查看具体的调用栈信息,也就是线程是从什么路径上执行下来的;
  • 通过perf的annotate功能可以追踪到线程是在内核函数的哪些语句上比较耗时;
  • 通过ftrace的function-graph功能可以查看这些内核函数的具体耗时,以及在哪个路径上耗时最大。

内核如何管理内存,一条空闲tcp连接要消耗多少

1.将内存条和cpu分组 NUMA

2.一个node分为多个zone

3.每个zone下面都用伙伴系统来管理空闲页面

4.SLAB分配器来管理内核中的对象(cat /proc/slabinfo)

sokcet内存 大约是 socket_alloc, top_sock, dentry, file   3.3kB

time_wait状态是0.4KB

伙伴(buddy)算法及位图_buddy算法 图解-CSDN博客

内部碎片是已经被分配出去的的内存空间大于请求所需的内存空间。 外部碎片是指还没有分配出去,但是由于大小太小而无法分配给申请空间的新进程的内存空间空闲块

https://glemontree.github.io/2017/10/23/[Linux]%20Linux%E4%B8%AD%E7%9A%84%E4%BC%99%E4%BC%B4%E7%B3%BB%E7%BB%9F%E5%92%8Cslab%E6%9C%BA%E5%88%B6/

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值