2013-03-18 チューニンガソン5の復習 MySQL 5.6 新機能編

というわけで、MyNA(日本MySQLユーザ会)会 2013年3月に参加して発表をしてきました。とてもリラックスして話をすることができました。司会進行の坂井さんをはじめ日本MySQLユーザ会のみなさま、日本オラクルのみなさま、当日お越しいただいたみなさま、どうもありがとうございました。
私のセッションでは前回のエントリの続きということで、MySQL 5.6の新機能Optimizer Traceを活用しながら正攻法でのチューニングを行っていきました。とはいえ途中から正攻法ではなくなっていた気もします。MySQL 5.6でRDBMSとしての土台はしっかりしてきたと思いますので、今後は高度な統計情報を使用したSQL実行計画の最適化といったところにも機能強化が施されていくのではないかと期待しています。
プレゼンテーション資料からリンクしているウェブサイトの一覧です。
- チューニンガソン5の復習 MySQL 5.5 チート編&勉強会のお知らせ - SH2の日記
- My MySQL is faster than your MySQL
- Is MySQL 5.6 slower than MySQL 5.5?
- MySQL Bugs: #68413: performance_schema overhead is at least 10%
- MySQL Bugs: #66473: MySQL 5.6.6-m9 has more mutex contention than MySQL 5.1
- INDEX FULL SCANを狙う - MySQL Casual Advent Calendar 2011 - SH2の日記
- MySQL SQLオプティマイザのコスト計算アルゴリズム - SH2の日記
- MySQL :: MySQL 5.6 Reference Manual :: 8.13.14.1 Loose Index Scan
もっとすてきなチューニング方法を見つけたら、ぜひ教えてください。
2012-12-17 Provisioned IOPSの検討 - JPOUG Advent Calendar 2012

