我参与了嵌入式Linux环境下的跨平台软件开发。我看到我的应用程序在开始使用30多MB内存后运行速度非常慢。
我遵循了两种不同的方法,但最终都得到了相同的结果。
使用valloc分配(需要对齐的内存),在达到30MB后,我保留了分配的内存计数,应用程序变慢。
初始化时分配大量内存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
答案 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可能值得一看)。