我在debian-64上运行一个专用的DB守护进程,内存为64G,磁盘空间很大。它使用磁盘哈希表(mmaped)并将实际数据写入具有常规write()调用的文件中。在进行大量更新时,mmap的很大一部分变脏,页面缓存会尝试将其刷新到磁盘,从而产生大量随机写入,从而降低了对数据文件的常规(顺序)写入的性能
如果有可能延迟页面缓存刷新mmaped区域的性能会改善(我假设),因为脏页面的几个(或全部)更改将立即写入而不是每次更新一次(最坏的情况) ,实际上它当然聚合了许多变化。)
所以我的问题:是否有可能延迟内存映射区域的页面缓存刷新?或者是否可以优先考虑常规写入?或者有没有人有任何其他想法? madvise和posix_fadvise似乎没有任何区别......
答案 0 :(得分:3)
您可以使用/proc/sys/vm
中的可调曲目进行播放。例如,增加dirty_writeback_centisecs
中的值以使pdflush更频繁地唤醒,增加dirty_expire_centiseconds
以便允许数据保持脏一段时间,直到必须写出来为止,并增加dirty_background_ratio
在必须完成任务之前允许更多脏页留在RAM中
有关所有值的详细说明,请参阅here。
请注意,这会影响计算机上的每个进程,但是看看你是如何运行庞大的数据库服务器的,这可能是没有问题的,因为你不需要运行其他任何东西无论如何,在同一台机器上。
现在当然这会延迟写入,但它仍然无法完全解决与write
竞争的脏页回写问题(尽管如果有很多更新,它可能会崩溃一些写入)。
但是:您可以使用sync_file_range
系统调用来强制在“写入”文件描述符({{1})上开始写出给定范围内的页面})。因此,虽然脏页面将在稍后的某个未知时间(并且具有更长的宽限期)被写回,但您可以手动启动对您感兴趣的页面的回写。
这并没有给出任何保证,但它应该才能正常工作。
务必绝对正确阅读文档,最好阅读两次。如果您使用错误,SYNC_FILE_RANGE_WRITE
很容易损坏或丢失数据。特别是,如果附加到文件中,则必须确保元数据是最新的并刷新,或者“成功写入”的数据在发生崩溃时才会“消失”。
答案 1 :(得分:0)
我会尝试mlock。如果mlock
相关的内存范围,则可能会阻止刷新。完成后你可以munlock
。