我们遇到了很奇怪的问题。有一个程序(准确地说是加密货币节点),它拥有所有曾经进行的交易的本地数据库。数据库很大 - 大约 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
确认了这一点,并且程序没有做它应该做的事情,有什么替代解释吗?