HHVM/Hack言語勉強会#1
HTML5 EXPERTSJP パフォーマンス・チューニング
- なかゆうすけ@HTML5 Experts.jp運営
中裕介
- @Tsukimikage
- JS/PHP/サーバインフラ構築
- HTML5Experts.jp 運営
実はあまりHHVMの話はしません...
- 実は置き換えるだけではハードル高くない
HTML5Experts.jp
- 会社の名前はほとんど出さずにやっているオウンドメディア
- 日本最高峰のWebエキスパートが記事を執筆
- 限りなく非営利
- 限りなく中立に
- すべての記事が永久保存版、を目指して
- 動機はいい技術者とのネットワーキングと、担当が好きでやってるから
- なぜこんなにパフォーマンスが悪いのか?
- 改善企画をやろう!自虐ネタはウケるよ、とスタート
- 竹洞陽一郎さんにアドバイスを仰ぐ
24/365 計測してますか?
- 場当たり的にやっても改善は意味が無い
- 継続してデータを取りつつ、本当の課題を導き出すのが重要
- 3ヶ月くらい計測していただきました
- ファースとバイトダウンロードタイム(TTFB)が遅い
- コンテンツが出始めるまでの時間
- 「50ms以内に収めろ」
- TCPを貼り直している
- パフォーマンストレンドが2秒を切れるように
- モバイル3Gからアクセスするとやはり時間がかかる
- モバイル向けの最適化
- スキャッタープロット(点グラフ)が下に固まってると安定的に配信できる
改善施策
- シェアボタン自作&キャッシュ
- 表示サイズより大きな画像の最適化
- マークアップの改善
- WordPressでキャッシュプログイン導入
- nginxの設定を変更しSafariで効くように改善
- php5-fpmからHHVMへ
- SPDY導入(SSLハンドシェイクのオーバーヘッドでパフォーマンスには悪影響が出ていた)
結果
- パフォーマンストレンド2秒未満達成
- スキャッタープロット改善(95パーセンタイルで2.5秒)
HHVMの導入
- ホスティングはCloundn FLAT Type, Cloudn RDB(MySQL SaaS)
- Ubuntu 14.04.4 LTS
- Nginx 1.8.0
- HHVM 3.11.0
- クリティカルなサービスではないのでわりとカジュアルに上がります
- Ansible, Serverspec, Jenkins
- 去年の5月頃は落ちまくっていたので、monitで落ちたら叩き起こすようにしていた
- 去年の夏頃からまったく落ちなくなりました
- バージョンは
apt-get update
で順調に上がっていっています
今後の課題
- 今後さらにガリガリチューニングしていくのか...?
- とはいえそれほど逼迫しているわけではない
HHVM/Hackでの転職サイト構築事例
- 吉元裕人
- 株式会社インテリジェンス/MIIDAS COMPANY所属
- サーバサイド・フロントエンド・インフラ
MIIDASをHackで構築した時の話
- 実際のエピソード多めで
- 入門
フロントエンド2名
- サーバサイド6名
- スマホアプリ2名
デザイン1名
'15 1月:仕様策定開始
- 3月 開発開始
7月 リリース
意識したこと
- 組織の成果とメンバーの挑戦、2つを高いレベルで両立すること
スタック
なぜHack?
- コアメンバーがPHPerだった
- 社内に多く、採用もしやすい
- 全く知らない言語よりもハードルが低く、なおかつチャレンジング
- いいものを作るために
- PHPよりパフォーマンスが高い
- 型の安心感
どうしてもダメな時はPHPでやりなおそう
WAFはFuelPHP
- 実は対応してない
- 最近はHHVMはWAFサポートを諦めて、「各自対応してくれ」スタンスだとか
- WAF自体はPHP製、触る部分から徐々にHack化できる
Hackの利点
開発ルールの統一
hh_client
学習の導入
- チュートリアル
- 言語仕様の確認
開発・運用して感じた点
- 負荷が高いとクラッシュすることがある
- Zabbixで監視→再起動をやっていた、最近は起きなくなった
- INIでメモリ使用量を調節を上げて改善した
- メールサーバのhostsを変えたタイミングで送るとエラーに
- HHVMがhostsをキャッシュしているっぽい
- PECLが使えない
- LevelDBとの連携のExtensionが動かない、代わりにHNIというものがある
- golangバッチで解決
CentOS6のサポート打ち切り
- 開発途中に急に打ち切り
- 速い代わりに大鉈を振られる
- 全サーバCentOS7に変更
頻繁なアップデート
- LTSでも48週間
- MIIDASは3.12にup予定、3.11で検証中
困っていること
HHVM on CentOS6 本番運用のうまみとつらみ
http://www.slideshare.net/K2ICE/hhvm-on-centos6
PHP7がリリースされた今、改めてHHVMについて考える
- 大谷祐司
- 株式会社インテリジェンス
- Hackの目指す所
- バグの無いコードを迅速に書けるように
- エンジニアがコーディング体験を楽しめる
- Hack/PHP7機能が比較
- タイプヒンティング
- functionの引数/戻り値がどの種別かを指定できる
- 7.0でようやくintやboolが使えるように
- PHP7のタイプヒンティングは2種類
- 弱い型指定: 自動キャスト
- 強い型指定: 厳密に比較
- Hackでは強い型指定のみがある
- mixedを使うと何でも入れられる
- null許容したいときは
?int
のように書く - Enumを使うとより強力に制約ができる
- 型を意識した大規模サービス向けの仕様
- コレクション
- Hackは3.11からNull合体演算子が使えるように
- PHP7の取り込みが始まっている
- Hackのみあるのがラムダ式、並列実行、Generics,Enum
- PHP7のみあるのが致命的エラーのハンドリング、defineで配列が呼べる
- hh_client
- タイプヒンティング
- 品質重視で開発するならHack
- スピード重視ならPHP7
- 棲み分けできてる気がする
- 個人的な印象
hhvm.php7.all = 1
- PHP7の後方互換のない機能を有効化する
- HHVMは5/7両方サポート、5→7への移行にも使えるかもしれない
- HackはPHPと同期して進化していく
- 7リリース後も、まだまだHackを選ぶ価値はある
- 大規模開発に効く
- PHPの生態系に新たな選択肢があるのは素晴らしい