RAM 使用率低 + 频繁 allocation/deallocation 导致 Linux 换出其他程序
Low RAM usage + frequent allocation/deallocation causes Linux to swap out other programs
我目前正在处理的程序处理大量数据 (>32GB)。然而,由于 "pipelining",每个给定时间主内存中最多存在 600 MB 左右(我检查过,按计划工作)。
如果程序已经完成,并且我切换回工作区并打开 Firefox,例如(还有其他),我需要一段时间才能再次使用它(HDD 也有一段时间高度活跃) .这个事实让我想知道 Linux(我使用的操作系统)是否在我的程序是 运行 时换掉其他程序,为什么?
我的机器上安装了 4 GB 的 RAM,当我的程序处于活动状态时,它的利用率从未超过 2 GB。
我的程序只有allocates/deallocates只有两种不同大小的动态内存。 32 和 64 MB 块。它是用 C++ 编写的,我使用 new 和 delete。 Linux 是否应该不够聪明,无法在我释放这些块并保持其他内存不变后重用这些块?
为什么 Linux 将我的东西踢出内存?
这是我没有考虑过的其他影响吗?
我可以在不编写自定义内存管理系统的情况下解决这个问题吗?
最有可能的罪魁祸首是文件缓存。好消息是您可以禁用文件缓存。如果没有缓存,您的软件将 运行 更快,但前提是您以后不需要重新加载相同的数据。
您可以直接使用 linux API 执行此操作,但我建议您使用 Boost ASIO 等库。如果您的软件是 I/O 绑定的,您还应该使用异步 I/O 来提高性能。
所有最近使用的页面都导致旧页面被挤出磁盘缓存。结果,当其他一些程序运行时,它必须调回页面。
你想要做的是使用 posix_fadvise (or posix_madvise 如果你正在内存映射文件)弹出你强制 OS 缓存的页面,这样你的程序就没有巨大的缓存占用空间。这将使来自其他程序的旧页面保留在缓存中。
我目前正在处理的程序处理大量数据 (>32GB)。然而,由于 "pipelining",每个给定时间主内存中最多存在 600 MB 左右(我检查过,按计划工作)。
如果程序已经完成,并且我切换回工作区并打开 Firefox,例如(还有其他),我需要一段时间才能再次使用它(HDD 也有一段时间高度活跃) .这个事实让我想知道 Linux(我使用的操作系统)是否在我的程序是 运行 时换掉其他程序,为什么?
我的机器上安装了 4 GB 的 RAM,当我的程序处于活动状态时,它的利用率从未超过 2 GB。
我的程序只有allocates/deallocates只有两种不同大小的动态内存。 32 和 64 MB 块。它是用 C++ 编写的,我使用 new 和 delete。 Linux 是否应该不够聪明,无法在我释放这些块并保持其他内存不变后重用这些块?
为什么 Linux 将我的东西踢出内存? 这是我没有考虑过的其他影响吗? 我可以在不编写自定义内存管理系统的情况下解决这个问题吗?
最有可能的罪魁祸首是文件缓存。好消息是您可以禁用文件缓存。如果没有缓存,您的软件将 运行 更快,但前提是您以后不需要重新加载相同的数据。
您可以直接使用 linux API 执行此操作,但我建议您使用 Boost ASIO 等库。如果您的软件是 I/O 绑定的,您还应该使用异步 I/O 来提高性能。
所有最近使用的页面都导致旧页面被挤出磁盘缓存。结果,当其他一些程序运行时,它必须调回页面。
你想要做的是使用 posix_fadvise (or posix_madvise 如果你正在内存映射文件)弹出你强制 OS 缓存的页面,这样你的程序就没有巨大的缓存占用空间。这将使来自其他程序的旧页面保留在缓存中。