2012年9月にAmazon RDSでProvisioned IOPSというサービスが利用できるようになりました。本日はこれを題材にして、IOPSを保証するということについて勉強していきたいと思います。このエントリは、JPOUG Advent Calendar 2012の17日目となります。16日目は@maroon1stさんでした。
Amazon RDSについては、@horiuchiさんが15日目のエントリでまとめ記事を書いていらっしゃいます。Provisioned IOPSについては記事の反響で第3位ということで、なかなか注目度が高かったことが分かりますね。
- Amazon RDS 2012年 サービスアップデートまとめ - Amazon Web Services ブログ
- 【AWS発表】Amazon RDS でハイパフォーマンスなプロビジョンドIOPSストレージを利用可能に(東京リージョンも2012/11/16より利用可能になりました!) - Amazon Web Services ブログ
fioによるIOPSの測定
さて、まずはIOPSを測定するツールを準備しましょう。I/O関連のベンチマークツールはいろいろありますが、今回はfio - Flexible I/O Testerを使用することにしました。これは私が希望する測定パターンをすべて再現できたこと、Red Hat Enterprise Linuxやそのクローン、およびUbuntu向けにバイナリパッケージが用意されておりインストールが簡単なことが主な理由です。RHEL系の場合はRepoForceからバイナリパッケージを入手、Ubuntuの場合はapt-getコマンドでインストールできます。
fioを使用した最近のベンチマーク結果として、@namikawaさんがAmazon EC2 High I/O Quadruple Extra Large Instanceの測定結果を、@kazeburoさんがIntel SSD 910 800GBの測定結果を公開されています。
- 噂の高速SSDを積んだAmazon EC2インスタンスのI/Oベンチマークをとってみた - RX-7乗りの適当な日々
- Intel SSD 910 800GB のベンチマーク - blog.nomadscafe.jp
これを参考にしつつ、以下のようにカスタマイズしておきます。
- テストファイルサイズを16GBに拡大します。これはRAIDコントローラやストレージのキャッシュによって性能が高ぶれするのを防ぐためです。OSのページキャッシュについてはDirect I/Oを使用することであらかじめ影響を排除しておきます。ディスクに余裕があればファイルサイズはもう少し増やしておきたいところで、例えばさくらインターネットさんではSSDプランの提供にあたり100GBで測定されています。
- ブロックサイズ4KBに加えて8KB、16KBの測定を行います。8KBはOracle Databaseのデフォルトブロックサイズ、およびPostgreSQLのブロックサイズです。16KBはMySQL InnoDBのページサイズです。
- 読み書きをミックスさせた測定を行います。読み取り100%、書き込み100%のほかに、読み取り:書き込み=90:10、50:50、10:90での測定を追加します。
- 非同期I/Oを使用します。多重アクセスによる性能の伸びを測定する際、fioでは-numjobs=64 -group_reportingとしてマルチスレッド実行をさせることができますが、非同期I/Oを使用して-ioengine=libaio -iodepth=64と指定することもできます。基本的に同じ結果が得られます。MySQL 5.1+InnoDB Pluginが同期I/Oのマルチスレッド実行、MySQL 5.5が非同期I/Oを行っているということをふまえ、今回は非同期I/Oを採用します。
- 非同期I/OにおけるQueue Depthのバリエーションを増やします。64以外に、1から256までの測定パターンを用意しておきます。なおSerial ATAの場合はNCQ(Native Command Queuing)の上限が32なので、高速なSSDを持ってきたとしても多重アクセスによる性能の伸びは32で頭打ちとなります。
できあがった測定スクリプトは以下のようになりました。測定パターンはシーケンシャル読み取り、シーケンシャル書き込みの2パターンに加え、ランダム読み書きがブロックサイズ3パターン×読み書き比率5パターン×Queue Depth 9パターンで135パターンあり、合計で137パターンとなります。1回の測定を60秒に設定していますので、全パターンの測定には2時間強かかります。
手元のパソコンで測定した結果をご紹介します。fioのログからこの表を出力するスクリプトを用意していますので、ご利用ください。
Plextor PX-256M2Pはカタログスペックで読み取りIOPSが70,000、書き込みIOPSが65,000となっていますが、ほぼカタログスペック通りの値が出ていることが分かると思います。黄色のセルは、Windowsでよく使われているCrystalDiskMarkと同じ測定を行っている部分です。
ブロックサイズが大きくなるとIOPSは下がっていきます。また読み書きをミックスさせると読み取りのみ、書き込みのみの場合に比べてIOPSが下がります。この傾向はPlextor以外のSSDでも同じでした。
cgroupによるIOPSの制御
では、IOPSの制御を試してみましょう。調べたところ、IOPSを制御する方法は2つ見つかりました。
- QEMUのDisk I/O Limits機能を使う方法。IBMが中心となって開発が進められている機能です。KVM Forum 2011のウェブサイトにIO Throttling in QEMU (PDF)というプレゼンテーション資料が公開されています。
- Linuxのcgroup(Control Group)機能を使う方法。cgroupはLinux Kernel 2.6.24からある機能ですが、2.6.37からブロックデバイスに対するI/O帯域、IOPSを制御できるようになりました。RHEL 6はKernel 2.6.32ですが、6.1にこの機能がバックポートされています。@enakai00さんがブログで詳しい解説をされています。
QEMUのDisk I/O Limits機能はまだ開発中ということで、今回はcgroupを使用しました。ここから先は仮想環境で作業を行っていきます。cgroupによるIOPS制御には技術的な制限事項があって、物理環境では少し使いづらいためです。この件については後述します。
- Storage:Plextor PX-256M2P
- Host OS:Scientific Linux 6.3 x86_64
- Host I/O Scheduler:deadline
- Host Filesystem:ext4 (rw,discard,nobarrier), 4KB aligned
- KVM Disk Bus:virtio
- KVM Storage Format:raw
- KVM Cache Model:none
- KVM I/O Mode:native
- Guest OS:Scientific Linux 6.3 x86_64
- Guest I/O Scheduler:noop
- Guest Filesystem:ext4 (rw,nobarrier), 4KB aligned
まずIOPSを制御しない状態での、仮想環境の素の性能です。ブロックサイズによる傾向の違いはなかったので、ここから先は16KBの結果のみ掲載します。
物理環境とあまり変わらない形のグラフですが、Queue Depthが小さいときの性能の落ち込みが目立ちます。これはI/Oリクエストが2つのOSを経由するため、レイテンシが長くなっていることが原因です。Queue Depth 1の性能はシングルスレッドで行う大量処理、例えばLOAD DATAやALTER TABLEに効いてくるので、仮想化のオーバーヘッドというものは今でもそれなりにあります。
一方、ピーク性能は物理環境と変わりないことが分かります。処理を詰め込めるだけ詰め込んでしまえば、アライメントが合っていないなどのミスがなければ最終的にはストレージの限界性能が出ます。もちろん、CPUなど他のコンポーネントがボトルネックになっていないことが前提です。
次は、読み取り、書き込みとも10,000 IOPSに制限した測定結果です。これはKVMホストから以下のコマンドを実行して設定します。
# ls -l /dev/sda brw-rw---- 1 root disk 8, 0 9月 16 23:00 2012 /dev/sda # echo '8:0 10000' > /cgroup/blkio/libvirt/qemu/k01sl6/blkio.throttle.read_iops_device # echo '8:0 10000' > /cgroup/blkio/libvirt/qemu/k01sl6/blkio.throttle.write_iops_device
非常にきれいなグラフになっています。ここまでうまくいくとは予想していませんでした。読み取り100%のときはちょうど10,000 IOPSになっており、90%のときは読み取り10,000+書き込み1,111で11,111 IOPSとなります。50%のときは上限20,000 IOPSですが今回使用したSSDはそこまで性能が出ないため、16,634 IOPSとなっています。
続いて、3,000 IOPS、1,000 IOPSに制限した測定結果です。
きちんと効いていますね。かなり使える機能だと思います。
cgroup使用時の注意点
RHEL 6.3の時点では、cgroupによるI/O帯域、IOPSの制御には技術的な制限事項があります。それはBuffered Writeに対して正常に動作しないというものです。例としてKVMゲストでOS全体に書き込み1,000 IOPSの制限をかけると、以下のようになります。
# echo '252:32 0' > /cgroup/blkio/blkio.throttle.write_iops_device # dd if=/dev/zero of=test.dat bs=131072 count=8192 oflag=direct 8192+0 records in 8192+0 records out 1073741824 bytes (1.1 GB) copied, 8.20527 s, 131 MB/s
oflag=directを付けた場合は8,192回の書き込みに8.2秒かかるということで、想定通りです。
# dd if=/dev/zero of=test.dat bs=131072 count=8192 8192+0 records in 8192+0 records out 1073741824 bytes (1.1 GB) copied, 202.553 s, 5.3 MB/s # dd if=/dev/zero of=test.dat bs=131072 count=8192 oflag=dsync 8192+0 records in 8192+0 records out 1073741824 bytes (1.1 GB) copied, 309.503 s, 3.5 MB/s
しかし、oflag=direct以外の設定では極端に性能が劣化してしまいます。OSのバッファに書き込んでいる間は速いのですが、そこから溢れて実際にブロックデバイスに書き込みに行くところで制御がうまくいっていないようです。設定が効かなくてフルスピードになってしまうならまだしも、こんなに遅くなってしまっては困ります。
現状cgroupによるI/O帯域、IOPSの制御が期待通りに動作するのは、Direct I/Oに対してのみです。RHELのマニュアルにも注意事項が記載されています。
Currently, the Block I/O subsystem does not work for buffered write operations. It is primarily targeted at direct I/O, although it works for buffered read operations.
Chapter 3. Subsystems and Tunable Parameters - Red Hat Customer Portal
Oracle Database、MySQLはDirect I/Oを使用していますが、すべてのI/OがDirect I/Oというわけではありません。また、PostgreSQLはDirect I/Oを使用していません。これらのソフトウェアに対して直接cgroupでI/O帯域、IOPSの制御を行うことは、まだ無理です。
ではなぜこの機能がRHEL 6.1にバックポートされたのかですが、おそらくKVMでの利用を狙ってのことだと考えられます。qemu-kvmは設定によって、KVMゲスト側のI/O方式に関わらずKVMホスト側でDirect I/Oを行わせることができます。仮想化によるシステム統合やプライベートクラウド基盤の構築を行う際、KVMホスト側でqemu-kvmプロセスにcgroupの設定を行うことで、KVMゲストごとのI/Oリソース消費量を制御することができるというわけです。
qemu-kvmにDirect I/Oをさせるには、仮想ディスクのキャッシュモデルにnoneを指定します。
デフォルトはwritethroughです。writethroughの場合はBuffered I/Oが行われるため、cgroupによるI/O帯域、IOPSの制御は先ほどと同じように誤動作してしまいます。ご注意ください。
# dd if=/dev/zero of=test.dat bs=131072 count=8192 oflag=direct 8192+0 records in 8192+0 records out 1073741824 bytes (1.1 GB) copied, 262.503 s, 4.1 MB/s
なおwritebackは設定としては存在しているのですが、障害発生時にデータを失う危険性があるためサポート対象外となっています。
ここまでの内容から、RHEL 6.3の時点でIOPSの制御を行うための前提条件は以下のようになります。
ここでcgroupによるI/O帯域、IOPSの制御はブロックデバイスを対象とした機能ですので、以下の条件も追加されます。
イメージファイルがブロックデバイス上に配置されていない場合は、もう一つの方法であるQEMUのDisk I/O Limits機能が提供されるのを待つことになるかと思います。
IOPSを保証するということ
話をAmazon RDSに戻すと、Amazon Web Servicesは仮想化基盤としてKVMではなくXenを使用しているので、ここまで述べたものとは別の方法でProvisioned IOPSを提供しているということになります。XenでIOPSを制御する方法はすぐには見つかりませんでしたが、もしDom 0でtapdiskプロセスにcgroupが効くのであれば似たような方法で実現できるのかもしれません。あるいは、もっと低いレイヤで実装しているのかもしれません。
IOPSを保証するというのはAmazon RDSのようなパブリッククラウドサービスだけでなく、プライベートクラウド基盤や一般のシステム開発にとっても重要な概念です。近年一つのシステムが一つのストレージを占有できる構成は少なくなってきており、システム基盤の共通化という方針のもと複数システムで少数のサーバやストレージを共有するようになってきています。その際CPUやメモリについては現行を踏襲したハードウェアリソースを割り当ててもらえるのですが、ストレージについては容量しか考慮してもらえないことが多く、あとから深刻な性能問題を起こすことが増えています。
IOPSというものがストレージ製品のカタログに書いていないことも、サイジングの際に容量しか考慮してもらえない原因の一つだと考えています。IOPSは同じストレージ製品でも構成によって大きく変わるので、確かにカタログに書きづらい部分はあります。そこで今回簡単にIOPSを測定できるスクリプトを用意しましたので、これを用いてさまざまなストレージ製品の性能を事前に収集しておくことをおすすめします。
プライベートクラウド基盤を設計する際は、特にDBMSを稼動させる計画がある場合、CPUコア数やメモリ量だけでなくIOPSについても目標値を定め、適切な設備投資を行ってください。
システム統合を行う際は、まず現行システムのリソース消費状況を調査すると思います。その際CPU使用率だけ見るのではなく、必ずI/O状況も見てください。Oracle Databaseであれば、Statspack/AWRレポートのLoad ProfileセクションからPhysical readsとPhysical writes、MySQLであればSHOW ENGINE INNODB STATUSからFILE I/Oセクションのreads/sおよびwrites/sを確認してください。I/O状況の調査は、夜間バッチや業務繁忙期などシステム負荷が高い時間帯を必ず含むようにしてください。そして、各システムのIOPSを合計したよりも高い性能のストレージ製品を調達してください。
Provisioned IOPSはユーザから見ると希望するIOPSを得られるというサービスですが、クラウド基盤提供側やシステム統合の立場から見ると違った意味があります。この機能には、特定のユーザやシステムが必要以上にI/Oリソースを占有して他のシステムに影響を与えることを防ぐ意味があります。現状さまざま前提条件がありますが、RHEL系でKVMを使用している場合は検討する価値のある機能だと思います。最大の課題はOracle DatabaseがKVM上で動作保証されていないことですね。まあ、システム統合のついでにPostgreSQLにマイグレーションするというのもいいかもしれませんね。
Oracle Databaseについていえば、IOPSが足りないときの究極の解決策はOracle Exadataを導入することです。I/O性能が本当に一桁違うので、現行システムのI/O状況があまり分かっていなくてもそこがボトルネックになることはないでしょう。ただEngineered Systemに任せきりになって、いつの間にか自社の技術力がなくなっていたということのないようにしたいものです。
2012-07-23 データベース負荷テストツールまとめ(5)

