为什么我的Linux内核无法回收它的slab内存?

为什么我的Linux内核无法回收它的slab内存?,第1张

概述我有一个系统遭受了不断增加的内存使用量,直到它达到了交换即使是平凡的东西,因此变得非常反应迟钝.罪魁祸首似乎是内核分配的内存,但我很难弄清楚内核究竟发生了什么. 如何判断哪些内核线程/模块/负责内核内存使用的特定块? 以下是系统内存使用情况随时间变化的图表: 随时间增长的slab_unrecl值对应于/ proc / meminfo中的SUnreclaim字段. 当我在该图表的末尾运行slabto 我有一个系统遭受了不断增加的内存使用量,直到它达到了交换即使是平凡的东西,因此变得非常反应迟钝.罪魁祸首似乎是内核分配的内存,但我很难弄清楚内核究竟发生了什么.

如何判断哪些内核线程/模块/负责内核内存使用的特定块?

以下是系统内存使用情况随时间变化的图表:

随时间增长的slab_unrecl值对应于/ proc / meminfo中的SUnreclaim字段.

当我在该图表的末尾运行slabtop并按缓存大小对其进行排序时,以下是它向我展示的内容:

Active / Total Objects (% used)    : 15451251 / 15530002 (99.5%) Active / Total Slabs (% used)      : 399651 / 399651 (100.0%) Active / Total Caches (% used)     : 85 / 113 (75.2%) Active / Total Size (% used)       : 2394126.21K / 2416458.60K (99.1%) Minimum / Average / Maximum Object : 0.01K / 0.16K / 18.62K  OBJs ACTIVE  USE OBJ SIZE  SLABS OBJ/SLAB CACHE SIZE name                   3646503 3646503 100%    0.38K 173643       21   1389144K kmem_cache3852288 3851906  99%    0.06K  60192       64    240768K kmalloc-643646656 3646656 100%    0.06K  56979       64    227916K kmem_cache_node1441760 1441675  99%    0.12K  45055       32    180220K kmalloc-128499136 494535  99%    0.25K  15598       32    124784K kmalloc-2561066842 1066632  99%    0.09K  25401       42    101604K kmalloc-96101430 101192  99%    0.19K   4830       21     19320K kmalloc-192 19168  17621  91%    1.00K    599       32     19168K kmalloc-1024  8386   7470  89%    2.00K    525       16     16800K kmalloc-2048 15000   9815  65%    1.05K    500       30     16000K ext4_inode_cache 66024  45955  69%    0.19K   3144       21     12576K dentry369536 369536 100%    0.03K   2887      128     11548K kmalloc-32 18441  16586  89%    0.58K    683       27     10928K inode_cache 44331  42665  96%    0.19K   2111       21      8444K cred_jar 12208   7529  61%    0.57K    436       28      6976K radix_tree_node   627    580  92%    9.12K    209        3      6688K task_struct  6720   6328  94%    0.65K    280       24      4480K proc_inode_cache 36006  36006 100%    0.12K   1059       34      4236K kernfs_node_cache266752 266752 100%    0.02K   1042      256      4168K kmalloc-16134640 133960  99%    0.02K    792      170      3168K fsnotify_mark_connector  1568   1461  93%    2.00K     98       16      3136K mm_struct  1245   1165  93%    2.06K     83       15      2656K sighand_cache

结论:

>内核的slab分配器使用大约2.3 GB的RAM
>几乎所有这些都是不可恢复的
> kmem_cache缓存占用约1.3 GB
>另一个0.5 GB属于各种大小的kmalloc缓存

这是我撞墙的地方.我还没弄明白如何查看这些缓存,看看为什么它们变得如此之大(或者为什么它们的内存无法恢复).我怎样才能进一步调查?

解决方法 perf kmem record –slab将捕获分析数据和perf kmem stat –slab – caller将按内核符号小计.

但这并不能解释为什么你的工作量会这样做.添加perf记录并查看报告以查看调用内核的内容.

kprobes可以跟踪特定的内核堆栈,从而导致一种分配.我自己并不是很熟悉,但请尝试阅读examples accompanying eBPF scripts like slabratetop.

也可以在主机上稍微改变一下.添加RAM以确保您没有调整大小.尝试更新的内核版本或不同的发行版.

总结

以上是内存溢出为你收集整理的为什么我的Linux内核无法回收它的slab内存?全部内容,希望文章能够帮你解决为什么我的Linux内核无法回收它的slab内存?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/1034442.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存