![较高的 cancellation_write_bytes、较高的 IO 负载、并发内存映射](https://linux22.com/image/608836/%E8%BE%83%E9%AB%98%E7%9A%84%20cancellation_write_bytes%E3%80%81%E8%BE%83%E9%AB%98%E7%9A%84%20IO%20%E8%B4%9F%E8%BD%BD%E3%80%81%E5%B9%B6%E5%8F%91%E5%86%85%E5%AD%98%E6%98%A0%E5%B0%84.png)
我有一个用于从文件中持久化/检索数据的软件(有点像数据库,但它不完全是数据库引擎)。它不是开源的,文档也很少,因此我没有关于它内部工作原理的确切信息。它每天产生大约 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 争用。