というわけで、JPOUG> SET EVENTS 20120721 | Japan Oracle User Groupに参加して発表をしてきました。通常の勉強会と比べて発表者と聴講者の一体感を増すための工夫がなされていて、とても良かったと思います。有限コーヒーかと思ったら無限ビールだったのも驚きです。JPOUGの運営メンバのみなさま、会場を提供してくださった日本オラクルのみなさま、当日お越しいただいたみなさま、どうもありがとうございました。
私のセッションでは、データベース負荷テストツールまとめ(5)と題して過去4回分のまとめと自作ツールの紹介をさせていただきました。JdbcRunnerはOracle Database、MySQLとPostgreSQLの間でTPC-BとTPC-Cの性能比較ができる唯一のオープンソースソフトウェアですので、いろいろ試してみていただければと思います。試した結果をブログなどで公開していただけると作者が喜びます。
プレゼンテーション資料からリンクしているウェブサイトの一覧です。
- データベース負荷テストツールまとめ(1) - SH2の日記
- データベース負荷テストツールまとめ(2) - SH2の日記
- データベース負荷テストツールまとめ(3) - SH2の日記
- データベース負荷テストツールまとめ(4) - SH2の日記
- JdbcRunner - 汎用データベース負荷テストツール - dbstudy.info
- ダウンロード: HAクラスタリングソフト CLUSTERPRO X | NEC
HP ProLiant Server + InfiniBand + IOアクセラレータ + CLUSTERPRO 検証報告 (PDF) - Javaの理論と実践: 動的コンパイルとパフォーマンス測定 - IBM developerWorks
- RHEL6のマルチキューで効率的なネットワークの負荷分散 - テックセンター Blog - Dell コミュニティ
- Bug ID: 4385444 (spec) InterruptedIOException should not be required by platform specification (sol)
- sh2/jdbcrunner - GitHub
- MySQL Connector/Jにおける大量INSERTのチューニング - SH2の日記
- mozilla/rhino at invokedynamic - GitHub
- JavaVMをJavaScript/ECMAScript5対応にする「Nashorn」、JDK 8でリリース。Node.jsとの連係をオラクルがデモ - Publickey
Java並行処理プログラミング
一冊だけ書籍の紹介をさせてください。
Java並行処理プログラミング ―その「基盤」と「最新API」を究める―
- 作者: Brian Goetz,Joshua Bloch,Doug Lea
- 出版社/メーカー: ソフトバンククリエイティブ
- 発売日: 2006/11/22
- メディア: 単行本
- 購入: 30人 クリック: 442回
- この商品を含むブログ (169件) を見る
この本はJavaでマルチスレッドプログラミングをするなら必ず読んでおくべきと言われている名著なのですが、2006年に出版されたあとしばらく品切れで入手困難な状態が続いていました。私はこの本をずっと探し続けていて、市の図書館でようやく見つけたときは本当にうれしかったです。この本は素晴らしい本で、どのくらい素晴らしいかと言うと、図書館で借りて読んだあと途中まで作っていたJdbcRunnerのソースコードを全部捨てて書き直したくらいです。この本が手に入らなかったらJdbcRunnerは完成しませんでした。2009年に復刊ドットコムでめでたく復刊され、今では普通に手に入れることができます。
2012-07-17 MySQL 5.6におけるsync_binlog=1の改善について&勉強会のお知らせ

