Upload
junichi-ishida
View
1.554
Download
4
Embed Size (px)
DESCRIPTION
PHPカンファレンス2014の懇親会飛び込みLTの時に慌ててつくった資料です。
Citation preview
ISUCONで予選落ちした話(HHVM対応)uzulla
このスライドはPHP Conference 2014の懇親会での飛び込みLTでの発表資料です。飛び込みLTがあるのしらなかったので、10分くらいでつくった資料ですので、雑な所や間違いがあったらすみません。一部が当日と変わっておりますが、ご了承下さい。
YAPC::Asia 2014• 自己紹介ですが、• Perlのカンファレンス• PHPの話をしてベストトーク賞をとりました!• でもPHPerです!
I ❤️PHP
ISUCON?• iikanjini speedup contest.
• http://isucon.net/
• お題のアプリを高速化する• AWSのm3.xlargeでうごけば何でもあり(予選は1台、本戦は3台(去年))
• 8時間で全部やりきるスプリントレース
出場しました• 若者二人と私• PHP(HHVMで)
• 予選落ちしました…
• 最終スコアは37500
• (足切りスコアは38000…
• こんな男の話です
予選突破したdekokunさん!!!たのみました
ぞ!!!
とはいえ• あとちょっとで本戦だったので、その話をします• HHVMだし
トピック• PHP
• HHVM + nginx
• memcached
• xhprof
• param tune
• phpstorm
HHVMを用意する• AmazonLinux
• コードからビルドすると3時間くらいかかってつらい
• 「Cent系にYumほしい」「そんなものはない」• 「3rdパーティーならあるぞ」>古い
PHPをHHVMで動くように修正する• サンプル実装はLimonadeで実装されていた
• static $message = nullとかを消した
• (globalとか希にあるので修正する
• (session_start()を消すなど
HHVMの調整• config.hdf(一部抜粋)Server { Type = fastcgi ThreadCount = 10 FileSocket = /tmp/hhvm.sock RequestTimeoutSeconds = 60 DnsCache { Enable = true TTL = 600 # in seconds }}
but ...• config.hdf is depricated
( Pail said. )(今さっき聞きました)
• いまならphp.iniでいける(らしい)• UNIX domain socket
• ポート枯渇対策として
• hhvm.server.gzip_compression_level = 0
• gzip をオフに(nginx のssiを使いたいので)• 「正しくオフにする方法がわからん」
nginx の調整worker_processes 8;worker_rlimit_nofile 100000;http{ keepalive_timeout 120; gzip off;}
• gzip はlocalhostから叩くベンチでは不要• (ログ系は全部コメントアウト(誤差に近い…)
mysqlにindexを張る• 省略!!!• 効果大• PHPの勉強よりMysqlの勉強をした方が性能がでますよ
mysqlはちゃんと永続接続を使う• PDO::ATTR_PERSISTENT => true
• 'mysql:host=...;dbname=hoge;charset=utf8'
• charset指定にいまだにset names utf8は無い
xhprofで見当をつける• HHVMには最初から入ってる最高
+function __xhprof_save() {+ $data = xhprof_disable();+ $runs = new XHProfRuns_Default();+ $run_id = $runs->save_run($data, 'bank');+ echo "<a href=\"http://***.***.***.***/xhprof/xhprof_html/index.php?run={$run_id}&source=bank\">xhprof Result</a>\n";+}++register_shutdown_function('__xhprof_save');++xhprof_enable();
memcached でキャッシュ• 普通にmemcached(拡張)はHHVMにはいってて便利• 特に考える事なし
• Memcache::pconnect()
• (ただし、十分に速いMysqlは十分に速い)
HHVMのmemcachedの罠• セッションに使えない• 自分でセッションハンドラ書く事に• 雑なサンプル
https://github.com/uzulla/php_memcache
apc関数• memcachedなくてもある程度いけるよね• HHVMには最初からはいってる、便利!• でも、使い込んだ事は無いです
パラメタチューニングnet.core.somaxconn=65535net.ipv4.tcp_tw_recycle = 1net.ipv4.tcp_tw_reuse = 1net.ipv4.tcp_fin_timeout = 30
ポート枯渇しますからね
闇のパラメタチューニングvm.dirty_background_ratio=10vm.dirty_ratio=30vm.dirty_expire_centisecs=200000vm.dirty_writeback_centisecs=50000
※そんなに効果はないぞ!
Mysqlパラメタチューニングinnodb_write_io_threads = 16innodb_read_io_threads = 16innodb_thread_concurrency = 32max_allowed_packet=300M
闇のMysqlパラメタチューニングinnodb_flush_log_at_trx_commit = 0innodb_flush_method=nosync
※そんなに効果はないぞ!
PHPStorm便利• めっちゃ急いで書いてる場合、• PHPStormがSyntaxErrorをバンバンあげてくれるので便利• これはかなり重要(ハマらないで済むんだよ!)• 本番サーバーのコードを直接操作もできる(sftp)
daemon化について• supervisord
• あるいはinit.d (今回こちらを採用
結果として• 私はダメでしたが、PHPで突破した人結構いる• 6 / 23チーム• PHP結構イケてるぞ?• (実際の所言語だけではない世界)
まとめ• HHVMは最初から色々エクステンションはいっていて便利• ただ、まだzmq(zeromq)とか、足りないものもちらほら• PHPだから勝てないという事はない• VarnishとMysql(SQL)の知見があれば勝てる…かもしれない
PHPの人も、もっとスピード求めましょう!• PHPの高速化の知見はあまり共有されていないような気が…
• 秘伝のタレとかを公開しましょう!• 是非!!• 他の言語にまけないようにがんばるぞい!
何故か?• 最初PHPは初期実装漏れしていた• 「PHPは遅い(勝てない」という間違った(?)イメージ• 「その幻想をぶちこわす!」• 頑張るぞー(今回予選落ちだけど)
• ところでreactPHP速くて面白いんですけど• だれか好きな人いますか??• 友達になってください!!
• twitter:uzulla
• ご静聴ありがとうございました!!!