2025/08/07 15:59 Optimizing My Disk Usage Program

ロボ子、今回のITニュースは`dumac`のパフォーマンス改善についてじゃぞ!以前紹介した高速ディスク使用量プログラムが、さらにパワーアップしたみたいじゃ。

それは素晴らしいですね、博士!具体的にはどのような改善がされたのでしょうか?

まず、Lobstersでのフィードバックを実装した結果、パフォーマンスが約28%も向上したらしいぞ。スレッドスケジューリングのオーバーヘッド削減とinodeハッシュセットシャードへのアクセス最適化が主な要因みたいじゃな。

なるほど。スレッドスケジューリングの改善は、並列処理の効率化に繋がりそうですね。

そうなんじゃ。以前はディレクトリごとにTokioを使ってタスクを生成していたんじゃが、`getattrlistbulk`の呼び出しがブロッキングコールを必要としたからの。そこで、YogurtGuyさんの提案で、Tokioの代わりにRayonを使うようにしたみたいじゃ。

Rayonですか。それによって、どのようなメリットがあるのでしょう?

Rayonを使うことで、スレッドプールからスレッドを再利用できるようになったんじゃ。`getattrlistbulk`の呼び出しごとに新しいスレッドを作成する必要がなくなったからの。macOSのInstrumentsを使って、`dumac`が固定数のスレッドを使用していることを確認したらしいぞ。

スレッドの再利用は、オーバーヘッドを削減する上で非常に効果的ですね。

じゃろ?システムコールの数が半減し、コンテキストスイッチの数が約80%も減少したらしいぞ!これはすごいことじゃ。

他にinodeロックの競合削減も行ったと書いてありますね。これはどのように実現したのでしょうか?

ハードリンクをinodeで重複排除するために、シャード化されたハッシュセットを使用しているんじゃが、inodeを128で割った余りでハッシュセットを決定していたのが問題だったみたいじゃ。inodeがシーケンシャルに作成される傾向があるため、ロックの競合が発生しやすかったんじゃな。

なるほど、APFSがIDをシーケンシャルに割り当てるという特性が影響していたのですね。

そうなんじゃ。そこで、inodeの下位8ビットをシフトすることで、ロックの競合を大幅に削減したらしいぞ。平均ロック衝突が176.66から4.66に減少したみたいじゃ。

`inode >> 8`を使用することで、256個の連続するinodeがグループ化され、一時的な局所性が向上し、マルチスレッドクロールでのシャード間競合が削減されたのですね。

その通り!ロック競合の削減により、大規模ベンチマークのパフォーマンスが約5%向上したらしいぞ。これらのパフォーマンス改善は`dumac`のリポジトリにプッシュ済みじゃ。

素晴らしい改善ですね!`dumac`はさらに高速なディスク使用量プログラムになったのですね。

そうじゃな!しかし、これだけ速くなると、ディスクが悲鳴を上げ始めるかもしれんぞ…まるで、私がおやつを食べ過ぎて体重計が悲鳴を上げるみたいに…って、ロボ子、笑うでない!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。