- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在具有 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/
在我正在处理的应用程序上,onCreate 使用 startService() 启动一个服务,随后,该 Activity 在其 onStart 中调用 bindService(到同一服务)。问题是服务
这个问题已经有答案了: Problem joining tables where joined table needs to be ordered before grouping (2 个回答) 已关
上下文(虽然不重要),在 netfilter 模块中,我们使用如下结构: struct data { char mac[ETH_ALEN]; char in6_addr addr; }
Google Chrome 的页面性能审核建议将 CSS 导入放在 header 中的 JS 导入之前,以允许并行下载 CSS 和 JS 文件。 但是,我注意到这会导致 Firefox 在导航到另一个
这个问题已经有答案了: Results of printf() and system() are in the wrong order when output is redirected to a f
这个问题已经有答案了: Results of printf() and system() are in the wrong order when output is redirected to a f
我想获得按 project_id 排序的独特帖子基本上,如果有重复的帖子,我想要其中 project_id 的帖子不为空。 有什么办法可以得到这个吗? 此代码返回唯一的帖子,但它们不是按 projec
我是一名优秀的程序员,十分优秀!