33
ISUCONで予選落ちした話 HHVM対応) uzulla

PHPカンファレンス2014の懇親会飛び込みLT資料

Embed Size (px)

DESCRIPTION

PHPカンファレンス2014の懇親会飛び込みLTの時に慌ててつくった資料です。

Citation preview

Page 1: PHPカンファレンス2014の懇親会飛び込みLT資料

ISUCONで予選落ちした話(HHVM対応)uzulla

Page 2: PHPカンファレンス2014の懇親会飛び込みLT資料

このスライドはPHP Conference 2014の懇親会での飛び込みLTでの発表資料です。飛び込みLTがあるのしらなかったので、10分くらいでつくった資料ですので、雑な所や間違いがあったらすみません。一部が当日と変わっておりますが、ご了承下さい。

Page 3: PHPカンファレンス2014の懇親会飛び込みLT資料

YAPC::Asia 2014• 自己紹介ですが、• Perlのカンファレンス• PHPの話をしてベストトーク賞をとりました!• でもPHPerです!

Page 4: PHPカンファレンス2014の懇親会飛び込みLT資料

I ❤️PHP

Page 5: PHPカンファレンス2014の懇親会飛び込みLT資料

ISUCON?• iikanjini speedup contest.

• http://isucon.net/

• お題のアプリを高速化する• AWSのm3.xlargeでうごけば何でもあり(予選は1台、本戦は3台(去年))

• 8時間で全部やりきるスプリントレース

Page 6: PHPカンファレンス2014の懇親会飛び込みLT資料

出場しました• 若者二人と私• PHP(HHVMで)

• 予選落ちしました…

• 最終スコアは37500

