我们的嵌入式 Linux 机器存在问题。有些机器存在内存泄漏。
所有进程均不持有泄漏的内存。
在终止所有可能的进程后,泄漏仍然存在。从 /proc/meminfo 查看时,似乎泄漏的内存位于非活动内存下:
~ # echo 1 > /proc/sys/vm/drop_caches ; cat /proc/meminfo
MemTotal: 126744 kB
MemFree: 107684 kB
Buffers: 0 kB
Cached: 1160 kB
SwapCached: 0 kB
Active: 1204 kB
Inactive: 12532 kB
SwapTotal: 0 kB
SwapFree: 0 kB
...
~ # ps
PID USER VSZ STAT COMMAND
1 root 2748 S init
2 root 0 SW< [kthreadd]
3 root 0 SW< [ksoftirqd/0]
4 root 0 SW< [events/0]
5 root 0 SW< [khelper]
31 root 0 SW< [kblockd/0]
42 root 0 SW< [khubd]
48 root 0 SW< [kmmcd]
82 root 0 SW [pdflush]
83 root 0 SW [pdflush]
84 root 0 SW< [kswapd0]
85 root 0 SW< [aio/0]
170 root 0 SW< [rpciod/0]
176 root 0 SW< [mmcqd]
1346 root 2756 S telnetd -l /bin/login
1347 root 2856 S -sh
3737 root 2856 R ps
~ #
Ram 磁盘未使用。Linux 版本为 2.6.25.9。
有什么方法可以找到非活动内存不断增加的原因吗?是否可以刷新或删除非活动内存?
答案1
非活动内存不是问题,当然也不是“泄漏”;它是通常用于缓冲当前未运行的文件或可执行文件的内存页,并被保留以备可能重新使用。如果某些东西需要其中的数据(读取同一个文件或运行同一个程序),那么它们将被重新使用,而无需再次访问磁盘;但是,如果其他东西需要这些页面,它们的非活动状态意味着它们将在需要时使用。
换言之,可以将空闲内存视为具有绝不已分配;非活动内存是已分配的内存并获释。
答案2
您发布的数据中没有任何泄漏的证据。内存被正确跟踪为非活动状态。如果您在sync
之前执行drop_caches
,您可能不会看到那么多非活动内存,但是您正在通过强制页面离开缓存来创建它。如果它们无法释放(比如说它们很脏),它们就会变为非活动状态。
您可以通过运行 来强制更快地同步脏的、不活动的内存sync
,但我无法想象这样做的任何可能原因。您无法强制释放干净的、不活动的内存,我也想象不出您想要这样做的任何理由。系统已经可以丢弃它,并且当可用内存池耗尽时,它已经是第一个可供使用的。为什么您希望它更自由?
如果您不想让系统使用内存,请将其从机器中取出并放在桌子上。因为现在,您只是通过强制系统以比预期更快的速度缩小缓存和刷新脏页来降低系统速度,从而导致大量不必要的 I/O。只需让它自己工作即可。