あるツールの処理中にCPU使用率を見るとI/O待ちが発生していました。巨大なファイルを中間生成していてこれがI/O待ちの原因でしたが、結構な時間がかかっています。これを少しでも解消するため、パフォーマンスの良いファイルシステムを探してみました。
Temporary向きのファイルシステムを探して
ことの発端はスマートフォンアプリのMaps.me用地図の自作を始めたことでした。ツールを使って地図データをOSMから専用形式に変換するわけですが、これがメモリを大量に必要とするのです。本家はメモリをがっつり積んだサーバで作成しているの対して、我が家にそんな贅沢な環境は無いのでストレージをメモリ代わりにするモードで動作させています。当たり前ながら結構時間がかかります。遅いなりになんとか改善出来ないものか・・・と考えた末、じゃあ一時ファイルを書き出すストレージを用意してパフォーマンス優先でチューニングすればマシになるのではと考えました。
本記事ではツールが生成する中間生成ファイルを読み書きするためだけの、謂わばTemporary専用HDDとしての使用に適したファイルシステムを探すことを目的としています。Temporary専用なので、ファイルシステムはパフォーマンスを第一に考えて選択したいと考えています。信頼性については、不意のシステムダウンが発生してファイルシステムが破損してもテンポラリファイル以外無いので最悪フォーマットしてしまえばいい、というスタンスです。
環境
かなり古いPCです。このPCに巨大な中間生成ファイル書き出し先としてテンポラリ専用HDDを接続してベンチマークを取り、最もパフォーマンスの良くなるものを探したいと思います。
- CPU:Core2Duo E8400 (3.0GHz)
- Memory:8BGyte
- MothorBoard:Asus P5K-E
- OS:Ubuntu18.04 (64bit)
- kernel:4.15.0-36-generic
- Storage:
- HDD(System)
- HDD(データ保存用)
- HDD(ベンチマーク用)
ベンチマーク用HDDは以下のものを使用します。
- WesternDigital WD15EADS(1.5GByte)
試験内容
測定方法
ベンチマーク用HDDにファイルシステムを作成して、bonnie++を使用してベンチマークを行いました。
$ bonnie -d /target/ -n 256:1024:1024:16
比較対象のファイルシステム
パフォーマンスの良いファイルシステムと言っても、でかいファイルが作られるのでファイルのサイズ制限が小さいと使えませんし、ツールの仕様上シンボリックリンクが使えなくても困ります。ということで選択肢はそう多くはありませんでした。
- ext4
- ext2
- xfs
ブロックサイズはそれぞれデフォルト値の4096byteです。加えて、それぞれのファイルシステムでパフォーマンスに影響すると思しきマウントオプションを変更して比較を行います。
なお、zfsは搭載メモリが少ないとパフォーマンスを発揮できないらしいので今回は除外しました。
測定結果
測定した結果をスプレッドシートにまとめてみました。計測値は同じパラメータでも毎回バラツキ(10%くらいは前後してそう)があるようなので参考程度に見てください。
比較してみると・・・
今回の目的であるツールの一時ファイル置き場としては、恐らくバイト単位のRead/Writeが多発すると思われます。それに関係する数値をグラフにしてみました(かなり見難くて申し訳ないですが、ext4から順にマウントオプション毎の数値になっています)。
バイト単位の読み込み速度
バイト単位の書き込み速度
Seek
こうして見るとext2(マウントオプションdefault)がバランス良くパフォーマンスが出ているようですね。ジャーナリングシステムが無い分シンプルだからでしょうか。サポートする日付範囲が2038年までなのがちょっとアレですが、しばらくTemporary専用HDDにext2を採用して様子を見ようと思います。
所感
思い付きから始まったベンチマークの結果、意外(でもない?)とバイト単位のRead/Write性能ではext2に軍配があがりました。もちろん、この結果は一時ファイルしか置かない作業用ストレージという使い方故の選択です(システムや重要なデータが入っているのにはext4を使っています)。あるいはHDDではなくSSDだったら違う結果になったかもしれません。
個人的に意外だったのは、ext4にnobarrierやdate=writeback等といったパフォーマンス優先のマウントオプションを指定しても思ったようにパフォーマンスが伸びない(ものによっては低下している)ことです。おそらく環境や使い方によるのだと思いますが、実際に測ったみないと分からないものですね。
参考
この記事は以下の内容を参考にさせていただきました。
- Linuxで自宅サーバ構築(新森からの雑記) - Linuxファイルシステム(ext4)のジャーナリングモードについて
http://www.uetyi.com/server-const/entry-1789.html - d.sunnyone.org - 一部のSSDとext4でWriteが激しく遅い問題に対処する
http://d.sunnyone.org/2014/09/ssdext4write.html - 白烏のチラ裏 - ext4のボトルネック除去:(SSDの)命懸けベンチマーク編
http://white-raven.hatenablog.com/entry/2013/01/02/033201 - kernel.org - Ext4 Filesystem
https://www.kernel.org/doc/Documentation/filesystems/ext4.txt - Unofficial DB2 BLOG - 最近のLinuxで有効になっているI/Oバリア機能と、RDBへの影響
http://db2.jugem.cc/?eid=2485 - Qiita @rarul - ext4のnobarrierとjournal_async_commitの詳細
https://qiita.com/rarul/items/4465db56a5cd546a3462 - Qiita @rarul - Linuxのrelatimeマウントオプションの詳細
https://qiita.com/rarul/items/5e6629387887c2f554b9#noatime-vs-relatime - 誰かの役に立てばいいブログ - NVMe ストレージの揮発性内部キャッシュ
https://ymmt.hatenablog.com/entry/2018/02/13/143716 - archlinux - ZFS
https://wiki.archlinux.jp/index.php/ZFS - serverfault - Should we mount with data=writeback and barrier=0 on ext3?
https://serverfault.com/questions/486677/should-we-mount-with-data-writeback-and-barrier-0-on-ext3 - Tech random memoranda - ファイルシステム(ext2/ext3/ext4)の基礎まとめ
http://nishidy.hatenablog.com/entry/2016/10/11/221042 - @IT - Linuxファイルシステム技術解説(4): ext3とトランザクション処理
http://www.atmarkit.co.jp/ait/articles/0309/17/news002.html - HesonogomaTips - Linux Tips – bonnie++の使用方法
https://hesonogoma.com/linux/usageofbonnie.html - kazmax - Linux パーティションにmkfsでファイルシステムを作る
http://kazmax.zpp.jp/linux_beginner/mkfs.html - Hermemo.com - Ubuntuでデバイスをexfatにフォーマットする方法
https://hermemo.com/archives/1245