进程显示为 100% I/O 绑定,同时产生最少的磁盘活动,磁盘利用率为 100%

进程显示为 100% I/O 绑定,同时产生最少的磁盘活动,磁盘利用率为 100%

我们遇到了很奇怪的问题。有一个程序(准确地说是加密货币节点),它拥有所有曾经进行的交易的本地数据库。数据库很大 - 大约 15 TB。问题是该程序不会与网络同步,尽管它有足够的对等点并且关于新旧块的知识不是问题。

现在奇怪的部分 - 我从头开始启动了相同的程序,没有 15TB 的历史记录,并且它立即开始同步,每个iostat. CPU 和内存利用率可以忽略不计。绝对数字为:

  • 读取速度:5MB/s
  • 写入速度:20MB/s
  • iotop - 此过程平均 20%

当我切换到历史数据库 (15TB) 时,iostat显示 100% 的磁盘利用率,iotop显示多个分叉进程,其中大多数进程占用 99% 的 I/O,但根据iotop或报告的卷判断,实际 I/O 并未发生iostat。读写速度均在1MB/s以内。这是在 MS Azure VM 上运行的,通过 Azure 门户,我们看到“完整”模式下磁盘利用率约为 1%,“新鲜”模式下写入约为 20%,因此云运营商的限制也不是问题。

现在的问题是 - 我如何诊断程序到底对磁盘做了什么?我正在考虑随机 I/O,尝试strace lseek运行,在新鲜模式和完整模式下都得到了一些,在完整模式下的比率要少得多,而我期望相反。那么它在完整模式下会做什么呢?程序具有相当可承受的文件描述符数量 ( /prod/<pid>/fd),连同对等 TCP 连接少于 50 个。一般来说,iostat和都iotop显示 100% 利用率,而没有实际消耗 I/O 带宽,这怎么可能呢?我们甚至给微软的工程师打了电话,他说这iostat可能不准确,尤其是对于SSD。可能是,但是当它说 util 是 100% 时,iotop确认了这一点,并且程序没有做它应该做的事情,有什么替代解释吗?

相关内容