プロセスは100%I / Oバインドされているように見えますが、100%ディスク使用率で最小限のディスクアクティビティを作成します。

プロセスは100%I / Oバインドされているように見えますが、100%ディスク使用率で最小限のディスクアクティビティを作成します。

私たちは非常に奇妙な問題に直面しました。これまでに行われたすべての取引のローカルデータベースを保持するプログラム(正確には暗号通貨ノード)があります。データベースは約15TBと大きい。問題は、十分なピアがあり、古いブロックと新しいブロックの知識が問題にならないにもかかわらず、プログラムがネットワークと同期していないことです。

奇妙なことに、15TBの書き込みなしで同じプログラムを最初からiostat始めました。絶対数値は次のとおりです。

  • 読み取り速度: 5MB/s
  • 書き込み速度: 20MB/s
  • iotop - このプロセスは平均20%です。

履歴データベース(15TB)に切り替えると、iostatディスク使用率は100%で表示され、複数の分岐iotopプロセスが表示され、ほとんどの場合、I / Oの99%を占めていますが、報告されたボリュームiotopで判断すると実際のI / Oは発生しませんでしたiostat。読み書き速度は1MB/s以内です。これはMS Azure VMで実行されており、Azureポータルを介して「フル」モードで約1%のディスク使用率と「新鮮」モードで最大20%の書き込みを見ることができるため、クラウドオペレータの制限は疑いの余地がありません。

これで問題は、プログラムがディスクに対して何をしているのかをどのように診断できるかということです。私はランダムI / Oを見てstrace lseek実行してみましたが、新鮮モードとフルモードの両方でいくつかを取得し、フルモードでははるかに少なくなりましたが、その逆を期待しました。それでは、フルモードでは何をしますか?このプログラムには、/prod/<pid>/fd50個未満のP2P TCP接続で、かなり安価なファイル記述子()があります。一般的に言えば、iostatどちらもiotop実際にI / O帯域幅を消費せずに100%の使用率を示しています。これはどのように可能ですか?我々は、マイクロソフトのエンジニアにも電話をかけ、彼はこれがiostat特にSSDの場合は正確ではないかもしれないと述べた。そうかもしれませんが、util が 100% だと言って、iotopこれを確認すると、プログラムが期待どおりに実行されないことになります。他の説明はありますか?

関連情報