MongoDBをext3で使ったら死んだ

MongoDBをext3で使ってはいけません!
やったら死にます。

公式サイトには「ext3は非推奨」と書かれてますが、「非推奨」というか「禁じ手」です。
マジで死にます。

なぜext3でMongoDBを使ってはいけないのか

MongoDBにはpreallocateという仕組みがあり、保存に必要なデータ領域を前もってファイルシステム上に確保します。
わかりやすく言うと、「中身がゼロで埋められた巨大なファイルを前もって作成する」という振る舞いをします。

ところがext3は「巨大なファイルを作る」という処理が非常に苦手なのです。

Linux File Systems

MongoDB uses large files for storing data, and preallocates these. These filesystems seem to work well:

ext4 ( kernel version >= 2.6.23 )
xfs ( kernel version >= 2.6.25 )
In addition to the file systems above you might also want to (explicitly) disable file/directory modification times by using these mount options:

noatime (also enables nodiratime)

We have found ext3 to be very slow in allocating files (or removing them) as well as access within large files is also poor.

意訳
MongoDBはデータ格納するのに巨大なファイルを使います。下記ファイルシステムならちゃんと動作するでしょう。
  • ext4
  • xfs
それに加えて、noatimeマウントオプションで(明示的に)ファイル/ディレクトリ更新時間を無効にするとなおよいでしょう。

我々の調べでは、ext3はファイルアロケーションに非常に時間がかかることがわかっています。

http://www.mongodb.org/display/DOCS/Production+Notes
MongoDB公式サイトより引用

ext3でMongoDBを使うとどうなるのか

MongoDBを動かしている本番サーバがこんなことになってしまいました。

■環境
ニフティクラウド smallサーバ
mongodb-linux-x86_64-2.0.1
$ grep "done all"   /var/log/mongod.log

Sun Dec 25 17:22:03 [FileAllocator] done allocating datafile /data/db/hoge.ns, size: 16MB,  took 2.819 secs
Sun Dec 25 17:22:12 [FileAllocator] done allocating datafile /data/db/hoge.0, size: 64MB,  took 8.977 secs
Sun Dec 25 17:22:41 [FileAllocator] done allocating datafile /data/db/hoge.1, size: 128MB,  took 28.522 secs

[中略]

Mon Jan  9 15:06:02 [FileAllocator] done allocating datafile /data/db/hoge.6, size: 2047MB,  took 405 .869 secs
Sat Mar 10 12:25:11 [FileAllocator] done allocating datafile /data/db/hoge.7, size: 2047MB,  took 381 .189 secs
Tue Apr 17 15:17:39 [FileAllocator] done allocating datafile /data/db/hoge.8, size: 2047MB,  took 320 .807 secs
2GBのデータファイルを作成するのに、なんと6分以上もかかっています!

その時の負荷はというと・・・
00時00分01秒   runq-sz  plist-sz   ldavg-1   ldavg-5  ldavg-15
14時20分01秒         1       124      0.48      0.13      0.03
14時30分01秒         0       121      0.01      0.03      0.00
14時40分01秒         1       128      0.00      0.01      0.00
14時50分01秒         1       126      0.00      0.02      0.00
15時00分01秒         2       120      0.02      0.03      0.00
15時10分01秒         2       129      0.08      0.02      0.01
15時20分01秒         0       124      0.69      3.40     2.08
15時30分01秒         2       131      0.06      0.49      1.09
15時40分01秒         2       129      0.18      0.19      0.62
15時50分01秒         2       119      0.01      0.06      0.33
16時00分01秒         2       122      0.00      0.00      0.16
16時10分01秒         2       121      0.00      0.00      0.07
なにこれ痛い

ご覧のとおり、allocatingのタイミングで異常な高負荷になっています。
5分平均でロードアベレージ3.4ということは、瞬間最大風速はもっと高そうです。
ピーク時のロードアベレージは6~10ぐらい行ったのではないかと想像されます。

ext4だとどうなるのか?

別のマシンでext4上でMongoDBを実験してみたら、2GBのファイル作成は30秒ほどで完了しました。

ext4だとなぜ速いのでしょうか?
Ext4 fully implements posix_fallocate, which means MongoDB can allocate large files instantly. It is being reported that for example ext3 does some strange things with large files, it is also not very good with a huge number of small files. On older filesystems the semantics is so that literally all the file is zeroed out i.e. zeros are written to disk -- obviously this takes a very long time. Without going into details, ext4 and other modern filesystems do not actually do that but achieve the same result by other (way faster) means.

意訳

Ext4は"posix_fallocate"を完全に実装しているので、MongoDBは巨大ファイルの配置を即座にできるのです。

一方、Ext3は巨大ファイルを扱うときにおかしな挙動をすることが報告されています。
Ext3のような古いファイルシステムでは、巨大なファイルを作成するときに文字通りゼロがディスク上に書き込まれます。これは明らかに時間がかかります。

Ext4やその他モダンなファイルシステムでは、同じことを実現するのに、別のもっと速いやり方を採用しています。

http://www.markus-gattol.name/ws/mongodb.html#filesystem

ext3とext4のベンチマーク結果は?

続きを書きました。↓
MongoDBをext3とext4でベンチマークしてみたらext4が圧勝だった。
[続報]MongoDBをext3とext4でベンチマークしてみた(mongod 2.0編)

まとめ

  • MongoDB使うならext4がxfsを使いましょう!!
  • MongoDBをext3で使ったら死ぬ!!

参考

[FileAllocator] done allocating datafile takes tooooo long to hang mongod

追記1

2GBと2TBを間違えて表記していたので修正しました。ごめんなさい。

追記2

ext4に挑戦したらこうなりました。↓
[続報]MongoDBをext3で使ったら死んだ
カテゴリ:

人気記事