SlideShare a Scribd company logo
1 of 23
Download to read offline
HackのAsyncCurlで死んだ話
2017/10/08 PHPerKaigi LT@KenjiroKubota
Pro le
Kenjiro Kubota
istyle.inc
PHPer歴四年の小学生です!
好きなFWはLaravelとZend-Expressive
Hackはもちろん知ってますよね
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のみが実行対象となることが明らかにされている。
アイスタイルではHHVM/Hackを採用しました
リリース前のサービステストで
HHVMが死にまくる事案が発生
困ったこと
HHVMが出力するerror.logが全く参考にならない
指定されたスタックトレースログもCore Dump Abortしか出てない
特定のリクエスト、レスポンス時でのクラッシュではない
ググったら「HHVMはたまに落ちるから死活監視で再起動」とか最
悪な解決方法しか紹介されてない
おお HHVM!しんでしまうとは なにごとだ!
ところでこのHack、並列処理ができるんです
Hackはasync関数を使うことで協調的マルチタスキングを利用すること
ができます。
I/Oやデータの取得処理のレイテンシ間に他の処理を行うといった仕組
み。
HHAsiocurl_exec
https://docs.hhvm.com/hack/reference/function/HH.Asio.curl_exec/
<?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();
題で書いてあるけど、
これがHHVM変死の原因でした
どうなっていたのか
HHAsiocurl_exec が内部で利用している curl_multi_await という
HHVM(C++)関数でレスポンスが遅いエンドポイントがある場合に
Abortするバグがあった。
PHPのリクエスト、レスポンスの処理とは違い、HHVMではレスポン
スを返した後もこの関数が実行され続けてしばらくすると落ちる挙動に
なっていた
このため、どのタイミングでHHVMがクラッシュするのかの把握が遅
れた・・・
どうしたか
諦めて並列じゃない curl_exec を使いました
THE END
嘘です終わりません。
一旦この状態でファーストリリースをしました。
もちろんこの現象はすでにissueで報告されてました
1/5に修正される
c++で実装していた curl_multi_await をhack実装に変更
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;
}
だたし、現在リリースされているHHVM ver3.24.3にはまだこの
変更は取り込まれていませんでした。
(※3.25のブランチでは修正対応が入ってます)
この問題に対処済みのHack用Curlライブラリ作ってあるので置いてお
きます。
https://github.com/kubotak-is/hhcurl
この修正を含めて再度リリース
ー その後
現在ではHHVMはクラッシュすることなく元気な姿で走り回っていま
す。(二ヶ月程度)
ブログでHHVMがよく落ちると書いてる人、 HHAsiocurl_exec が使われ
ていないかご確認を!
色々ありましたが、HHVM/HackはPHPの強化版的な感じでもう少し型
を厳格にしたい、並列を楽に書きたいという願いを叶えてくれる良い言
語だと思います。
Try
thanks:)

More Related Content

More from Kenjiro Kubota

いまどき(これから)のPHP開発
いまどき(これから)のPHP開発いまどき(これから)のPHP開発
いまどき(これから)のPHP開発Kenjiro Kubota
 
アイスタイル特設サイトにおけるVue.js導入事例(再演)
アイスタイル特設サイトにおけるVue.js導入事例(再演) アイスタイル特設サイトにおけるVue.js導入事例(再演)
アイスタイル特設サイトにおけるVue.js導入事例(再演) Kenjiro Kubota
 
アイスタイル特設サイトにおけるVue.jsの導入事例
アイスタイル特設サイトにおけるVue.jsの導入事例アイスタイル特設サイトにおけるVue.jsの導入事例
アイスタイル特設サイトにおけるVue.jsの導入事例Kenjiro Kubota
 
Akkaとは。アクターモデル とは。
Akkaとは。アクターモデル とは。Akkaとは。アクターモデル とは。
Akkaとは。アクターモデル とは。Kenjiro Kubota
 
フロントエンドエンジニアが知るべきFirebaseの世界
フロントエンドエンジニアが知るべきFirebaseの世界フロントエンドエンジニアが知るべきFirebaseの世界
フロントエンドエンジニアが知るべきFirebaseの世界Kenjiro Kubota
 
PHP,Go,Elasticsearchによる、@cosmeを5倍速くする取り組み
PHP,Go,Elasticsearchによる、@cosmeを5倍速くする取り組みPHP,Go,Elasticsearchによる、@cosmeを5倍速くする取り組み
PHP,Go,Elasticsearchによる、@cosmeを5倍速くする取り組みKenjiro Kubota
 
カメラを利用したアプリを作って約1000人で遊んだ話
カメラを利用したアプリを作って約1000人で遊んだ話カメラを利用したアプリを作って約1000人で遊んだ話
カメラを利用したアプリを作って約1000人で遊んだ話Kenjiro Kubota
 
中・大規模でLaravelを導入するTips
中・大規模でLaravelを導入するTips中・大規模でLaravelを導入するTips
中・大規模でLaravelを導入するTipsKenjiro Kubota
 
