如何找出正在消耗内存的内容?

如何找出正在消耗内存的内容?

我开发了一个运行 Linux (Ubuntu 14.04.3) 的系统(基于 x86_64),并连接了多个定制硬件。我为定制硬件编写了驱动程序和控制软件。

在该系统上运行了很长一段时间(几天)的测试后,我注意到可用内存量(如命令所示cat /proc/meminfofree正在稳步下降。我的用户空间进程使用的内存量完全在合理范围内。我清除了页面缓存,但对可用内存量影响不大。

我重新启动了系统,然后编写了一个脚本来循环运行一个简单的测试 500 次,清除页面缓存,然后将输出写入/proc/meminfo文件。然后我运行这个脚本几天来收集一些数据点。分析结果数据后,我注意到可用内存量(MemFree、MemAvailable 也)以线性方式稳步下降,而其他类别则大致持平。我收集了太多数据,无法在此处发布,但以下是第一个和最后一个数据点:

                       _Run 1_     _Run 650_
MemTotal:              65738276    65738276
MemFree:               65182220    30881420
MemAvailable:          65124632    30824008
Buffers:                   2292        2064
Cached:                  101204      100816
SwapCached:                   0           0
Active:                  174772      195008
Inactive:                 82924       82444
Active(anon):            154304      174712
Inactive(anon):           66624       66628
Active(file):             20468       20296
Inactive(file):           16300       15816
Unevictable:                  0           0
Mlocked:                      0           0
SwapTotal:             66978812    66978812
SwapFree:              66978812    66978812
Dirty:                      188         184
Writeback:                    0           0
AnonPages:               154296      180848
Mapped:                   99760       99360
Shmem:                    66672       66676
Slab:                     46836       48352
SReclaimable:             17000       18008
SUnreclaim:               29836       30344
KernelStack:               4176        4128
PageTables:                7244        6680
NFS_Unstable:                 0           0
Bounce:                       0           0
WritebackTmp:                 0           0
CommitLimit:           99847948    99847948
Committed_AS:            433008      417576
VmallocTotal:       34359738367 34359738367
VmallocUsed:            1886988     1886956
VmallocChunk:       34357817344 34357817344
HardwareCorrupted:            0           0
AnonHugePages:           106496      126976
CmaTotal:                     0           0
CmaFree:                      0           0
HugePages_Total:              0           0
HugePages_Free:               0           0
HugePages_Rsvd:               0           0
HugePages_Surp:               0           0
Hugepagesize:              2048        2048
DirectMap4k:              93872       93872
DirectMap2M:            1894400     1894400
DirectMap1G:           67108864    67108864

请注意,系统 64GB 内存的一半多一点以某种方式被消耗,而任何其他类别似乎都没有显着增加。

以下是我为尝试解决该问题所做的一些事情:

  • 我立即怀疑内核内存泄漏可能是由我的某个驱动程序引起的,因此我审核了所有驱动程序代码。我没有发现任何明显的问题。
  • 我还启用了内核的 kmemleak 检查器并重新运行前面提到的测试脚本。没有发现任何泄漏。
  • 最近我启用了页面所有者调试内核功能并重新运行我的脚本,同时收集定期输出。对输出进行排序和比较后,我看到了一些增量(根据我的计算,总增量为 10,872 页或约 42MB),但消耗的量几乎没有接近 30 GB。

我完全被难住了,很快就没有想法了。

有谁对正在发生的事情有任何想法和/或如何解决这个问题的建议吗?

相关内容