2012年6月のエントリの続きです。前回は同期レプリケーションによるネットワーク遅延のある環境において、MySQLの性能がどの程度低下するのかということを確認しました。その中でも特にsync_binlogが1に設定されている場合、性能が大きく低下するということが分かりました。参考としてAmazon RDSのマルチAZデプロイメントにおいては、性能と信頼性のトレードオフを考慮した結果、sync_binlogがデフォルトで0に設定されているということを調査しました。
タイトルでネタバレしていますが、MySQLの次期バージョン、MySQL 5.6でこのsync_binlog=1の性能が大きく改善します。前回と同じ負荷テストをMySQL 5.5.25からMySQL 5.6.6-labsに差し替えて行った結果を、以下に示します。
前回のMySQL 5.5.25と異なり、sync_binlog=1においても多重度に応じたスループットの伸びが確認できると思います。代表的なところで往復遅延時間(Round Trip Time、以下RTT)が4ミリ秒の場合におけるMySQL 5.5.25、5.6.6-labsの結果を並べてみると、以下のようになります。
素晴らしいですね。
バイナリログのグループ・コミット
この性能改善は、バイナリログに対するグループ・コミットという新機能によってもたらされています。グループ・コミットとは、複数のクライアントからのコミット要求をまとめて処理する機能です。
グループ・コミットがない場合、複数のクライアントからのコミット要求は以下のように順番に処理されます。DBMSとしてACIDを満たすため、バイナリログへの書き込みができるスレッドは同時に一つだけとなっています。
今回の環境はディスクに同期書き込み(pwrite(2)+fsync(2))をするところでDRBDによるネットワーク遅延の影響を受け、ここにRTT分の時間が加算されます。RTT 4ミリ秒の場合はコミットに最低でも4ミリ秒かかるため、どんなに頑張っても1秒間に250回しかコミットできないということになります。実際にはこれに合わせてInnoDBログにも同期書き込みをする必要があるため、1秒間にコミットできる回数はさらに減ります。
グループ・コミットがある場合、複数のクライアントからのコミット要求は以下のようにまとめて処理されます。
先に来たコミット要求を処理している間に次のコミット要求が来た場合、ディスクへの同期書き込みを両方まとめて行います。バイナリログへの書き込みができるスレッドが同時に一つだけという点は変わらないのですが、一度のfsync(2)で複数のコミット要求を処理することにより、1秒間にコミットできる回数を大幅に増やすことができます。
グループ・コミットのこれまでの経緯
グループ・コミットはACIDを備えたDBMSであれば基本的にサポートしていることが望ましい機能です。本機能がMySQL 5.6でようやくサポートされるにいたった経緯を確認しておきしょう。
まずInnoDBストレージエンジンの方ですが、こちらは2001年にリリースされたMySQL 3.23の時点ですでにグループ・コミットをサポートしていました。
2005年にリリースされたMySQL 5.0において、バイナリログとInnoDBログの整合性を取るための機能改善が行われました。それまではMySQLサーバがクラッシュした際にタイミングによってバイナリログとInnoDBログの整合性が取れなくなり、レプリケーションスレーブが壊れてしまうことがありました。この機能改善はInnoDB側に2フェーズコミットを行わせるという方針で実装されたのですが、これによってバイナリログ有効時にInnoDBのグループ・コミットが効かなくなるという新たな問題が引き起こされました。
2010年にリリースされたMySQL 5.1+InnoDB Pluginにおいて、sync_binlogが0の場合に限り再びInnoDBのグループ・コミットが効くようになりました。sync_binlogが0の場合は本来の目的であるバイナリログとInnoDBログの整合性を取ることはできないものの、レプリケーションを活用したスケールアウト構成においてマスタの性能を大幅に上げることができるようになりました。
同じく2010年にリリースされたMySQL 5.5において、準同期レプリケーションが導入されました。準同期レプリケーションはグループ・コミットと直接の関係はないのですが、これとMHAを組み合わせることでsync_binlogが0の場合でもマスタ障害によるデータロストやレプリケーションスレーブの不整合を防ぐことができるようになりました。ここまできてようやく性能と信頼性の両方を担保することができるようになったのです。
MySQL 5.6は現在開発マイルストーンが5.6.5まで、実験版が5.6.6-labsまでリリースされています。この5.6.6-labsにおいてついにバイナリログのグループ・コミットが実装されたという次第です。バイナリログのグループ・コミットによってsync_binlog=1における性能が大幅に改善され、共有ストレージやDRBDを用いたクラスタ構成においても、レプリケーションと組み合わせた際の性能と信頼性を両方担保することができるようになります。Amazon RDSでレプリケーションスレーブが壊れて困ったことのある方は、MySQL 5.6の正式版がリリースされてAmazon RDSが対応するまでの辛抱です。
- MySQL :: MySQL 5.6 Replication - Enabling the Next Generation of Web & Cloud Services
- MySQL Musings: Binary Log Group Commit in MySQL 5.6
他のDBMSにおけるグループ・コミットのサポート状況
Oracle Databaseははるか昔からグループ・コミットをサポートしていました。ウェブで調べられる範囲では、Oracle 7の時点ですでにサポートされていたことを以下のマニュアルから確認することができます。Oracle 7がリリースされたのは1992年で、いまから20年前のことです。PC-9801FAが初めてi486SXを搭載し、Windows 3.1がリリースされ、Linuxカーネルが0.96だったころの話です。
PostgreSQLは2001年にリリースされたPostgreSQL 7.1でWAL(Write Ahead Logging)が導入され、このときにグループ・コミットもサポートされました。しかし内部の排他制御の設計が適切でなく、これまであまり性能が出ていませんでした。commit_delayというパラメータによってグループ・コミットを発生しやすくすることもできるのですが、こちらの効果も限定的なものでした。
PostgreSQLは次のPostgreSQL 9.2でグループ・コミットの設計が見直され、きちんと性能が出るように改善が図られています。PostgreSQL 9.2は現在ベータ2までリリースされており、順調に行けば2012年中に正式版がリリースされる見込みです。
Oracle Databaseから遅れること20年、MySQL、PostgreSQLもようやく…といったところです。
勉強会のお知らせ
話は変わって、2012年7月21日(土)にJPOUG、日本オラクルユーザ会主催のイベントが催されます。
Oracle OpenWorld Unconferenceに引き続きセッション枠をいただいたので、私は「データベース負荷テストツールまとめ(5)」と題して今回のエントリなどで使ったツールの紹介をする予定です。事前に過去4回分をざっと読み返していただくと、当日の話が分かりやすくなると思います。DBサーバのハードウェア、ソフトウェアを調査される方やクラウドサービスの性能評価をされる方、それからパフォーマンス・チューニングの教材を探している方などにおすすめのセッションです。
イベントとしてはOracle Databaseの話が中心となりますが、木村さんがMySQLの話、小田さんと林さんがDBエンジニアのキャリアについての話をされるなど、Oracle Database以外の話もいろいろ聞けると思います。オラクル青山センターですのでコーヒーもたくさん飲めます。
2012-05-07 dstat2graphs - dstatのログをグラフ化するツール