FirebaseとNuxtでLPを作って見た
FirebaseとNuxtでLPを作って見たFirebaseとNuxtでLPを作って見た
FirebaseとNuxtでLPを作って見たKenjiro Kubota
 
introducing vue-wait-component
introducing vue-wait-componentintroducing vue-wait-component
introducing vue-wait-componentKenjiro Kubota
 
LaravelでAPI定義を管理する
LaravelでAPI定義を管理するLaravelでAPI定義を管理する
LaravelでAPI定義を管理するKenjiro Kubota
 
2017: A CSS Design Odyssey
2017: A CSS Design Odyssey2017: A CSS Design Odyssey
2017: A CSS Design OdysseyKenjiro Kubota
 
Responsableを使ったadr実装
Responsableを使ったadr実装Responsableを使ったadr実装
Responsableを使ったadr実装Kenjiro Kubota
 
土日でLineみたいなチャット作ってきた!
土日でLineみたいなチャット作ってきた!土日でLineみたいなチャット作ってきた!
土日でLineみたいなチャット作ってきた!Kenjiro Kubota
 
Viewを活用して複雑化と戦う
Viewを活用して複雑化と戦うViewを活用して複雑化と戦う
Viewを活用して複雑化と戦うKenjiro Kubota
 
Laravel aspectで関心の分離
Laravel aspectで関心の分離Laravel aspectで関心の分離
Laravel aspectで関心の分離Kenjiro Kubota
 
Laravelでfacadeを使わない開発
Laravelでfacadeを使わない開発Laravelでfacadeを使わない開発
Laravelでfacadeを使わない開発Kenjiro Kubota
 

More from Kenjiro Kubota (18)

いまどき(これから)のPHP開発
いまどき(これから)のPHP開発いまどき(これから)のPHP開発
いまどき(これから)のPHP開発
 
アイスタイル特設サイトにおけるVue.js導入事例(再演)
アイスタイル特設サイトにおけるVue.js導入事例(再演) アイスタイル特設サイトにおけるVue.js導入事例(再演)
アイスタイル特設サイトにおけるVue.js導入事例(再演)
 
gRPC入門
gRPC入門gRPC入門
gRPC入門
 
アイスタイル特設サイトにおけるVue.jsの導入事例
アイスタイル特設サイトにおけるVue.jsの導入事例アイスタイル特設サイトにおけるVue.jsの導入事例
アイスタイル特設サイトにおけるVue.jsの導入事例
 
Akkaとは。アクターモデル とは。
Akkaとは。アクターモデル とは。Akkaとは。アクターモデル とは。
Akkaとは。アクターモデル とは。
 
フロントエンドエンジニアが知るべきFirebaseの世界
フロントエンドエンジニアが知るべきFirebaseの世界フロントエンドエンジニアが知るべきFirebaseの世界
フロントエンドエンジニアが知るべきFirebaseの世界
 
PHP,Go,Elasticsearchによる、@cosmeを5倍速くする取り組み
PHP,Go,Elasticsearchによる、@cosmeを5倍速くする取り組みPHP,Go,Elasticsearchによる、@cosmeを5倍速くする取り組み
PHP,Go,Elasticsearchによる、@cosmeを5倍速くする取り組み
 
カメラを利用したアプリを作って約1000人で遊んだ話
カメラを利用したアプリを作って約1000人で遊んだ話カメラを利用したアプリを作って約1000人で遊んだ話
カメラを利用したアプリを作って約1000人で遊んだ話
 
中・大規模でLaravelを導入するTips
中・大規模でLaravelを導入するTips中・大規模でLaravelを導入するTips
中・大規模でLaravelを導入するTips
 
FirebaseとNuxtでLPを作って見た
FirebaseとNuxtでLPを作って見たFirebaseとNuxtでLPを作って見た
FirebaseとNuxtでLPを作って見た
 
introducing vue-wait-component
introducing vue-wait-componentintroducing vue-wait-component
introducing vue-wait-component
 
LaravelでAPI定義を管理する
LaravelでAPI定義を管理するLaravelでAPI定義を管理する
LaravelでAPI定義を管理する
 
2017: A CSS Design Odyssey
2017: A CSS Design Odyssey2017: A CSS Design Odyssey
2017: A CSS Design Odyssey
 
Responsableを使ったadr実装
Responsableを使ったadr実装Responsableを使ったadr実装
Responsableを使ったadr実装
 
土日でLineみたいなチャット作ってきた!
土日でLineみたいなチャット作ってきた!土日でLineみたいなチャット作ってきた!
土日でLineみたいなチャット作ってきた!
 
Viewを活用して複雑化と戦う
Viewを活用して複雑化と戦うViewを活用して複雑化と戦う
Viewを活用して複雑化と戦う
 
Laravel aspectで関心の分離
Laravel aspectで関心の分離Laravel aspectで関心の分離
Laravel aspectで関心の分離
 
Laravelでfacadeを使わない開発
Laravelでfacadeを使わない開発Laravelでfacadeを使わない開発
Laravelでfacadeを使わない開発
 

HackのAsyncCurlで死んだ話