Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

HackのAsyncCurlで死んだ話

255 views

Published on

PHPerKaigi#2018 LT

Published in: Engineering
  • Be the first to comment

  • Be the first to like this

HackのAsyncCurlで死んだ話

  1. 1. HackのAsyncCurlで死んだ話 2017/10/08 PHPerKaigi LT@KenjiroKubota
  2. 2. Pro le Kenjiro Kubota istyle.inc PHPer歴四年の小学生です! 好きなFWはLaravelとZend-Expressive
  3. 3. Hackはもちろん知ってますよね
  4. 4. HHVM/Hack HipHop Virtual Machineは、JIT方式でPHP及びHackといったプログラ ミング言語ご実行する仮想環境。 HHVMで実行されるコードはJITコンパイルの過程でまず中還元のの HHBCに変換され、動的にx64の機械語へとコンパイル・最適化を行っ た上で実行される。 HHVMはFacebook社が開発しておりGithub上でPHP License、Zend Licenseのもと公開されている。(Wikipedia) 現行のLTSである3.24を最後にPHP5への互換が最後となり、今後は Hackのみが実行対象となることが明らかにされている。
  5. 5. アイスタイルではHHVM/Hackを採用しました
  6. 6. リリース前のサービステストで HHVMが死にまくる事案が発生
  7. 7. 困ったこと HHVMが出力するerror.logが全く参考にならない 指定されたスタックトレースログもCore Dump Abortしか出てない 特定のリクエスト、レスポンス時でのクラッシュではない ググったら「HHVMはたまに落ちるから死活監視で再起動」とか最 悪な解決方法しか紹介されてない
  8. 8. おお HHVM!しんでしまうとは なにごとだ!
  9. 9. ところでこのHack、並列処理ができるんです Hackはasync関数を使うことで協調的マルチタスキングを利用すること ができます。 I/Oやデータの取得処理のレイテンシ間に他の処理を行うといった仕組 み。
  10. 10. HHAsiocurl_exec https://docs.hhvm.com/hack/reference/function/HH.Asio.curl_exec/
  11. 11. <?hh namespace HackUserDocumentationAPIExamplesce; require __DIR__ . "/../../vendor/autoload.php"; async function get_curl_content(Set<string> $urls): Awaitable<Vector<string>> { $content = Vector {}; foreach ($urls as $url) { $str = await HHAsiocurl_exec($url); $content[] = substr($str, 0, 10); } return $content; } function run(): void { $urls = Set {'http://www.google.com', 'http://www.cnn.com'}; $content = HHAsiojoin(get_curl_content($urls)); var_dump($content); } run();
  12. 12. 題で書いてあるけど、 これがHHVM変死の原因でした
  13. 13. どうなっていたのか HHAsiocurl_exec が内部で利用している curl_multi_await という HHVM(C++)関数でレスポンスが遅いエンドポイントがある場合に Abortするバグがあった。 PHPのリクエスト、レスポンスの処理とは違い、HHVMではレスポン スを返した後もこの関数が実行され続けてしばらくすると落ちる挙動に なっていた このため、どのタイミングでHHVMがクラッシュするのかの把握が遅 れた・・・
  14. 14. どうしたか
  15. 15. 諦めて並列じゃない curl_exec を使いました
  16. 16. THE END
  17. 17. 嘘です終わりません。 一旦この状態でファーストリリースをしました。
  18. 18. もちろんこの現象はすでにissueで報告されてました
  19. 19. 1/5に修正される c++で実装していた curl_multi_await をhack実装に変更
  20. 20. 1/5に修正される c++で実装していた curl_multi_await をhack実装に変更 async function curl_multi_await( resource $mh, float $timeout = 1.0, ): Awaitable<int> { $finish_by = microtime(true) + $timeout; do { $result = curl_multi_select($mh, 0.0); if ($result !== 0) { return $result; } await HHAsiolater(); } while (microtime(true) < $finish_by); return 0; }
  21. 21. だたし、現在リリースされているHHVM ver3.24.3にはまだこの 変更は取り込まれていませんでした。 (※3.25のブランチでは修正対応が入ってます) この問題に対処済みのHack用Curlライブラリ作ってあるので置いてお きます。 https://github.com/kubotak-is/hhcurl この修正を含めて再度リリース
  22. 22. ー その後 現在ではHHVMはクラッシュすることなく元気な姿で走り回っていま す。(二ヶ月程度) ブログでHHVMがよく落ちると書いてる人、 HHAsiocurl_exec が使われ ていないかご確認を! 色々ありましたが、HHVM/HackはPHPの強化版的な感じでもう少し型 を厳格にしたい、並列を楽に書きたいという願いを叶えてくれる良い言 語だと思います。 Try
  23. 23. thanks:)

×