异常问题:
Hadoop集群计算节点服务器内存短时间内持续增长,使用量超过90%。
关键结论:
系统 Slab 占用高达 416 GB,其中:
-
超过 98% 都来自
kmalloc-4096
; -
这是 内核层内存泄漏;
-
和应用进程无关,和 ps 看不到这些内存的 RSS 是一致的。
排查过程:
1、查看所有占用内存的进程,并输出到文件进行排查。
ps aux --sort=-%mem > mem_usage.txt
过滤所有application的进程数量,kworker (kernel worker)进程数量达到1744,相比正常服务器超出了1000+:
[root@hdp138-time-pro ~]# grep "application" mem_usage.txt | wc -l
345
[root@hdp138-time-pro ~]# grep "worker" mem_usage.txt | wc -l
1744
[root@hdp138-time-pro ~]# wc -l mem_usage.txt
2771 mem_usage.txt
2、查看服务器真实使用的内存情况:
[root@hdp138-time-pro ~]# ps -eo rss | awk 'NR>1 {sum+=$1} END {printf "Total RSS: %.2f GB\n", sum/1024/1024}'
Total RSS: 515.09 GB
[root@hdp138-time-pro ~]# free -h
total used free shared buff/cache available Mem
1.0T 952G 3.1G 1.9G 51G 49G Swap: 31G 31G 12K
所有应用进程总内存 515.09GB,但是系统显示使用952GB,多出了400+GB。
3、查看内核、缓存等占用:cat /proc/meminfo
项目 | 数值 (GB) | 说明 |
MemTotal | 1007.55 GB | 物理总内存 |
MemFree | 2.24 GB | 完全未分配的内存(非常少) |
MemAvailable | 46.96 GB | 可以立即用于新程序的内存 |
Cached | 41.70 GB | 页面缓存(可回收) |
SwapUsed | 31.99 GB | Swap 已全部用满(压力大) |
Slab | 416.64 GB | 内核 slab 内存:占用巨大 |
AnonPages | 514.91 GB | 应用程序匿名内存(进程堆/栈等) |
4、查看具体哪个 slab 类型占了这么多
cat /proc/slabinfo | sort -k3 -nr | head -20
kmalloc-4096 占用最严重(约 4096 字节 × 1.07 亿条)
kmalloc-4096 106996631 106996691 4096
-
单位大小:4KB
-
活跃对象数:约 1.07 亿
-
总内存占用:约 106996631 × 4KB = 408.95 GB
这一个 slab 项 就解释了之前 slab 区占用 416 GB 的大部分来源
关键结论:
系统 Slab 占用高达 416 GB,其中:
-
超过 98% 都来自
kmalloc-4096
; -
这是 内核层内存泄漏;
-
和应用进程无关,和
ps
看不到这些内存的 RSS 是一致的。
是不是在找解决方案。等啥呢,重启服务器呀。