dstatが便利ですね。
私は特に--outputオプションでCSV形式のログファイルを出力できるところが気に入っています。本番環境ではきちんとした監視ツールを使うと思いますが、開発・検証環境で手早くOSリソース情報を可視化できるので重宝しています。
それでもExcelやCalcでグラフを描くというのは何度も繰り返すと面倒なもので、
dstatのCSVファイルをアップロードするとグラフを描いてくれるゆとりウェブサービスないかな
探したのですが見つからなかったので、連休を利用して作ってみました。
いくつか注意点があります。
- dstat -tvfn --output log.csv 1しか受け付けないという割り切った作りです。
- dbstudy.infoで提供しているサービスには、ファイルサイズ4MBまでの制限を設けています。
- アクセス制御機能はありませんので、機密性の高いデータはアップロードしないでください。
ファイルサイズや機密性を気にせず使いたい場合は、GitHubからソースファイルをダウンロードしてご利用ください。修正済みBSDライセンスです。
グラフの描画にはRRDtoolとPerlのRRDsモジュールを利用しています。これらのパッケージは、Red Hat Enterprise Linux 6系ではディストリビューションに付属しています(rrdtool、rrdtool-perl)。Red Hat Enterprise Linux 5系の場合はEPELリポジトリからインストールすることができます。
最初はGD::Graphで簡単に仕上げるつもりだったのですが、今回まとまった時間が取れたのでいろいろ勉強してみました。
- PHPの基礎
- jQueryの基礎
- Twitter Bootstrapの基礎
- RRDtoolの使い方
- PerlのRRDsモジュールの使い方
- GitHubの使い方
RRDtoolについては、以下のウェブサイトの資料が大変役に立ちました。どうもありがとうございます。
jQueryとTwitter Bootstrapについては、ドットインストールという学習サイトが大変役に立ちました。
これくらいの小さなツールは作っていて楽しいですね。



















