2012年12月23日日曜日

負荷対策・負荷分散の勉強会に行ってきた

2012年12月20日(木) に渋谷 ヒカリエで行われた負荷分散の勉強会に行って来ました。
そのメモです。

勉強会の募集ページはこちら。
好評で超満員だったので、第2回が開催されるそうです。
【負荷対策・負荷分散】勉強会!! ~原因究明から、対処法、実例発表まで~ ロードバランサ、DBチューニング、NoSQLと幅広くお話します!

以下メモ。
----------------------------------------

自社のサービスで、リスティング広告のレポートをまとめるのが主な負荷。
サーバの基本構成は。CentOS + Apache + PHP + MySQL。
そこに追加するのが、Memcached。


----------------------------------------

■MySQL
MyISAM でやってたけど、テーブル単位でロックされるから管理画面の表示ができない!
→InnoDB に変更して解消。なお、InnoDB は行単位でロックする仕組み。

でも、InnoDB には罠が!
ログファイルが膨大になって、レコードを DELETE してもログが更新されない。
→ ibdata をテーブル単位にして解消。
=> innodb_file_per_table

さらに、ログファイルのサイズやログのファイル数を設定して使いやすく。
→ innodb_log_file_size = 1364M
→ 
innodb_log_files_in_group = 3

なぜ、ログファイルが膨大になって問題になったのか。
ログは30日分を insert or update していた。
でも、update するにも一回 select してみないとあるかどうか分からない。
→ じゃあ、全部 DELETE して 全部 INSERT したらいいよ!
→ SQL増えた!ログも増えた!ログが!!

insert or update を判断する MySQL の便利な機能があるよ
=> INSERT ... ON DUPLICATE KEY UPDATE
指定された PrimaryKey があれば、UPDATE。なければ INSERT をしてくれる。

インデックスをはろう!はるとすごい速度が上がる!
はっただけで満足せずに、
・良く Where で使うワードを調査
・遅いクエリが無いか slow-query-log で確認
・インデックスがきちんと使われているか explain で検証
を忘れずに。

発行するSQLにコメントを付けてデバッグしやすくしてみる。
コメントに、どのサーバから来てどのセッションで実行された SQL なのかを残すと、show processlist や slow-query-log でわかりやすくなるよ。
ただし、コメントが毎回違うからクエリキャッシュ出来ない。
※これは素晴らしいアイディア!気付かなかった!

無理に正規化しない。
JOIN すると遅くなることもあるので、それだったら欲しい情報が全て1レコードにあったほうがいい。


----------------------------------------

■Memcached
導入に手間がかかるけど、静的でかつ頻繁にデータが変わらない SELECT 結果なら、毎回クエリを実行するのではなく、Memcached にキャッシュさせておいた方がいい。
メモリ上に展開されるので、HDD へのアクセスが発生する方法より格段に速くなる。
----------------------------------------

■PHP
フレームワークや、大量のソースを読み込む必要がある PHP を使ったサービスなら、アクセラレーターは導入した方がいい。
PHP は、実行する時にバックでコンパイルしている。
コンパイルするファイルが多ければ多いほど処理完了までに時間がかかる。
アクセラレーターはコンパイル結果をキャッシュしておくものなので、表示までの速度が速くなる。

改善のための解析用にログを残すのも大切。
どのページ(URL)で、誰が、どのくらいのメモリーを使って、何秒で表示まで終了したかを記録すると、わかりやすいよ。
----------------------------------------

■いろいろパワーアップするために
HDD より高速化したいので、Fusion-io が気になる。
DB に SSD を使ってみたけど、書き込み制限ですぐにダメになってしまった。

MySQL5.6 は、まだ正式リリースではないのだけど、InnoDB まわりが進化しているので早く実戦投入したい!

2012年12月21日金曜日

Linux サーバ上でエンコードされたメールを PHP でデコードして確認する方法



Postfix 設定に失敗して、送信されるはずだったメールがローカルユーザと勘違いされ、
でもローカルユーザにそんなやつはいないから root 宛に転送されていた。
mail コマンドで確認したら、メールの内容が残ってた!助かった!でも文字化けしてる…

=E3=81=93=E3=81=AE=E3=83=A1=E3=83=BC=E3=83=AB=E3=81=AF=E3=80=81 ...


http://d.hatena.ne.jp/minesouta/touch/searchdiary?word=*%5BPerl%5D&of=10
これは文字化け?いいえ、Quoted Printable です。
エンコードされているんですよ。
Perl でデコード出来ます。


http://www.plus-a.net/tools/text_tool/
試しにデコードをしてみよう。
お!読める文字になった!


http://pentan.info/php/quoted_printable.html
php でも Quoted Printable 文字列の変換することができるんですよ。
quoted_printable_decode っていう関数があるんです。


php がインストールされているからデコードできそうだ!
早速やってみよう!


メールが記録されているファイルを確認
# less /var/spool/mail/root


あったあった!
これらを別のファイルに書き出す
# cp /var/spool/mail/root /root/mails.txt


書きだしたファイルをデコードして別に保存する
# php -r "echo quoted_printable_decode( file_get_contents('mails.txt') );" > decode_mails.txt


サーバからダウンロードしてきて確認。
subject に余計な文字が紛れていて、所々おかしいけど、これで読めるようになった!