应用程序在使用大内存分配后运行缓慢

时间:2011-03-30 04:22:12

标签: c linux memory-management

我参与了嵌入式Linux环境下的跨平台软件开发。我看到我的应用程序在开始使用30多MB内存后运行速度非常慢。

我遵循了两种不同的方法,但最终都得到了相同的结果。

方法1

使用valloc分配(需要对齐的内存),在达到30MB后,我保留了分配的内存计数,应用程序变慢。

方法2

初始化时分配大量内存40MB。进一步的分配是从这个分区完成的(从未释放出程序执行)。一旦使用30+ MB,应用程序就会变慢。但是,任何低于30 MB的应用程序都运行良好。

PS:我可以使用这种方法,因为分配了统一的内存块。可用内存总量为128MB。

我想知道为什么我的应用程序在访问内存时会变慢,即使分配成功。

# more /proc/meminfo
MemTotal:        92468 kB
MemFree:         50812 kB
Buffers:             0 kB
Cached:          22684 kB
SwapCached:          0 kB
Active:           4716 kB
Inactive:        18540 kB
HighTotal:           0 kB
HighFree:            0 kB
LowTotal:        92468 kB
LowFree:         50812 kB
SwapTotal:           0 kB
SwapFree:            0 kB
Dirty:               0 kB
Writeback:           0 kB
AnonPages:         600 kB
Mapped:            952 kB
Slab:             7256 kB
PageTables:        108 kB
NFS_Unstable:        0 kB
Bounce:              0 kB
CommitLimit:     46232 kB
Committed_AS:     1736 kB
VmallocTotal:   262136 kB
VmallocUsed:     10928 kB
VmallocChunk:   246812 kB

2 个答案:

答案 0 :(得分:2)

  

总可用内存为128MB

你对这个数字有多确定?如果它是系统总内存,则内核,驱动程序和其他进程将耗尽一些金额。可能是在分配30MB内存后,您开始交换到磁盘。这肯定会解释突然的缓慢。

答案 1 :(得分:0)

  

我想知道为什么我的应用程序在访问内存时会变慢,即使分配成功。

可能是因为在写入它们之前,Linux实际上不会使用物理页面来支持虚拟分配。因此,虽然你的malloc()成功,但它只是真正更新页面表,直到你真正使用那个内存为止。

查看上面的meminfo转储,我认为您的系统可以免费使用大约50MB:

  

MemFree:50812 kB

此外,大约22MB用作缓存:

  

缓存:22684 kB

我想知道你的应用程序使用超过30MB的内存是否会推动内核的VM到它决定开始释放缓存数据的程度。如果发生这种情况,您可能会发生减速,例如:您可能一直在使用的文件系统缓冲区从缓存中刷新。

我注意到你没有启用交换(SwapTotal是0kB)。如果你这样做,你的应用程序可能会导致虚拟机崩溃。

如果我是你试图调试这个,我会尝试运行“top”,因为我的应用程序达到了30MB的内存使用点,看看是否有任何内核线程突然变得更加繁忙。我还会使用“vmstat”来跟踪系统i / o和内存缓存/缓冲区分配。最后,我试着对/ proc filesytem进行一些调查,看看你是否可以收集任何内容(例如,/ proc / sys / vm可能值得一看)。