Monthly Archives: 5月 2013

mysqldumpを速くする(その2)

nigaraです。

MySQLには複数のエンジンがありますが、トランザクションが必要もしくは行単位のロックが必要ならInnoDB、それらが不必要ならMyISAMという感じで選択されている方が大多数だと思います。

で、InnoDBはファイル容量も多いので当然ながらdumpもリストアも時間が掛かります。同一のdumpでリストア結果が以下になります。

InnoDB MyISAM
real 30m46.449s
user 1m59.186s
sys 0m5.185s
real 25m8.772s
user 2m5.125s
sys 0m5.377s

2割弱くらいMyISAMの方が速いですね。だからといってエンジンを変えることは仕様的に出来ない場合が多いので何ら活用する状況もないですが・・・。ただリストア目的がサイトの復旧では無く、データの集計など一時的な活用であればInnoDBを使わないと作業が捗る事になるでしょう。

なお、InnoDBを使用不可にする設定はmy.cnfの[mysqld]に「skip-innodb」を追加すれば、dumpファイルにInnoDBが記述されていてもMyISAMでテーブルが作成されます。

あとリストアの速さ以外にもInnoDBからMyISAMに変更するとファイル容量の削減に寄与します。以下も先ほどのdumpからのリストア時の容量ですが

InnoDB MyISAM
21G 8.1G

半分以下になってます。集計作業などで仮状態の作成であれば、MyISAMを使う方が大きなデータだと楽できるかもしれません。

mysqldumpを速くする(その1)

nigaraです。

mysqlで1000万レコードを超えたあたりからmysqldumpからのリストアが遅くなってきます。何とか速くならないかと現在試行錯誤中。とりあえず検証中の途中経過をつらつらと書いていきます。

I/Oの違いによるリストア速度差

HDD SAS(RAID0) Fusion-io ramdisk
real 16m26.839s
user 0m38.200s
sys 0m2.293s
real 9m23.932s
user 0m42.082s
sys 0m1.488s
real 8m50.237s
user 0m41.867s
sys 0m1.661s
real    8m42.956s
user    0m43.218s
sys    0m1.540s

リストアはI/OとCPU能力で速度が左右されますが、まずI/Oがボトルネックになり、次にCPUがボトルネックになります。ですのでリストアを速くするにはまず速いI/O環境にすることですが、結果の通りramdiskとSAS(RAID0)の違いは1割程度ですので、SASぐらいで充分ということになります。

TOPコマンドでの負荷表示もHDDだとCPUがあまり使われないのですが、SAS以上になると90%以上超えてボトルネックがCPUになっている事が判ります。

ここで問題となるのは、CPUは多少お金を掛けたところでそれほど速くならない実情があります。まずリストアはシングルスレッドですのでコア数がいくつあっても使われるコアは1つのみ。よってクロックの高いCPUで効果はありますが、10万円以上する

CPUに変えたところでクロックは2割ぐらいしかアップしません。しかもそれが上限のクロックだとさらなる上は時代の進化を待つしかなくなります。

 

となるとリストアを速くするには根本から見直す必要がありますが、構築やら実験やらで書くと長くなるのでまた次回。