• (足切りスコアは38000…

• こんな男の話です

Page 7: PHPカンファレンス2014の懇親会飛び込みLT資料

予選突破したdekokunさん!!!たのみました

ぞ!!!

Page 8: PHPカンファレンス2014の懇親会飛び込みLT資料

とはいえ• あとちょっとで本戦だったので、その話をします• HHVMだし

Page 9: PHPカンファレンス2014の懇親会飛び込みLT資料

トピック• PHP

• HHVM + nginx

• memcached

• xhprof

• param tune

• phpstorm

Page 10: PHPカンファレンス2014の懇親会飛び込みLT資料

HHVMを用意する• AmazonLinux

• コードからビルドすると3時間くらいかかってつらい

• 「Cent系にYumほしい」「そんなものはない」• 「3rdパーティーならあるぞ」>古い

Page 11: PHPカンファレンス2014の懇親会飛び込みLT資料

PHPをHHVMで動くように修正する• サンプル実装はLimonadeで実装されていた

• static $message = nullとかを消した

• (globalとか希にあるので修正する

• (session_start()を消すなど

Page 12: PHPカンファレンス2014の懇親会飛び込みLT資料

HHVMの調整• config.hdf(一部抜粋)Server { Type = fastcgi ThreadCount = 10 FileSocket = /tmp/hhvm.sock RequestTimeoutSeconds = 60 DnsCache { Enable = true TTL = 600 # in seconds }}

Page 13: PHPカンファレンス2014の懇親会飛び込みLT資料

but ...• config.hdf is depricated

( Pail said. )(今さっき聞きました)

Page 14: PHPカンファレンス2014の懇親会飛び込みLT資料

• いまならphp.iniでいける(らしい)• UNIX domain socket

• ポート枯渇対策として

• hhvm.server.gzip_compression_level = 0

• gzip をオフに(nginx のssiを使いたいので)• 「正しくオフにする方法がわからん」

Page 15: PHPカンファレンス2014の懇親会飛び込みLT資料

nginx の調整worker_processes 8;worker_rlimit_nofile 100000;http{ keepalive_timeout 120; gzip off;}

• gzip はlocalhostから叩くベンチでは不要• (ログ系は全部コメントアウト(誤差に近い…)

Page 16: PHPカンファレンス2014の懇親会飛び込みLT資料

mysqlにindexを張る• 省略!!!• 効果大• PHPの勉強よりMysqlの勉強をした方が性能がでますよ

Page 17: PHPカンファレンス2014の懇親会飛び込みLT資料

mysqlはちゃんと永続接続を使う• PDO::ATTR_PERSISTENT => true

• 'mysql:host=...;dbname=hoge;charset=utf8'

• charset指定にいまだにset names utf8は無い

Page 18: PHPカンファレンス2014の懇親会飛び込みLT資料

xhprofで見当をつける• HHVMには最初から入ってる最高

Page 19: PHPカンファレンス2014の懇親会飛び込みLT資料

+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();

Page 20: PHPカンファレンス2014の懇親会飛び込みLT資料

memcached でキャッシュ• 普通にmemcached(拡張)はHHVMにはいってて便利• 特に考える事なし

• Memcache::pconnect()

• (ただし、十分に速いMysqlは十分に速い)

Page 21: PHPカンファレンス2014の懇親会飛び込みLT資料

HHVMのmemcachedの罠• セッションに使えない• 自分でセッションハンドラ書く事に• 雑なサンプル

https://github.com/uzulla/php_memcache

Page 22: PHPカンファレンス2014の懇親会飛び込みLT資料

apc関数• memcachedなくてもある程度いけるよね• HHVMには最初からはいってる、便利!• でも、使い込んだ事は無いです

Page 23: PHPカンファレンス2014の懇親会飛び込みLT資料

パラメタチューニングnet.core.somaxconn=65535net.ipv4.tcp_tw_recycle = 1net.ipv4.tcp_tw_reuse = 1net.ipv4.tcp_fin_timeout = 30

ポート枯渇しますからね

Page 24: PHPカンファレンス2014の懇親会飛び込みLT資料

闇のパラメタチューニングvm.dirty_background_ratio=10vm.dirty_ratio=30vm.dirty_expire_centisecs=200000vm.dirty_writeback_centisecs=50000

※そんなに効果はないぞ!

Page 25: PHPカンファレンス2014の懇親会飛び込みLT資料

Mysqlパラメタチューニングinnodb_write_io_threads = 16innodb_read_io_threads = 16innodb_thread_concurrency = 32max_allowed_packet=300M

Page 26: PHPカンファレンス2014の懇親会飛び込みLT資料

闇のMysqlパラメタチューニングinnodb_flush_log_at_trx_commit = 0innodb_flush_method=nosync

※そんなに効果はないぞ!

Page 27: PHPカンファレンス2014の懇親会飛び込みLT資料

PHPStorm便利• めっちゃ急いで書いてる場合、• PHPStormがSyntaxErrorをバンバンあげてくれるので便利• これはかなり重要(ハマらないで済むんだよ!)• 本番サーバーのコードを直接操作もできる(sftp)

Page 28: PHPカンファレンス2014の懇親会飛び込みLT資料

daemon化について• supervisord

• あるいはinit.d (今回こちらを採用

Page 29: PHPカンファレンス2014の懇親会飛び込みLT資料

結果として• 私はダメでしたが、PHPで突破した人結構いる• 6 / 23チーム• PHP結構イケてるぞ?• (実際の所言語だけではない世界)

Page 30: PHPカンファレンス2014の懇親会飛び込みLT資料

まとめ• HHVMは最初から色々エクステンションはいっていて便利• ただ、まだzmq(zeromq)とか、足りないものもちらほら• PHPだから勝てないという事はない• VarnishとMysql(SQL)の知見があれば勝てる…かもしれない

Page 31: PHPカンファレンス2014の懇親会飛び込みLT資料

PHPの人も、もっとスピード求めましょう!• PHPの高速化の知見はあまり共有されていないような気が…

• 秘伝のタレとかを公開しましょう!• 是非!!• 他の言語にまけないようにがんばるぞい!

Page 32: PHPカンファレンス2014の懇親会飛び込みLT資料

何故か?• 最初PHPは初期実装漏れしていた• 「PHPは遅い(勝てない」という間違った(?)イメージ• 「その幻想をぶちこわす!」• 頑張るぞー(今回予選落ちだけど)

Page 33: PHPカンファレンス2014の懇親会飛び込みLT資料

• ところでreactPHP速くて面白いんですけど• だれか好きな人いますか??• 友達になってください!!

• twitter:uzulla

• ご静聴ありがとうございました!!!