我开发了一个运行 Linux (Ubuntu 14.04.3) 的系统(基于 x86_64),并连接了多个定制硬件。我为定制硬件编写了驱动程序和控制软件。
在该系统上运行了很长一段时间(几天)的测试后,我注意到可用内存量(如命令所示cat /proc/meminfo
)free
正在稳步下降。我的用户空间进程使用的内存量完全在合理范围内。我清除了页面缓存,但对可用内存量影响不大。
我重新启动了系统,然后编写了一个脚本来循环运行一个简单的测试 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。
我完全被难住了,很快就没有想法了。
有谁对正在发生的事情有任何想法和/或如何解决这个问题的建议吗?