较高的 cancellation_write_bytes、较高的 IO 负载、并发内存映射

较高的 cancellation_write_bytes、较高的 IO 负载、并发内存映射

我有一个用于从文件中持久化/检索数据的软件(有点像数据库,但它不完全是数据库引擎)。它不是开源的,文档也很少,因此我没有关于它内部工作原理的确切信息。它每天产生大约 50-100G 的数据,我知道它会将要写入的文件映射到内存中。您应该知道只有一个进程正在写入文件,但还有其他进程将文件映射到内存中(对于读取,它们没有写入数据的权限)。进程的负载在一天中大致保持不变,50-100G 的数据以较小的突发写入(每 10-30 秒发生一次)。因此,8 小时工作日的“平均”IO 应该在 2 MB/秒左右(这是现实的,因为进程通过 100Mbit 连接获取数据)。进程应该始终将数据附加到数据中,而不要删除它。

我看到的症状如下:

  • iostat 显示非常高的恒定 IO - 在 30-80 MB/秒之间波动
  • /proc/[pid]/io 显示极高取消写入字节数值。例如,当我上次检查时,write_bytes 大约为 1.4 TB(!),而 cancellation_write_bytes 大约为 1.32 TB - 差异恰好是预期的磁盘上文件的大小。
  • 存储非常繁忙,无法有效地读取或写入磁盘
  • 随着内存映射文件变大,这种行为会变得更糟

我知道这仍然只是对问题的一个非常模糊的描述,但我在这里能给出的细节是有限的,而且因为该软件是一个黑匣子,所以我无法获得有关其功能的更多信息。

有人知道是什么原因导致这个非常高的 cancellation_write_bytes 值吗?我发现当进程写入文件然后删除它时,该值很高。

谢谢。

答案1

是的,我已经搞明白了。它通过在原始文件上放置写锁、创建临时文件并稍后重命名来解决并发问题。因此,读取器进程会不断在新文件中调页,这两者结合在一起会导致总 IO 争用。

相关内容