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つを高いレベルで両立すること
  • スタック

    • HHVM/Hack
    • golang
      • もとはgolang推しだが、WAFは良いのがなかったのでHHVMを採用

なぜHack?

  • アメンバーがPHPerだった
  • 社内に多く、採用もしやすい
  • 全く知らない言語よりもハードルが低く、なおかつチャレンジング
  • いいものを作るために
    • PHPよりパフォーマンスが高い
    • 型の安心感
  • どうしてもダメな時はPHPでやりなおそう

  • WAFはFuelPHP

    • 実は対応してない
    • 最近はHHVMはWAFサポートを諦めて、「各自対応してくれ」スタンスだとか
    • WAF自体はPHP製、触る部分から徐々にHack化できる

Hackの利点

開発ルールの統一

  • PHPでも書ける」を制限
    • Hackのやり方で統一
    • enum、タイプヒンティング、hh_clientによるチェック

hh_client

学習の導入

開発・運用して感じた点

  • 負荷が高いとクラッシュすることがある
    • Zabbixで監視→再起動をやっていた、最近は起きなくなった
  • INIでメモリ使用量を調節を上げて改善した
  • メールサーバのhostsを変えたタイミングで送るとエラーに
    • HHVMがhostsをキャッシュしているっぽい
  • PECLが使えない
    • LevelDBとの連携のExtensionが動かない、代わりにHNIというものがある
    • golangバッチで解決

CentOS6のサポート打ち切り

  • 開発途中に急に打ち切り
    • 速い代わりに大鉈を振られる
  • 全サーバCentOS7に変更

頻繁なアップデート

  • LTSでも48週間
  • MIIDASは3.12にup予定、3.11で検証中

困っていること

  • いい感じのエディタがない
  • Nuclid
    • ソースが多いと思い
  • PHPStorm
    • 補完が動くが、hh_clientがサポートされていない
  • Vim

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を使うとより強力に制約ができる
      • 型を意識した大規模サービス向けの仕様
    • コレクション
      • 5系
        • 内部的には順番付けされたマップ
        • キーは整数または文字列
      • 7系
      • Hack
        • 4つのコレクション
        • コレクションに型を指定
        • やはり、大規模サービス向けの仕様
    • Hackは3.11からNull合体演算子が使えるように
      • PHP7の取り込みが始まっている
    • Hackのみあるのがラムダ式、並列実行、Generics,Enum
    • PHP7のみあるのが致命的エラーのハンドリング、defineで配列が呼べる
    • hh_client
  • 品質重視で開発するならHack
  • スピード重視ならPHP7
    • 棲み分けできてる気がする
  • 個人的な印象
    • PHPはコミュニティによる実装が決まる
    • HackはFB社による主導
      • 正しく、実用性のある
  • hhvm.php7.all = 1
    • PHP7の後方互換のない機能を有効化する
    • HHVMは5/7両方サポート、5→7への移行にも使えるかもしれない
  • HackはPHPと同期して進化していく
  • 7リリース後も、まだまだHackを選ぶ価値はある
    • 大規模開発に効く
    • PHPの生態系に新たな選択肢があるのは素晴らしい