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
問題解決に必要な能力 〜CodeBuildとOPCacheに振り回された話〜 / Abilit...
Search
Masakazu Matsushita
April 22, 2022
Programming
1
330
問題解決に必要な能力 〜CodeBuildとOPCacheに振り回された話〜 / Ability to solve problems
2022/01/27 kaonavi Tech Talk #1で登壇したときの資料です。
https://kaonavi.connpass.com/event/235914/
Masakazu Matsushita
April 22, 2022
Tweet
Share
More Decks by Masakazu Matsushita
See All by Masakazu Matsushita
It's up to you 〜 楽しさドリブンで歩んだ道 〜
matsukaz
0
91
withコロナでカオナビに起こった3つの変化
matsukaz
1
1.1k
Other Decks in Programming
See All in Programming
バイブコーディングの正体——AIエージェントはソフトウェア開発を変えるか?
stakaya
5
940
コーディングは技術者(エンジニア)の嗜みでして / Learning the System Development Mindset from Rock Lady
mackey0225
2
490
DataformでPythonする / dataform-de-python
snhryt
0
180
GUI操作LLMの最新動向: UI-TARSと関連論文紹介
kfujikawa
0
960
大規模FlutterプロジェクトのCI実行時間を約8割削減した話
teamlab
PRO
0
480
Claude Code と OpenAI o3 で メタデータ情報を作る
laket
0
130
変化を楽しむエンジニアリング ~ いままでとこれから ~
murajun1978
0
730
The State of Fluid (2025)
s2b
0
170
『リコリス・リコイル』に学ぶ!! 〜キャリア戦略における計画的偶発性理論と変わる勇気の重要性〜
wanko_it
1
540
kiroでゲームを作ってみた
iriikeita
0
170
Honoアップデート 2025年夏
yusukebe
0
240
0から始めるモジュラーモノリス-クリーンなモノリスを目指して
sushi0120
1
280
Featured
See All Featured
Visualization
eitanlees
146
16k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
48
9.6k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
229
22k
Navigating Team Friction
lara
188
15k
How to train your dragon (web standard)
notwaldorf
96
6.2k
What's in a price? How to price your products and services
michaelherold
246
12k
A Modern Web Designer's Workflow
chriscoyier
695
190k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
161
15k
How GitHub (no longer) Works
holman
314
140k
Rails Girls Zürich Keynote
gr2m
95
14k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
18
1.1k
Why Our Code Smells
bkeepers
PRO
338
57k
Transcript
問題解決に必要な能力 松下雅和 / @matsukaz 2022/01/27 〜CodeBuildとOPCacheに振り回された話〜 kaonavi Tech Talk #1
CTO Webエンジニア CTO SE アーキテクト 都築電気 株式会社 株式会社 オープンストリーム 株式会社
トランスリミット 株式会社 サイバーエージェント 株式会社 カオナビ 松下 雅和 @matsukaz 株式会社カオナビ CTO AWS, Node.js, TypeScript, Ruby, Python, PHP, Go, Scrum 2001.04 2005.08 2011.01 2014.10 2020.02 漫画, ゲーム, カメラ, 自転車
• 前提知識 ◦ OPCache ◦ Apache MPM Prefork ◦ ビルドパイプラインのBefore/After
• とある事象発生 • 調査&解決までの流れ • 問題解決に必要な能力 アジェンダ
前提知識
• コンパイル済みバイトコード(OPCode)を共有メモリに保存し、実行のた びにスクリプトの読み込み・パースの手間を省く仕組み OPCache Lexer PHP Script Check OPCode Cache
OPCode Compiler Save OPCode Execute (Zend VM) OPCode キャッシュなし Shared Memory OPCode OPCode Parser Optimizer
• コンパイル済みバイトコード(OPCode)を共有メモリに保存し、実行のた びにスクリプトの読み込み・パースの手間を省く仕組み OPCache PHP Script Check OPCode Cache Read
OPCode Execute (Zend VM) キャッシュあり Shared Memory OPCode OPCode
• コンパイル済みバイトコード(OPCode)を共有メモリに保存し、実行のた びにスクリプトの読み込み・パースの手間を省く仕組み OPCache Lexer PHP Script Check OPCode Cache
OPCode Compiler Save OPCode Read OPCode Execute (Zend VM) OPCode キャッシュなし キャッシュあり Shared Memory OPCode OPCode Parser Optimizer
Apache MPM Prefork • Apache起動時に予め(pre)子プロセスをコピー(fork)し、アクセスに備 える方式 • リクエストを1つの子プロセスが処理する ◦ 他のプロセスの影響を受けないが、多くのメモリやCPUが必要
子プロセス コントローラー プロセス http リクエスト # ps auxf | grep httpd USER PID ... COMMAND root 11 ... httpd -DFOREGROUND apache 12 ... \_ httpd -DFOREGROUND apache 13 ... \_ httpd -DFOREGROUND 子プロセスを管理 http リクエスト SAPI 子プロセス SAPI
Apache MPM Prefork + OPCache • OPCodeを共有メモリで管理(ファイル共有も可能) ◦ プロセスをまたがっても同じOPCodeを共有 ◦
OPCodeの保存や読み込みはセマフォを利用して排他制御 子プロセス コントローラー プロセス http リクエスト http リクエスト http リクエスト SAPI 子プロセス SAPI 子プロセス SAPI Shared Memory OPCode
• 同一サーバに新しいバージョンのコードを配置 • symlinkでコードの参照を切り替え • httpd reloadコマンドを実行 ◦ 設定ファイルの再読み込み ◦
OPCacheのクリア ビルドパイプライン (Before) # tree /var/www/html -L 2 /var/www/html ├── current │ ├── app │ ├── … │ └── releases ├── 20211115100000 └── 20211116100000
• CodeBuild + CodeDeployを利用したBlue-Green Deployment ◦ リリースのたびに新しいサーバに切り替わる仕組み ALB ビルドパイプライン (After)
• CodeBuild + CodeDeployを利用したBlue-Green Deployment ◦ リリースのたびに新しいサーバに切り替わる仕組み デプロイ ビルド CodeDeploy
CodeBuild ALB ALB ビルドパイプライン (After)
• CodeBuild + CodeDeployを利用したBlue-Green Deployment ◦ リリースのたびに新しいサーバに切り替わる仕組み デプロイ 切り替え ビルド
CodeDeploy CodeBuild ALB ALB ビルドパイプライン (After) ALB
とある事象発生
• ロードアベレージが高くなる現象が発生 ある日のリリースにて
• 現象発生直前のリリースが怪しいと判断し、リバートを決断 • ただ、リバート後も判断しきれない状態が続く (サーバを増設したのに負荷が下がりきらない) ◦ 月末によるカオナビの機能(人事評価)の駆け込み需要? • その後も、リリースのたびに負荷が高かったり低かったり… 現象確認と初動対応
• OPCacheが怪しい… インフラGで本格的な調査開始 キャッシュヒット率
• OPCacheが怪しい… インフラGで本格的な調査開始 キャッシュミス回数
• ステージング環境でもOPCacheのヒット率低下が発生 • 決め手がないまま、サーバの増設・縮退で高負荷を回避 • 「カオナビの動作が最近遅い」との問い合わせも…(関連は不明) • 開発側のメンバーも参戦! ここからは松下目線の話 根本原因がわからず
調査&解決までの流れ
• OPCacheの状態を手軽に確認したい ◦ https://gist.github.com/ck-on/4959032 • OPCacheのウォームアップを一気に行いたい ◦ https://gist.github.com/klimslim/ce8f727b3b419badce243bf5a74389b6 ◦ require_once()とopcache_compile_file()による違いはない
• ローカルの検証環境は大体できた まずはOPCacheの仕組みを理解
• ビルドパイプラインの変更とOPCache関連がやはり怪しい 以前との違いを再確認 デプロイフローの確認 以前の方式の挙動確認
• キャッシュミスが発生し続ける = opcache_compile_file()でキャッシュ されないファイルがあるはず • realpathまわりが怪しい? 当たりをつける https://www.slideshare.net/hnw/realpath-opcache ▪余談
php-fpmを利用していた場合は、 OPCacheと realpathとの関連はものすごく重要! 詳しくはこちらの資料を参照 →
挙動を再現!
• OPCacheの設定 ◦ max_accelerated_files = 10000(デフォルト) ◦ OPCacheは、内部でsymlinkとrealpathの両方のパスを 保持する(?)ため、2倍のキーを消費 ◦
16229 / 2 = 8115で頭打ちに つまり?
• どんな仕組みでそうなっているのかちゃんと把握 裏取り http://blog.jpauli.tech/2015-03-05-opcache-html/
だがしかし…
oh...
再び盛り上がる人々
• 誰も利用していない時間のステージング環境で再現確認 本番に近い環境で再検証
• 突然再現しなくなる(キャッシュミスしなくなる) 本番に近い環境で再検証
!?
• 現象発生中にキャッシュされていたファイル一覧を出力 より詳細に調査
• OPCache側ではなくてファイルかディレクトリの問題? • 適当にファイル作ってみる → キャッシュされる より詳細に調査 New
• OPCache側ではなくてファイルかディレクトリの問題? • 適当にファイル作ってみる → キャッシュされる • 同じ内容のファイルを作ってみる → キャッシュされる
より詳細に調査 New Not Cached New
• OPCache側ではなくてファイルかディレクトリの問題? • 適当にファイル作ってみる → キャッシュされる • 同じ内容のファイルを作ってみる → キャッシュされる
• コピーしてみる → キャッシュされ…ない?! より詳細に調査 New Not Cached New Not Cached Copied
• statで該当ファイルを見てみる… なぜか未来日付!! より詳細に調査
大勝利!!
解説
そして解決へ…
• いまだ不明… • 必ずなるわけでもない、ますます謎 • AWSのサポートに問い合わせてみたものの分からず ◦ CodeBuildでビルドした時点でなってる模様 そもそもなぜ未来日付になる?
問題解決に必要な能力
• インフラ ◦ ファイルシステム、symlink ◦ AWS関連(Codepipeline、CodeDeploy) • ミドルウェア ◦ Apache
MPM Prefork • PHPの動作の仕組み ◦ OPCache 対象に関連する前提知識
• 論理的思考 ◦ 広く・深く考える ◦ 分割して考える ◦ 筋道を考える • ラバーダッキング
マインド・考え方
• 発生している事象を正確に洗い出す • 期待する状態との差異を把握 問題解決までの行動 現状認識 原因特定 解決策の 立案 解決策の
実施
問題解決までの行動 現状認識 原因特定 • 原因となりうる要素の洗い出し • 再現環境の構築・再現方法の確立 • 原因の絞り込み ◦
当たりをつける(思い込みには注意) ◦ どこまでOKでどこからNGか、境界を見極める 解決策の 立案 解決策の 実施
問題解決までの行動 現状認識 原因特定 解決策の 立案 解決策の 実施 • 取りうる選択肢の洗い出し •
判断軸をもとに解決策を決定 ◦ 暫定対応・恒久対応 ◦ 緊急性 ◦ 対応にかかるコスト ▪ スピード・リソース ◦ 影響範囲・副作用の有無
問題解決までの行動 現状認識 原因特定 解決策の 立案 解決策の 実施 • 解決策による効果を測定 •
想定外の副作用に注意 • いつでも実施前の状態に戻せるようにする
• 実装技術の向上やフルスタックエンジニアを目指す以外にも、それぞれの 領域を深く掘り下げる意識も必要 ◦ フロントエンジニア ▪ 通信やブラウザの仕組み、端末の挙動 ◦ バックエンドエンジニア ▪
実行環境の設定・ミドルウェア・OSの仕組み ◦ インフラエンジニア ▪ 動作させるミドルウェアやアプリケーションの特性や挙動の特徴 エンジニアとして大事なこと
• インシデントは初動が大事 ◦ いろんなレイヤーで起こるため、原因の切り分けが難しい ◦ 組織全体で協力が必要な場面もある ◦ 「自分は関係ない」ではなく、 「知ってる知識が役に立つかも?」というスタンスで •
スピード感を持って動ける体制を作る 組織として大事なこと
• 問題解決のときにこそ、その人の地力が現れる ◦ 組織力としても同様 • エンジニアリングの世界は奥が深い! • 完全に理解した、から一歩その先へ まとめ
おわり