Hatena::ブログ(Diary)

かみぽのメモ

2011-12-08

mysql-buildでいろんなバージョンのMySQLをインストールしたい!

| 23:56 |

これはMySQL Casual Advent Calendar 2011 - MySQL Casualの8日目の記事です!

UDFでFizzBuzz

id:sugyanさんがストアドプロシージャでFizzBuzzをやっていたのでMySQLのUDF(user-defined function)でもやってみました。

kamipo/mysql_fizzbuzz - GitHub

git clone git://github.com/kamipo/mysql_fizzbuzz.git
cd mysql_fizzbuzz
g++ -shared -fPIC -Wall -g mysql_fizzbuzz.cc -o mysql_fizzbuzz.so
cp mysql_fizzbuzz.so /usr/local/mysql/lib/mysql/plugin
mysql -u root -e "create function fizzbuzz returns string soname 'mysql_fizzbuzz.so'"
mysql -u root -NE -e "SELECT fizzbuzz(100)"
*************************** 1. row ***************************
1
2
Fizz
4
Buzz
Fizz
7
...

こんなカンジでUDFでもカジュアルにFizzBuzzできましたね!

本題

@さんと@さんとインストールスクリプトネタでかぶってるけど気にしない(+`ω´+)

最近はperlbrewとかrvmとかnvmとかで簡単に自分用のperlとかrubyとかnodeとかインストールできるじゃないですか。

そこでMySQLもそれと同じぐらいカジュアルにインストールしたいわけですよ。

それで今日書いてたのがkamipo/mysql-build - GitHubです。

とりあえずいまはsstephenson/ruby-build - GitHubのほとんどコピペなんですが

git clone git://github.com/kamipo/mysql-build.git
cd mysql-build

githubからcloneしてきてもらって

./bin/mysql-build --definitions
4.0.30
5.1.59
5.5.14-spider-2.27
5.5.18

インストールできるMySQLの一覧がみれるので

./bin/mysql-build -v 5.1.59 ~/opt/mysql/5.1.59

これだけでインストールできます!!

MySQL 5.5以降はビルドするのにcmakeが必要なんですが、あらかじめcmakeを入れておけば

./bin/mysql-build -v 5.5.18 ~/opt/mysql/5.5.18

こんなに簡単にインストールできます!!!!

じつはさっき知ったんですが最近のSpiderストレージエンジンはQ4MとHandlerSocketもバンドルされてるみたいじゃないですか。これも入れてみましょう。

./bin/mysql-build -v 5.5.14-spider-2.27 ~/opt/mysql/5.5.14-spider-2.27
...

BUILD FAILED

Inspect or clean up the working tree at /tmp/mysql-build.20111208231547.62780
Results logged to /tmp/mysql-build.20111208231547.62780.log

Last 10 log lines:
[ 93%] Building CXX object storage/spider/CMakeFiles/spider.dir/hs_client/config.cpp.o
[ 93%] Building CXX object storage/spider/CMakeFiles/spider.dir/hs_client/escape.cpp.o
[ 93%] Building CXX object storage/spider/CMakeFiles/spider.dir/hs_client/fatal.cpp.o
[ 93%] Building CXX object storage/spider/CMakeFiles/spider.dir/hs_client/hstcpcli.cpp.o
[ 94%] Building CXX object storage/spider/CMakeFiles/spider.dir/hs_client/socket.cpp.o
[ 94%] Building CXX object storage/spider/CMakeFiles/spider.dir/hs_client/string_util.cpp.o
Linking CXX shared module ha_spider.so
ld: warning: directory '/Users/kamipo/opt/mysql/5.5.14-spider-2.27/lib' following -L not found
[ 94%] Built target spider
make: *** [all] Error 2

ビルドに失敗しました!!ここはあきらめて@さんの一発でインストールできるスクリプトを使っておいてください!!

気を取り直してMySQL 4.0の最新バージョンのMySQL 4.0.30も入れてみましょう。

./bin/mysql-build -v 4.0.30 ~/opt/mysql/4.0.30
...

BUILD FAILED

Inspect or clean up the working tree at /tmp/mysql-build.20111208230555.14795
Results logged to /tmp/mysql-build.20111208230555.14795.log

Last 10 log lines:
longlong2str.s:123:suffix or operands invalid for `pop'
longlong2str.s:132:Unknown pseudo-op: .size
longlong2str.s:132:Rest of line ignored. 1st junk character valued 108 (l).
longlong2str.s:135:Unknown pseudo-op: .type
longlong2str.s:135:Rest of line ignored. 1st junk character valued 108 (l).
longlong2str.s:140:Unknown pseudo-op: .size
longlong2str.s:140:Rest of line ignored. 1st junk character valued 108 (l).
make[2]: *** [longlong2str-x86.o] Error 1
make[1]: *** [all-recursive] Error 1
make: *** [all] Error 2

またビルドに失敗しました!!MySQL 4.0のことは@さんに聞かないとよくわからないので今回はあきらめましょう!!

【追記】

(ビルドに失敗したのはMac OS X 10.6.8でのことで、Ubuntu 10.04ではどちらもビルド成功しました)

まとめ

mysql-buildでカジュアルにMySQLインストールしてみましょう!

エンジョイ!

2011-10-17

YAPC::Asia 2011 おつかれさまでした

| 22:50 |

YAPC::Asia 2011 おつかれさまでした!

今回は前夜祭のRejectConfと2日目のLTでトークをしてきました。

RejectConf

本当は難しいフレンド・タイムライン処理という話をしました。

この手の機能はWebのソーシャル系サービスなら必ずといっていいほど当たり前に実装されている機能で、小規模のサービスでも中規模のサービスでも程度の差こそあれ問題になり得ます。

効率的に実装されていない負荷の高い機能は、より多くの設備投資を必要にするし、サービスを提供する裏でより多くの人の労力を犠牲にしないと成り立たないので最悪です。

このトークを聴いてくれた人が「そういえばこういう問題があるんだっけな」と想像力を働かせられるきっかけになればうれしいなと思います。

LT

MySQLでMessagePackの中身を検索ということで、MySQLに構造化されたデータをシリアライズして突っ込むことはわりかしよくあるんじゃないかなと思うんですが、それをMySQL上で検索できると便利だよねということでkazuho/mysql_json - GitHubkamipo/mysql_msgpack - GitHubの紹介をしました。

完全にスベってたらしいですが、逆にスベってもいいんだと勇気を与えられたんじゃないですかね!

総括

YAPC::Asiaはサービス運用の話が多いのでカモフラージュされてるけど、そろそろ僕がPerlの話をまったくしていないのがバレそうなので次のYAPCでは「Perlプログラマのための」をタイトルに付けようと思いました!

2011-10-02

チューニンガソンに遅刻して思ったこと

00:40 |

朝からピングドラム観てる場合じゃなかった…。

前回のWordPressに引き続いて今回のMediaWikiも圧倒的なPHPCPUバウンドアプリケーションで、PHP 5.4をビルドした人が上位を独占でしたね。

僕はといえば、PHP 5.4ビルドしたら負けかなと思ってnginxのproxy_cacheで動的ページをキャッシュしようと試みてうまくいかず、デバッグしながらHeader unset Cache-ControlしたりHeader unset Expiresしたりしてブラウザからのアクセスキャッシュできるようになったけど、ベンチマークまわすとキャッシュが生成されないのをsquidとかも試してみたけど解決できず時間切れでした。

結果的にはまたPHP 5.4かよって感じですが、前回はともかく今回の課題はもう一度おなじ条件でやればまったく違う結果になる余地があるいい課題だったんではないかなと思います。

今回はまったく更新リクエストはこない参照だけのチューニングだったので、計測時に参照される100ページを静的なコンテンツとしてキャッシュすれば、最もよいスコアが出たはずです。みんな一度はキャッシュしようと考えたんじゃないでしょうか。

それを難しくしていたのが、参照される可能性があるページが約200万件ぐらいあるということと、MediaWikiが1req/secも出ないぐらいクソ遅いということです。なにも考えずに与えられた2つのインスタンスだけでキャッシュ生成しようとすると100万秒=11日以上かかります。もし参照される可能性があるページが1万件ぐらいしかなかったりMediaWikiが50req/secぐらい出てれば、もっと多くの人が全ページキャッシュしようと考えたはずで、PHP 5.4にしたから上位に入れましたとはならなかったんじゃないかなと思いました。

きっと何者にもなれない僕ですが、遅刻しないことが僕の生存戦略だと思って次回もがんばりたいと思います。エンジョイ!

2011-08-29

#isucon に参加してやったこと思ったこと

| 04:14 |

ISUCONに@と「チームやすべえ」で参加してきたので、その感想です。

ひと言でいうと、良くも悪くもみんな積み重ねてきたものが結果に出たのではないかなと思います。

最初のボトルネックとして用意されていたクソクエリチューニングは、二人ともDB寄りのエンジニアということもあって、クエリの意図をつかんだあとの対策はツーカーでいい感じでした。

ボトルネックアプリに寄ってコア数でスケールする状態になったので、コア数も多く経路的にも有利なrevdbにもアプリを立てて、そっちに多くのリクエストを振るようにしました。細かいチューニングを省略すると、これだけやっただけで、たしか参加チームの中で最初に50000req/minを超えたと思います。

あとは後半、かなり良いスコアを出すチームがちらほら出てきて、このアーキテクチャだと優勝できないと気づいて、キャッシュしてDBアクセスレンダリングのコストを抑えようとしたけど、実装が間に合わずスコアを落としたままフィニッシュでした。

終わってみて、失敗したなーと思ったのが

  • キャッシュしたら負けかなと(ちょっと)思ってた
  • 特別賞の100000req/minを実現できるアーキテクチャについてちゃんと考察してなかった

日頃クエリチューニングをしていて、まともなクエリを書けばキャッシュなどせずともアプリは十分速いという感覚を持っていて、良くも悪くもそれが出ちゃったなーというのと

特別賞として100000req/minというスコアが実現可能なラインとして提示されてたのに、それを実現できるアーキテクチャについて考察できてなかったのは、もろに結果に出たと思いました。

あとやっぱみんなコンテストに慣れてないってのもあったんだと思うけど、けっこうなチームが最終的にスコアを落としてたと思う。

あと記事とサイドバーのライフサイクルが違うからESIとかSSIで記事とサイドバーを分けてキャッシュできるといい感じなのはわかってたんだけど、ESIもSSIも実際に使ったことがなかったから動かせなかったときのタイムロスが怖くて選択できなかったんで(キャッシュしたら負けかなと思ってたせいで時間もうなかった)、ここでも積み重ねてきたものの差が出たところなんじゃないかと思った。

この教訓は今後に活かしていきたい。

まとめ

最後に、今回素晴らしいイベントを開催してくださったlivedoor様ありがとうございます!

次回は、ISUCON合宿やりたいですね。

2011-08-16

ext4でSSDのTrimコマンドをつかう

| 18:53 |

SSDはNANDフラッシュメモリの上書きができないという特性上、空き領域が少なくなると性能が落ちてくるし、以下略*1なわけですが、Trimコマンドで論理的に削除された領域をSSDに伝えることで性能の劣化を抑制する効果が期待できる。

ext4ファイルシステムでTrimコマンドを有効にするには、discardオプションをマウント時に指定するとよいです。

sudo mount -t ext4 -o discard /dev/sdb1 /mnt

これでめでたしめでたしと思いきや、ext3からext4にするとなんかえらい書き込み性能が落ちてて、これはどうやらext4ではデフォルトでライトバリアが有効になってるのが要因ぽいので、ext3だったころとおなじ感じで使うにはライトバリアを無効にする必要があります。

sudo mount -t ext4 -o discard,barrier=0 /dev/sdb1 /mnt

これでext3だったころの性能は戻ってきますが、以下略*2です。

参考

*1:彼女と別れることになる

*2:彼女は戻ってきません