Submit Search
Upload
HackのAsyncCurlで死んだ話
•
0 likes
•
371 views
K
Kenjiro Kubota
Follow
PHPerKaigi#2018 LT
Read less
Read more
Engineering
Report
Share
Report
Share
1 of 23
Download now
Download to read offline
Recommended
HSP3でgame.rb
HSP3でgame.rb
NobuhiroKato5
Vivado hlsのシミュレーションとhlsストリーム
Vivado hlsのシミュレーションとhlsストリーム
marsee101
高位合成ツールVivado hlsのopen cv対応
高位合成ツールVivado hlsのopen cv対応
marsee101
Introducing hhvm hack-async
Introducing hhvm hack-async
Kenjiro Kubota
PHPべんちまーく
PHPべんちまーく
chichi1091
FuelPHP活用事例
FuelPHP活用事例
Yusuke Naka
PHP、おまえだったのか。 いつもHTTPメッセージを 運んでくれたのは。
PHP、おまえだったのか。 いつもHTTPメッセージを 運んでくれたのは。
sasezaki
HHVM/Hackを本番投入した話
HHVM/Hackを本番投入した話
Kenjiro Kubota
Recommended
HSP3でgame.rb
HSP3でgame.rb
NobuhiroKato5
Vivado hlsのシミュレーションとhlsストリーム
Vivado hlsのシミュレーションとhlsストリーム
marsee101
高位合成ツールVivado hlsのopen cv対応
高位合成ツールVivado hlsのopen cv対応
marsee101
Introducing hhvm hack-async
Introducing hhvm hack-async
Kenjiro Kubota
PHPべんちまーく
PHPべんちまーく
chichi1091
FuelPHP活用事例
FuelPHP活用事例
Yusuke Naka
PHP、おまえだったのか。 いつもHTTPメッセージを 運んでくれたのは。
PHP、おまえだったのか。 いつもHTTPメッセージを 運んでくれたのは。
sasezaki
HHVM/Hackを本番投入した話
HHVM/Hackを本番投入した話
Kenjiro Kubota
いまどき(これから)のPHP開発
いまどき(これから)のPHP開発
Kenjiro Kubota
アイスタイル特設サイトにおけるVue.js導入事例(再演)
アイスタイル特設サイトにおけるVue.js導入事例(再演)
Kenjiro Kubota
gRPC入門
gRPC入門
Kenjiro Kubota
アイスタイル特設サイトにおけるVue.jsの導入事例
アイスタイル特設サイトにおけるVue.jsの導入事例
Kenjiro Kubota
Akkaとは。アクターモデル とは。
Akkaとは。アクターモデル とは。
Kenjiro Kubota
フロントエンドエンジニアが知るべきFirebaseの世界
フロントエンドエンジニアが知るべきFirebaseの世界
Kenjiro Kubota
PHP,Go,Elasticsearchによる、@cosmeを5倍速くする取り組み
PHP,Go,Elasticsearchによる、@cosmeを5倍速くする取り組み
Kenjiro Kubota
カメラを利用したアプリを作って約1000人で遊んだ話
カメラを利用したアプリを作って約1000人で遊んだ話
Kenjiro Kubota
中・大規模でLaravelを導入するTips
中・大規模でLaravelを導入するTips
Kenjiro Kubota
FirebaseとNuxtでLPを作って見た
FirebaseとNuxtでLPを作って見た
Kenjiro Kubota
introducing vue-wait-component
introducing vue-wait-component
Kenjiro Kubota
LaravelでAPI定義を管理する
LaravelでAPI定義を管理する
Kenjiro Kubota
2017: A CSS Design Odyssey
2017: A CSS Design Odyssey
Kenjiro Kubota
Responsableを使ったadr実装
Responsableを使ったadr実装
Kenjiro Kubota
土日でLineみたいなチャット作ってきた!
土日でLineみたいなチャット作ってきた!
Kenjiro Kubota
Viewを活用して複雑化と戦う
Viewを活用して複雑化と戦う
Kenjiro Kubota
Laravel aspectで関心の分離
Laravel aspectで関心の分離
Kenjiro Kubota
Laravelでfacadeを使わない開発
Laravelでfacadeを使わない開発
Kenjiro Kubota
More Related Content
More from Kenjiro Kubota
いまどき(これから)のPHP開発
いまどき(これから)のPHP開発
Kenjiro Kubota
アイスタイル特設サイトにおけるVue.js導入事例(再演)
アイスタイル特設サイトにおけるVue.js導入事例(再演)
Kenjiro Kubota
gRPC入門
gRPC入門
Kenjiro Kubota
アイスタイル特設サイトにおけるVue.jsの導入事例
アイスタイル特設サイトにおけるVue.jsの導入事例
Kenjiro Kubota
Akkaとは。アクターモデル とは。
Akkaとは。アクターモデル とは。
Kenjiro Kubota
フロントエンドエンジニアが知るべきFirebaseの世界
フロントエンドエンジニアが知るべきFirebaseの世界
Kenjiro Kubota
PHP,Go,Elasticsearchによる、@cosmeを5倍速くする取り組み
PHP,Go,Elasticsearchによる、@cosmeを5倍速くする取り組み
Kenjiro Kubota
カメラを利用したアプリを作って約1000人で遊んだ話
カメラを利用したアプリを作って約1000人で遊んだ話
Kenjiro Kubota
中・大規模でLaravelを導入するTips
中・大規模でLaravelを導入するTips
Kenjiro Kubota
FirebaseとNuxtでLPを作って見た
FirebaseとNuxtでLPを作って見た
Kenjiro Kubota
introducing vue-wait-component
introducing vue-wait-component
Kenjiro Kubota
LaravelでAPI定義を管理する
LaravelでAPI定義を管理する
Kenjiro Kubota
2017: A CSS Design Odyssey
2017: A CSS Design Odyssey
Kenjiro Kubota
Responsableを使ったadr実装
Responsableを使ったadr実装
Kenjiro Kubota
土日でLineみたいなチャット作ってきた!
土日でLineみたいなチャット作ってきた!
Kenjiro Kubota
Viewを活用して複雑化と戦う
Viewを活用して複雑化と戦う
Kenjiro Kubota
Laravel aspectで関心の分離
Laravel aspectで関心の分離
Kenjiro Kubota
Laravelでfacadeを使わない開発
Laravelでfacadeを使わない開発
Kenjiro Kubota
More from Kenjiro Kubota
(18)
いまどき(これから)のPHP開発
いまどき(これから)のPHP開発
アイスタイル特設サイトにおけるVue.js導入事例(再演)
アイスタイル特設サイトにおけるVue.js導入事例(再演)
gRPC入門
gRPC入門
アイスタイル特設サイトにおけるVue.jsの導入事例
アイスタイル特設サイトにおけるVue.jsの導入事例
Akkaとは。アクターモデル とは。
Akkaとは。アクターモデル とは。
フロントエンドエンジニアが知るべきFirebaseの世界
フロントエンドエンジニアが知るべきFirebaseの世界
PHP,Go,Elasticsearchによる、@cosmeを5倍速くする取り組み
PHP,Go,Elasticsearchによる、@cosmeを5倍速くする取り組み
カメラを利用したアプリを作って約1000人で遊んだ話
カメラを利用したアプリを作って約1000人で遊んだ話
中・大規模でLaravelを導入するTips
中・大規模でLaravelを導入するTips
FirebaseとNuxtでLPを作って見た
FirebaseとNuxtでLPを作って見た
introducing vue-wait-component
introducing vue-wait-component
LaravelでAPI定義を管理する
LaravelでAPI定義を管理する
2017: A CSS Design Odyssey
2017: A CSS Design Odyssey
Responsableを使ったadr実装
Responsableを使ったadr実装
土日でLineみたいなチャット作ってきた!
土日でLineみたいなチャット作ってきた!
Viewを活用して複雑化と戦う
Viewを活用して複雑化と戦う
Laravel aspectで関心の分離
Laravel aspectで関心の分離
Laravelでfacadeを使わない開発
Laravelでfacadeを使わない開発
HackのAsyncCurlで死んだ話
1.
HackのAsyncCurlで死んだ話 2017/10/08 PHPerKaigi LT@KenjiroKubota
2.
Pro le Kenjiro Kubota istyle.inc PHPer歴四年の小学生です! 好きなFWはLaravelとZend-Expressive
3.
Hackはもちろん知ってますよね
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.
アイスタイルではHHVM/Hackを採用しました
6.
リリース前のサービステストで HHVMが死にまくる事案が発生
7.
困ったこと HHVMが出力するerror.logが全く参考にならない 指定されたスタックトレースログもCore Dump Abortしか出てない 特定のリクエスト、レスポンス時でのクラッシュではない ググったら「HHVMはたまに落ちるから死活監視で再起動」とか最 悪な解決方法しか紹介されてない
8.
おお HHVM!しんでしまうとは なにごとだ!
9.
ところでこのHack、並列処理ができるんです Hackはasync関数を使うことで協調的マルチタスキングを利用すること ができます。 I/Oやデータの取得処理のレイテンシ間に他の処理を行うといった仕組 み。
10.
HHAsiocurl_exec https://docs.hhvm.com/hack/reference/function/HH.Asio.curl_exec/
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.
題で書いてあるけど、 これがHHVM変死の原因でした
13.
どうなっていたのか HHAsiocurl_exec が内部で利用している curl_multi_await
という HHVM(C++)関数でレスポンスが遅いエンドポイントがある場合に Abortするバグがあった。 PHPのリクエスト、レスポンスの処理とは違い、HHVMではレスポン スを返した後もこの関数が実行され続けてしばらくすると落ちる挙動に なっていた このため、どのタイミングでHHVMがクラッシュするのかの把握が遅 れた・・・
14.
どうしたか
15.
諦めて並列じゃない curl_exec を使いました
16.
THE END
17.
嘘です終わりません。 一旦この状態でファーストリリースをしました。
18.
もちろんこの現象はすでにissueで報告されてました
19.
1/5に修正される c++で実装していた curl_multi_await をhack実装に変更
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.
だたし、現在リリースされているHHVM ver3.24.3にはまだこの 変更は取り込まれていませんでした。 (※3.25のブランチでは修正対応が入ってます) この問題に対処済みのHack用Curlライブラリ作ってあるので置いてお きます。 https://github.com/kubotak-is/hhcurl この修正を含めて再度リリース
22.
ー その後 現在ではHHVMはクラッシュすることなく元気な姿で走り回っていま す。(二ヶ月程度) ブログでHHVMがよく落ちると書いてる人、 HHAsiocurl_exec
が使われ ていないかご確認を! 色々ありましたが、HHVM/HackはPHPの強化版的な感じでもう少し型 を厳格にしたい、並列を楽に書きたいという願いを叶えてくれる良い言 語だと思います。 Try
23.
thanks:)
Download now