サバフェス でやったこと 続き
5日目
なんとなくLBが次はボトルネックになっているような気がしてきました。
そりゃNATしてんだからそうか、ってことでDSR構成頑張ってみよう、と再挑戦。
ここで「そういやiptablesで出来た気がする」ってようやく存在を思い出しました。
[bash]
# リアルサーバ側
$ iptables -t nat -A PREROUTING -d 10.2.1.185 -j REDIRECT
[/bash]
NAT構成時の設定は消してます。
そういえばunix socketが早いとか聞いたことが…。
php-fpmのlistenをunix socketに変更。
[bash]
$ vim /etc/php-fpm.d/www.conf
listen = /var/run/php-fpm/php-fpm.sock
[/bash]
nginxのfastcgi_passも書き換えます。
そしてここでPOSTが0件になることに気付きます。
キャッシュのせいでした。
ログのチェックとかしてみるとどうやら
/?p=5
とかにアクセスしてコメントの件数をチェックしている模様…。
nginxのHttpCoreModule
とか見て、$argsな設定を入れました。
「設定ファイルに変数ってアリなの…。」
って感じたのを覚えてます。
[bash]
$ vim /etc/nginx/conf.d/default.conf
# location / ディレクティブ内に以下追記
if ($args ~ p=5){
set $do_not_cache 1;
}
[/bash]
こんな感じです。最終的に $is_args != "" に変更しました。
あとkeepaliveの設定を入れてました。
この日はこれで終わり。
6日目
朝起きた時は1位でした。
結局数十分後に転落するんですけれど、嬉しかったような感じです。はい。
この日はMySQLの早さを上げるために、5.6.14の導入とか今更してました。
導入してたらphpとのバージョンがあわなくて〜とかってことで結局いろいろ変更することになりましたけど無事動きました。
この辺覚えてません。
php-mysqlがどうのこうの、みたいな感じで言われてたんですが、remi-testリポジトリくらいからyumしたらすんなりいったような?
mysqlはjaistからrpm持ってきて入れました。
mysqld
じゃなくて
mysql
なんですね。
試しに1000件ほどデータをinsertするスクリプト動かしてみましたけど、結構時間かかります。
7秒とか。
ってことで、もっと早くならないかな〜、って思いENGINEをMEMORYに変えたりしてみたんですけど、エラーのためそもそもテーブル作成すらされませんでした…。
The used table type doesn’t support BLOB/TEXT columns
こんな感じのエラー。
「しょうがない。tmpfs上に置こう」
という結論に。
tmpfs上に置くとサーバの電源が落ちるとデータが吹っ飛びますが、この際関係ありません!
[bash]
$ mv /var/lib/mysql /var/lib/mysql_back
$ chkconfig mysql off
$ vim /etc/rc.local
cp -rp /var/lib/mysql_back /dev/shm/mysql
service mysql start
[/bash]
これでオッケーのはず。
ってことで1000件insertするスクリプトを動かしてみると、
[bash]
$ time mysql -u root < testsql
real 0m0.149s
user 0m0.017s
sys 0m0.009s
[/bash]
くらいになりました。やったー。
この日はここで終わり。
7日目
DBは確かに早くなりましたけど、POSTの件数はたいして変わってませんでした。
php側がボトルネックですね。
どうにかしたいな〜、とか思ってたんですが、結局たいして何もできずに終わりました。
postをproxty介さずにphp-fpmに投げる、とか細かいところとか。
DBのメモリ周りの設定やらphp-fpmの起動プロセス数やらいろいろいじってみたんですが、そこまで早くならず…。
ethtoolとかもやってみたんですけどね…。
この日感じた力不足感は凄まじかったです。
終わり
やったことは大体以上です。
1週間インフラ構築、楽しかったです。新しい知識もたくさん得られました。
また、現在の知識で役に立つことも多かったのは素直に嬉しかったです。
できれば表彰式出ていろんな人と知識共有とか出来れば良かったんですが、
そもそも表彰式が海外なので無理そう…。
ってわけでいろいろな方のブログは拝見してます!
勉強になります。
反省点
今回スケールアウト、ってことで複数台のサーバ設定が必要でした。
しかし、学習コストを嫌って流行りのchefみたいなツールを使わなかった点はマズかったです。
某上位の方が使っていたansible
playbookとかなじみやすそうだな、って感じたのでその辺りが必要そう。
最終構成
サーバ台数
LB+Web * 1
Web * 3
DB * 1
ネットワーク経路
Router -> LB -> web -> Router