2

我在具有 64G RAM 和大量磁盘空间的 debian-64 上运行专门的数据库守护程序。它使用磁盘上的哈希表(已映射)并通过常规 write() 调用将实际数据写入文件。当进行大量更新时,mmap 的很大一部分会变脏,页面缓存会尝试将其刷新到磁盘,从而产生大量随机写入,这反过来会降低对数据文件的常规(顺序)写入的性能.

如果可以延迟 mmaped 区域的页面缓存刷新,性能会提高(我假设),因为对脏页面的多个(或全部)更改将一次写入,而不是每次更新一次(最坏的情况,实际上当然,无论如何它聚合了很多变化)。

所以我的问题是:是否可以延迟内存映射区域的页面缓存刷新?或者是否可以优先考虑常规写入?或者有人有其他想法吗?madvise 和 posix_fadvise 似乎没有任何区别......

4

2 回答 2

3

您可以使用/proc/sys/vm. 例如,增加值 indirty_writeback_centisecs使 pdflush 唤醒的频率稍低一些,增加值以dirty_expire_centiseconds允许数据在必须写出之前保持更长时间,并增加dirty_background_ratio以允许更多脏页在必须执行某些操作之前留在 RAM 中。有关所有值的作用的全面描述,
请参见此处。

请注意,这将影响您机器上的每个进程,但是看看您如何运行一个巨大的数据库服务器,这很可能没有问题,因为您不希望任何其他东西在同一台机器上运行。

现在当然这会延迟写入,但它仍然不能完全解决脏页写回竞争的问题write(尽管如果有很多更新它可能会崩溃一些写入)。
但是:可以使用sync_file_range系统调用来强制开始写出“写入”文件描述符 ( SYNC_FILE_RANGE_WRITE) 上给定范围内的页面。因此,虽然脏页将在稍后的某个未知时间(并且具有更长的宽限期)被写回,但您手动启动对您感兴趣的页面的写回。
这并不能提供任何保证,但它应该可以正常工作。

一定要绝对积极地阅读文档,最好阅读两遍。sync_file_range如果使用不当,很容易损坏或丢失数据。特别是,您必须确保元数据是最新的并在附加到文件时刷新,否则“成功写入”的数据将在崩溃的情况下“消失”。

于 2012-06-13T22:42:52.633 回答
0

我会尝试mlock。如果你mlock有相关的内存范围,它可能会阻止刷新的发生。完成后你可以munlock

于 2012-06-12T15:21:54.850 回答