gpt4 book ai didi

linux - 如何将 write() 优先于 mmap 更新(或延迟 mmap 页面缓存刷新)

转载 作者:太空狗 更新时间:2023-10-29 12:06:13 34 4
gpt4 key购买 nike

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

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

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

最佳答案

您可以使用 /proc/sys/vm 中的可调项。例如,增加 dirty_writeback_centisecs 的值使 pdflush 唤醒的频率稍微降低,增加 dirty_expire_centiseconds 允许数据在必须被写出之前保持脏的时间更长,并且增加 dirty_background_ratio 以允许更多脏页在必须完成某些操作之前保留在 RAM 中。
参见 here以获得对所有值的作用的全面描述。

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

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

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

关于linux - 如何将 write() 优先于 mmap 更新(或延迟 mmap 页面缓存刷新),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10999397/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com