本文主要是介绍为何used内存占用很大,但是在meminfo中找不到?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
服务器上使用free查看内存使用情况,发现如下:
total used free shared buff/cache available
Mem: 250G 31G 196G 41M 22G 217G
Low: 250G 54G 196G
High: 0B 0B 0B
Swap: 0B 0B 0B
used内存占用有31个G的大小。而查看meminfo时也没有发现异常:
MemTotal: 262688980 kB
MemFree: 205753876 kB
MemAvailable: 228204672 kB
Buffers: 336952 kB
Cached: 22287564 kB
......
AnonHugePages: 98304 kB
HugePages_Total: 5
HugePages_Free: 5
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
DirectMap4k: 423808 kB
DirectMap2M: 10692608 kB
DirectMap1G: 258998272 kB
这30个G的内存由谁分配走了呢?使用top或者ps看下各个进程内存占用情况,依然没什么发现:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND1 root 20 0 194076 5868 2804 S 0.0 0.3 0:03.38 systemd2 root 20 0 0 0 0 S 0.0 0.0 0:00.01 kthreadd4 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H6 root 20 0 0 0 0 S 0.0 0.0 0:00.55 ksoftirqd/07 root rt 0 0 0 0 S 0.0 0.0 0:00.65 migration/08 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh9 root 20 0 0 0 0 S 0.0 0.0 0:03.82 rcu_sched10 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 lru-add-drain11 root rt 0 0 0 0 S 0.0 0.0 0:00.54 watchdog/012 root rt 0 0 0 0 S 0.0 0.0 1:14.84 watchdog/113 root rt 0 0 0 0 S 0.0 0.0 0:00.03 migration/114 root 20 0 0 0 0 S 0.0 0.0 0:03.03 ksoftirqd/116 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/1:0H17 root rt 0 0 0 0 S 0.0 0.0 0:00.86 watchdog/218 root rt 0 0 0 0 S 0.0 0.0 0:00.04 migration/219 root 20 0 0 0 0 S 0.0 0.0 0:01.62 ksoftirqd/221 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/2:0H22 root rt 0 0 0 0 S 0.0 0.0 0:00.35 watchdog/323 root rt 0 0 0 0 S 0.0 0.0 0:00.03 migration/324 root 20 0 0 0 0 S 0.0 0.0 0:00.25 ksoftirqd/326 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/3:0H
到底发生了什么,系统中的内存无迹可寻了吗?
解决方法是使用atop,这里输出的内存信息更加全面,在内存信息那一栏,可以查看到一个选项: hptot,表示系统中的大页占据的内存总量。
那么问题是meminfo中也有对应的数据,为什么没有体现出来呢?
其实在meminfo中,只能体现到2M类型的大页,对于服务器来说,可能存在1G的大页内存通过cmdline进行预留的,那么这部分信息在meminfo中查看不到:
Hugepagesize: 2048 kB
所以为了更加全面的掌握系统中的内存信息,对于大页来说,可以直接查看相应的文件节点:
/sys/kernel/mm/hugepages/hugepages-1048576kB/nr_hugepages
/sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
至于为什么内核不做出针对1G大页的统计信息,目前我也不是很了解,猜测可能是这种场景比较少见,一般也就虚拟化和服务器上才可能会使用,一般场景不会预留GB大小的内存,或者根本没有那么大的内存。
这篇关于为何used内存占用很大,但是在meminfo中找不到?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!