私もdstatなどのグラフ化ができないものかと考え、こちらのサイトに行き着きました。
因みにプログラムはからきしで、sh2さんの作られたこちらのスクリプトを教材にしようと考えたのですが、
スクリプトがどうも上手く動作しません。
用意したスクリプトやjQuery、Twitter Bootstrapは最新のものではなく、
現在動作中のhttp://dbstudy.info/dstat2graphs/配下から頂戴いたしました。
サーバ環境は下記になります。
CentOS 6.3
Apache 2.2.15(yumインストール)
PHP 5.3.3
CGIの動作確認はOKで、apacheのエラーログにも致命的なエラーは出ていません。
以下に階層構造を記します。
/dev/shm/dstat2graphs/
<Docroot>/cgi-bin/dstat2graphs.php
/index.html
/dstat2graphs.pl
/css/bootstrap.css
/bootstrap.min.css
/bootstrap-responsive.css
/bootstrap-responsive.min.css
/img/glyphicons-halflings.png
/glyphicons-halflings-white.png
/js/bootstrap.js
/bootstrap.min.js
/jquery-1.7.2.min.js
/reports/css/(同上)
/img/(同上)
/js/(同上)
/index.html
ファイルの設定はすべて
所有者:グループ apache:apache
パーミッション 777
となっております。
README_ja.mdの手順に従って、rrdtool、rrdtool-perl、perl-Archive-Zip、perl-HTML-Parserもインストール済みです。
上記の状態でファイルをアップロードしようとすると、「Failed to upload file.」と表示されてしまう状態です。
問題点等が判りましたらご教授いただけないでしょうか。
宜しくお願いいたします。
/dev/shm/dstat2graphs/
<Docroot>/cgi-bin
(以下 /cgi-bin/ 配下)
/dstat2graphs.php
/index.html
/dstat2graphs.pl
/css/bootstrap.css
/css/bootstrap.min.css
/css/bootstrap-responsive.css
/css/bootstrap-responsive.min.css
/img/glyphicons-halflings.png
/img/glyphicons-halflings-white.png
/js/bootstrap.js
/js/bootstrap.min.js
/js/jquery-1.7.2.min.js
/reports/css/(同上)
/reports/img/(同上)
/reports/js/(同上)
/reports/index.html
dstat2graphsにはPerlのファイルがありますが、これはCGIとして動作するプログラムではありません。
/var/www/cgi-bin/はCGI用の特別なディレクトリなので、ここでは動かないと思います。
試してみたところScientific Linux 6.3の初期設定ではそもそもindex.htmlが表示できませんでした。
/var/www/html/test/などに場所を変更して試してみてください。
お返事ありがとうございます。
本件、無事動作させることができました。
原因はGitHubからソースファイルを「右クリ→ダウンロード」で取得したことでした。
そのせいで、ソースにGitHubの記述が入り、おかしな挙動をしていたようです。
単純にGitHubの使い方を判っていないだけのことでした、お騒がせいたしましたmm
早速こちらを教材に勉強させていただこうと思います。
このたびは本当にありがとうございました。