Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
ソースコードから理解するPreloadとJITの話/preload_and_jit
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Ryo Tomidokoro
December 12, 2020
Programming
2
3.5k
ソースコードから理解するPreloadとJITの話/preload_and_jit
preloadとJITの話をなるべくわかり易く、それでいて深く書いてみました。
Ryo Tomidokoro
December 12, 2020
Tweet
Share
More Decks by Ryo Tomidokoro
See All by Ryo Tomidokoro
開発者が知っておきたい複雑さの正体/where-the-complexity-comes-from
hanhan1978
8
3.3k
Spec Driven Development入門/spec_driven_development_for_learners
hanhan1978
2
1.5k
フロントエンドがTypeScriptなら、バックエンドはPHPでもいいじゃない/php-is-not-bad
hanhan1978
8
13k
どうすると生き残れないのか/how-not-to-survive
hanhan1978
17
14k
100分で本番デプロイ!Laravelで作るWebアプリケーション作成/100min_web_app_cicd
hanhan1978
1
230
PHPerのための計算量入門/Complexity101 for PHPer
hanhan1978
8
3.4k
集中して作業する技術/how_to_work_deeply
hanhan1978
65
54k
PHPでデータベースを作ってみた/create-data-with-php
hanhan1978
11
11k
ADRを一年運用してみた/adr_after_a_year
hanhan1978
8
4.7k
Other Decks in Programming
See All in Programming
.NET Conf 2025 の興味のあるセッ ションを復習した / dotnet conf 2025 quick recap for backend engineer
tomohisa
0
120
20260127_試行錯誤の結晶を1冊に。著者が解説 先輩データサイエンティストからの指南書 / author's_commentary_ds_instructions_guide
nash_efp
0
750
副作用をどこに置くか問題:オブジェクト指向で整理する設計判断ツリー
koxya
1
560
Apache Iceberg V3 and migration to V3
tomtanaka
0
110
例外処理とどう使い分ける?Result型を使ったエラー設計 #burikaigi
kajitack
16
5.8k
MDN Web Docs に日本語翻訳でコントリビュート
ohmori_yusuke
0
620
AI Agent の開発と運用を支える Durable Execution #AgentsInProd
izumin5210
7
2.2k
AIエージェントの設計で注意するべきポイント6選
har1101
7
3.3k
TerraformとStrands AgentsでAmazon Bedrock AgentCoreのSSO認証付きエージェントを量産しよう!
neruneruo
4
2.6k
AI Schema Enrichment for your Oracle AI Database
thatjeffsmith
0
170
Fragmented Architectures
denyspoltorak
0
140
カスタマーサクセス業務を変革したヘルススコアの実現と学び
_hummer0724
0
430
Featured
See All Featured
Fashionably flexible responsive web design (full day workshop)
malarkey
408
66k
Ethics towards AI in product and experience design
skipperchong
2
180
Ruling the World: When Life Gets Gamed
codingconduct
0
130
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
230
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
1
630
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
70
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
0
260
YesSQL, Process and Tooling at Scale
rocio
174
15k
エンジニアに許された特別な時間の終わり
watany
106
230k
The SEO identity crisis: Don't let AI make you average
varn
0
57
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.1k
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
49
Transcript
@hanhan1978 ソースコードから理解する PreloadとJITの話 PHP Conference Japan 2020/12/12
@hanhan1978 • 富所 亮 • 職業 ◦ Webアプリケーションエンジニア ◦ 雑用係
• ブログ ◦ https://blog.hanhans.net • Yokohama North AM ◦ https://anchor.fm/yokohama-north-am
興味のある方は... ※気が向いた時にやってます ... https://shadow-php.connpass.com/
秒でGDBデバッグ https://github.com/hanhan1978/shadow-php/wiki
本日のテーマ preloadとjitの肌感を掴む • 謎の技術にせず、仕組みから理解 • どれくらい速度向上するのか • 本番環境での採用是非
PHP高速化の歴史
PHPはスクリプト言語 実行の大まかな流れ
PHPはスクリプト言語 実行の大まかな流れ ここで時間がかかる
PHPerが行ってきた解決策
中間コードキャッシュ コンパイル結果(OPCode)をメモリにキャッシュ
歴代の中間コードキャッシュ XCache 〜PHP5.6 eAccelarator 〜PHP5.6 Alternative PHP Cache (APC) PHP5.4
Zend Opcache PHP5.5〜 ※これらのツールを同居させると ShareMemory戦国時代になりSegFault
OPCacheがデファクトスタンダード PHP5.5以降は一択 そして、PHP7.4以降からOPCacheにさらなる高速化の仕組みが 導入されるようになった....ここから本題
余談1 稀によく見るうっかりさん。OPCache入ってない ※php -v ですぐ確認できるので、心当たりのある方は確認を
※OPcacheが入ってなくて良いことは一個もないです
PHPスクリプト実行の詳細
PHPはスクリプト言語 • 実行時にコンパイル • コンパイル&実行を繰返す
例えば
PHP実行の流れ
None
実行の詳細
None
None
中間コードキャッシュに よってコンパイルの過程 が省略される
具体例
ファイル構成
index.php
autoload.php
A.php
B.php
実行すると
実行すると autoloaderが2回呼び出されている
実行の流れ
4回のコンパイル
OPCacheが解決するもの 4回分のコンパイルがキャッシュで解決
計測
OPCache − ◯ Req / Sec 111.55 680.42 ※OPCacheの有効化によって、処理速度は約 6倍
Laravelの30秒ベンチマーク
高速化技術が達成すること 1. OPCache >> 2. OPCache preload >> 3. OPCache
JIT >> ??? ??? ???
高速化技術が達成すること 1. OPCache >> コンパイル回数の軽減 2. OPCache preload >> 3.
OPCache JIT >> ??? ???
OPCache preloadとは?
PHP7.4から追加 https://wiki.php.net/rfc/preload
• OPCacheの機能追加として提案 • サーバー起動時に指定ファイルをコンパイル して、メモリに読込 ※一見すると、中間コードキャッシュと同じことをしているように見える
具体例
ファイル構成
preload.php
php.ini
実行すると
実行すると Class Aはautoloadされてない!!
実行の流れ
3回のコンパイル
• autoloadが省略される • preload以外のファイルは opcache.validate_timestamp=0と同じ挙動 • 直接のrequireはpreloadが活用されない
preloadソース v7.4.3
ext/opcache/ZendAccelarator.c - SAPI起動時に L4200 preload_load() - globalなデータ領域にpreloadしたクラス、ファイルの情報を登録 する - opcodes実行時のコンパイルに使われるのは、L1914
persistent_compile_file。これはpreloadの有無に依らない
Zend/zend_execute_API.c - L1419 zend_fetch_class_by_name が未解決のクラス名に対して コールされる - zend_hash_findでコンパイル済みのクラスが発見されれば、それを 使う(preload) -
それ以外は、autoloaderを使ってクラスの解決が行われて、ファイル が見つかればコンパイルされる ※要するにpreloadされるとautoloaderまで処理がいかずに解決できる
計測
Laravelの30秒ベンチマーク OPCache − ◯ ◯ Preload − − ◯ Req
/ Sec 111.55 680.42 774.14 ※preload有効化によって、処理速度は約 14%向上
高速化技術が達成すること 1. OPCache >> コンパイル回数の軽減 2. OPCache preload >> 3.
OPCache JIT >> ??? ???
高速化技術が達成すること 1. OPCache >> コンパイル回数の軽減 2. OPCache preload >> autoloadの軽減
3. OPCache JIT >> ???
余談 Windows用PHPのpreload機能は7.4.2の時点で機能削除 https://www.php.net/manual/en/opcache.preloading.php
OPCache JITとは?
PHP8.0から追加 https://wiki.php.net/rfc/jit
ZendVMで実行するのではなく Native Codeを実行する
• 機械語実行により処理速度が最適化 • 同様のことはpcre-jitやJS等でもおなじみ
実行の詳細
None
None
OPCodeをさらに機械語に変換 CPUで直接実行!!
• コード実行が最適化 • JITコンパイルのオーバーヘッドは実行速度で 補填
JITソース v8.0.0
OPCacheが主に関わってくるソースコード JIT関連はopcache/jitに固まっているので 分かりやすい。
opcodeをx86のアセンブラに変換している zend_jit_x86.c
ext/opcache/jit/zend_jit.c - zend_jit_op_array において泥臭い変換処理が行われている - アーキテクチャ依存のコード変換なので未対応だと動作しない - LuaJIT由来のDynAsmを利用
JIT化される単位 - zend_jit_op_array はファイル毎に呼び出し - クラス単位、関数単位でopcodeの最適化が行われて、関数のIOを合わ せた形でZendVMの主処理と繋ぎ合わされる - 1ファイル1関数に全部の処理を入れたら、効果的に効きそう
計測
Laravelの30秒ベンチマーク OPCache − ◯ ◯ Preload − − ◯ Req
/ Sec 111.55 680.42 774.14 Req / Sec (JIT) − 696.57 812.93 ※JIT有効化によって、処理速度は約 2.5〜5%向上
モンテカルロ法を計測
円周率計算のベンチマーク OPCache − ◯ Sec 9.74 8.96 Sec (JIT) −
5.20 ※JIT有効化によって、処理速度は約 42%向上 100,000,000回試行の処理時間
高速化技術が達成すること 1. OPCache >> コンパイル回数の軽減 2. OPCache preload >> autoloadの軽減
3. OPCache JIT >> ???
高速化技術が達成すること 1. OPCache >> コンパイル回数の軽減 2. OPCache preload >> autoloadの軽減
3. OPCache JIT >> コード実行の最適化
JITの現状
• https://bugs.php.net/search.php?cmd=display&packa ge_name[]=opcache • RedditのPHP系板 • https://www2.slideshare.net/nikita_ppv/justintime-co mpiler-in-php-8 情報キャッチアップ
使用上の注意
• 内部の実行パスが変わる • 開発も同じ設定にするのが吉 • ファイル更新でopcache_clearとか...
phpunitで使うには これを設定しないと、コマンドライン実行時にopcache が動かない。
まとめ
高速化技術が解決すること 1. OPCache >> コンパイル回数の軽減 2. OPCache preload >> autoloadの軽減
3. OPCache JIT >> コード実行の最適化
仕組みを理解 適切なアプリケーションに適用 コレ大事!!
参考1 https://speakerdeck.com/hanhan1978/web-application-tuning-guildline
参考2 https://gist.github.com/hellerbarde/2843375 Network IOはメモリアク セスの5万倍遅い
リアルなウェブアプリのボトルネックは、大半 がDBアクセス CPU負荷の数%は全体のボトルネックでは 微々たるもの
本番投入はオススメしづらい... ISUCON用機能なのでは...