我有一个基于linux的嵌入式设备,我在其上运行QT GUI应用程序以及控制某些硬件的第二个应用程序。两者通过TCP相互通信。
我最近进行了系统测试,在那里我使用Squish刺激QT应用整整一周。在测试的开始和结束时,我为每个进程提取了smap和pmap文件。同样,我提取meminfo文件。
我如何比较之前和之后的文件,以便大致了解我是否存在整个设备的内存泄漏问题?此外,如果检测到泄漏,我如何粗略估计设备何时停止正常运行?
答案 0 :(得分:0)
我如何比较之前和之后的文件以获得一个粗略的想法 我整个设备是否有内存泄漏问题?
<强>答案:强>
我想您可能需要知道内核空间中使用了多少内存设备驱动程序,因此slab信息是值得研究的地方。
最初,您可以(运行脚本):
cat /proc/meminfo | grep -i Slab
监控值(长时间运行后的任何增加)。
如果确实如此,您可以通过查看每个条目,在cat /proc/slabinfo
的帮助下将泄露的漏洞与泄漏漏洞进行比较。
如果您熟悉每个条目的名称,(如果您确定它必须是此驱动程序中的泄漏并且大致了解它如何分配内存),您可以做出合理的猜测。
例如
size-4194304 0 0 4194304 1
kmem_cache 136 180 128 30
如果“kmem_cache entry”泄漏,那么你的驱动程序可能会调用kmem_cache_create和kmem_cache_alloc()但不是免费的
如果是“size-4194304”,你的驱动程序可能会调用get_zeroed_page或_ _get_free_pages但不是免费的。
我如何对设备何时进行粗略粗略的估计 停止正常运作
答案:
如果您的用户空间没有泄漏任何内存并且只在您的驱动程序中发生泄漏,您可以使用“free”命令获取可用的系统内存量。
然后你可以大致计算出用完的时间:
(总可用内存(kbyte)/内存leak_speed(kbyte / s))=秒数。
然而内核会在此之前抱怨。