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
運用に困っていた重いバッチを高速化したらそもそもの運用が変わった話
Search
SHIFT EVOLVE
PRO
June 27, 2021
Business
900
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
運用に困っていた重いバッチを高速化したらそもそもの運用が変わった話
SHIFT EVOLVE
PRO
June 27, 2021
More Decks by SHIFT EVOLVE
See All by SHIFT EVOLVE
生成AI活用によるODC欠陥分析の分類高速化の実践と導入効果 / 20260703 Suguru Ishii
shift_evolve
PRO
1
32
次世代ランサムウェア対策の考察 / 20260704 Mitsutoshi Matsuo
shift_evolve
PRO
0
69
40代で“やっとエンジニアになれた”――閉じた学びを開き、空の青さを知る / 20260628 Naoki Takahashi
shift_evolve
PRO
4
1.2k
フロントエンドイチゲキ実装 ― Figmaデザインと画面設計書からAIに実装・テストを書かせるための”下ごしらえ” / 20260627 Yusuke Mazuka
shift_evolve
PRO
0
55
高速な品質フィードバックを実現するAIテスト設計エージェント構築の要点 / 20260529 Suguru Ishii
shift_evolve
PRO
0
76
SREの仕事は「壊さないこと」ではなくなった 〜自律化していくシステムに、責任と判断を与えるという価値〜 / 20260515 Naoki Shimada
shift_evolve
PRO
1
310
ボトムアップの改善の火を灯し続けろ!〜支援現場で学んだ、消えないための3つの打ち手〜 / 20260509 Kazuki Mori
shift_evolve
PRO
2
1.2k
AI活用時代の事業判断高度化を導くエンジニアリング基盤 / 20260424 Atsushi Funahashi
shift_evolve
PRO
2
160
ネットワーク運用を楽にするAWS DevOps Agent活用法!! / 20260421 Masaki Okuda
shift_evolve
PRO
2
350
Other Decks in Business
See All in Business
答えがすぐ出るAI時代での自分育成論
kan
0
110
NOROSHI inc_COMPANY DECK
noroshi
0
210
スマートキャンプ株式会社 会社紹介資料 / companydeck
smartcamp
1
4.5k
Algomatic | 会社紹介資料
algomatic
PRO
2
150k
FIGEO採用ピッチ資料
figeohr
0
450
株式会社アイリッジ 会社説明資料
iridge
0
6.7k
会社紹介資料/Idein株式会社 ※URLが変わりました
ideininc
0
57k
フルカイテン株式会社 採用資料
fullkaiten
0
98k
mar studio_紹介資料
vinculum
6
130
神戸百年記念病院 専門研修PG 2026
kobe100
0
120
アッテル会社紹介資料/culture deck
attelu
11
17k
株式会社ショーエイ_採用説明資料
shoeidex
0
170
Featured
See All Featured
Navigating Team Friction
lara
192
16k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
201
75k
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
870
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
2k
The Invisible Side of Design
smashingmag
301
52k
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
320
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
1k
Paper Plane
katiecoart
PRO
1
52k
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
260
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
200
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
30k
The Art of Programming - Codeland 2020
erikaheidi
57
14k
Transcript
運用に困っていた重いバッチ を高速化したらそもそもの運 用が変わった話 Airitech株式会社 橋本拓也 DevOps & QAエンジニアLT大会 Vol.1 1
/ 19
発表する人 Airitech株式会社 橋本拓也 DevOps & QAエンジニアLT大会 Vol.1 2 / 19
発表する人 Airitech株式会社 橋本拓也 仕事内容 トラブルシューティングや性能試験設計・実施をメインの仕事にしています。 ぱっと見解決できない障害とか見るとアドレナリン上がるタイプです。 DevOps & QAエンジニアLT大会 Vol.1
2 / 19
発表する人 Airitech株式会社 橋本拓也 仕事内容 トラブルシューティングや性能試験設計・実施をメインの仕事にしています。 ぱっと見解決できない障害とか見るとアドレナリン上がるタイプです。 好きなプログラミング言語 C++/Lua/AWK DevOps &
QAエンジニアLT大会 Vol.1 2 / 19
発表する人 Airitech株式会社 橋本拓也 仕事内容 トラブルシューティングや性能試験設計・実施をメインの仕事にしています。 ぱっと見解決できない障害とか見るとアドレナリン上がるタイプです。 好きなプログラミング言語 C++/Lua/AWK 趣味 GithubのTrending見て、面白そうなリポジトリを触ってみる。
paiza スキルチェックのレーティングを上げる。 DevOps & QAエンジニアLT大会 Vol.1 2 / 19
話の流れ LTで時間切れになったら悲しいので、概要を書いておきます。 DevOps & QAエンジニアLT大会 Vol.1 3 / 19
話の流れ LTで時間切れになったら悲しいので、概要を書いておきます。 1. PHPで書いたバッチ処理がすごく遅い DevOps & QAエンジニアLT大会 Vol.1 3 /
19
話の流れ LTで時間切れになったら悲しいので、概要を書いておきます。 1. PHPで書いたバッチ処理がすごく遅い 2. PHPで極力頑張る DevOps & QAエンジニアLT大会 Vol.1
3 / 19
話の流れ LTで時間切れになったら悲しいので、概要を書いておきます。 1. PHPで書いたバッチ処理がすごく遅い 2. PHPで極力頑張る 3. C++の力をお見せしますよ DevOps &
QAエンジニアLT大会 Vol.1 3 / 19
話の流れ LTで時間切れになったら悲しいので、概要を書いておきます。 1. PHPで書いたバッチ処理がすごく遅い 2. PHPで極力頑張る 3. C++の力をお見せしますよ 4. C++の底力を絞り出す
DevOps & QAエンジニアLT大会 Vol.1 3 / 19
話の流れ LTで時間切れになったら悲しいので、概要を書いておきます。 1. PHPで書いたバッチ処理がすごく遅い 2. PHPで極力頑張る 3. C++の力をお見せしますよ 4. C++の底力を絞り出す
5. あれ?バッチ処理いらないのでは? DevOps & QAエンジニアLT大会 Vol.1 3 / 19
話の流れ LTで時間切れになったら悲しいので、概要を書いておきます。 1. PHPで書いたバッチ処理がすごく遅い 2. PHPで極力頑張る 3. C++の力をお見せしますよ 4. C++の底力を絞り出す
5. あれ?バッチ処理いらないのでは? 6. そして運用が変わった DevOps & QAエンジニアLT大会 Vol.1 3 / 19
事の発端 コンサルティング契約中のお客様がデータ処理のバッチ作ろうとしていました。 PHPでバックエンドを書くのが得意なお客様なので、バッチもPHPで書いていました。 今までは処理も単純で、データ量も少なく、これでうまくいっていたのです。 ところが今回の処理では以下のようなそこそこ厳しい制約が存在して、バッチ処理の速度が大きな問題 になってしまいました。 1. 5分毎に外部から配置されるデータを加工して参照しやすいデータに変更しないといけない 2. 当然5分以内に全ての処理を終わらせないといけない
3. インスタンスが外部からのファイルサーバーとしても利用されていて、高負荷をかけられない DevOps & QAエンジニアLT大会 Vol.1 4 / 19
事の発端 コンサルティング契約中のお客様がデータ処理のバッチ作ろうとしていました。 PHPでバックエンドを書くのが得意なお客様なので、バッチもPHPで書いていました。 今までは処理も単純で、データ量も少なく、これでうまくいっていたのです。 ところが今回の処理では以下のようなそこそこ厳しい制約が存在して、バッチ処理の速度が大きな問題 になってしまいました。 1. 5分毎に外部から配置されるデータを加工して参照しやすいデータに変更しないといけない 2. 当然5分以内に全ての処理を終わらせないといけない
3. インスタンスが外部からのファイルサーバーとしても利用されていて、高負荷をかけられない そんな中,お客様より Airitechさん性能改善もしてたよね。なんとかできますか ね? とエンジニアのプライドをくすぐる発言をいただきました。 コレハガンバラナイト…。 DevOps & QAエンジニアLT大会 Vol.1 4 / 19
改善前の処理 改善前のコードは既存のPHP5のコードを元に作成されていて、非常に効率が悪いものでした。 5分間のデータ(1.5Mbyte)の処理に50分以上かかっていることが分かります。 データ初期化 17分 データ伸長・分析 16分 データ変換 20分 DevOps
& QAエンジニアLT大会 Vol.1 5 / 19
改善前の処理 改善前のコードは既存のPHP5のコードを元に作成されていて、非常に効率が悪いものでした。 5分間のデータ(1.5Mbyte)の処理に50分以上かかっていることが分かります。 データ初期化 17分 データ伸長・分析 16分 データ変換 20分 …とても、遅いですね。
DevOps & QAエンジニアLT大会 Vol.1 5 / 19
PHPのままで性能改善 PHPのプロファイラで遅い処理を特定しつつ、以下のような改善をしました。 DevOps & QAエンジニアLT大会 Vol.1 6 / 19
PHPのままで性能改善 PHPのプロファイラで遅い処理を特定しつつ、以下のような改善をしました。 データ初期化でファイルへの書き込み回数を減らす DevOps & QAエンジニアLT大会 Vol.1 6 / 19
PHPのままで性能改善 PHPのプロファイラで遅い処理を特定しつつ、以下のような改善をしました。 データ初期化でファイルへの書き込み回数を減らす 伸長処理の一部を事前計算して高速化してみる DevOps & QAエンジニアLT大会 Vol.1 6 /
19
PHPのままで性能改善 PHPのプロファイラで遅い処理を特定しつつ、以下のような改善をしました。 データ初期化でファイルへの書き込み回数を減らす 伸長処理の一部を事前計算して高速化してみる 一時ファイルの出力先をtmpfsに移動する DevOps & QAエンジニアLT大会 Vol.1 6
/ 19
PHPのままで性能改善 PHPのプロファイラで遅い処理を特定しつつ、以下のような改善をしました。 データ初期化でファイルへの書き込み回数を減らす 伸長処理の一部を事前計算して高速化してみる 一時ファイルの出力先をtmpfsに移動する arrayへの検索回数を極力減らす DevOps & QAエンジニアLT大会 Vol.1
6 / 19
PHPのままで性能改善 PHPのプロファイラで遅い処理を特定しつつ、以下のような改善をしました。 データ初期化でファイルへの書き込み回数を減らす 伸長処理の一部を事前計算して高速化してみる 一時ファイルの出力先をtmpfsに移動する arrayへの検索回数を極力減らす PHP8を使ってみる リリースしたてで触ってみたかった… DevOps &
QAエンジニアLT大会 Vol.1 6 / 19
PHPのままで性能改善結果 データ初期化 1秒 データ伸長・分析 90秒 データ変換 30秒 トータルで2分程度短縮できました。 DevOps &
QAエンジニアLT大会 Vol.1 7 / 19
PHPのままで性能改善結果 データ初期化 1秒 データ伸長・分析 90秒 データ変換 30秒 トータルで2分程度短縮できました。 25倍の高速化!! DevOps
& QAエンジニアLT大会 Vol.1 7 / 19
PHPのままで性能改善結果 データ初期化 1秒 データ伸長・分析 90秒 データ変換 30秒 トータルで2分程度短縮できました。 25倍の高速化!! 5分のTime
Windowに収まるようになって、 高速化、大成功! DevOps & QAエンジニアLT大会 Vol.1 7 / 19
でも、まだ遅くない? DevOps & QAエンジニアLT大会 Vol.1 8 / 19
でも、まだ遅くない? 感覚的に 1.5MByte のファイルの処理に2分かかるのはかなり遅いのでは? DevOps & QAエンジニアLT大会 Vol.1 8 /
19
でも、まだ遅くない? 感覚的に 1.5MByte のファイルの処理に2分かかるのはかなり遅いのでは? PHPがボトルネックになっているかもしれない。 DevOps & QAエンジニアLT大会 Vol.1 8
/ 19
でも、まだ遅くない? 感覚的に 1.5MByte のファイルの処理に2分かかるのはかなり遅いのでは? PHPがボトルネックになっているかもしれない。 もしや… DevOps & QAエンジニアLT大会 Vol.1
8 / 19
でも、まだ遅くない? 感覚的に 1.5MByte のファイルの処理に2分かかるのはかなり遅いのでは? PHPがボトルネックになっているかもしれない。 もしや… これは…… DevOps & QAエンジニアLT大会
Vol.1 8 / 19
でも、まだ遅くない? 感覚的に 1.5MByte のファイルの処理に2分かかるのはかなり遅いのでは? PHPがボトルネックになっているかもしれない。 もしや… これは…… C++を業務で使うチャンスでは? DevOps &
QAエンジニアLT大会 Vol.1 8 / 19
[FYI] PHPとC++の速度比較 プログラミング言語の速度には色々な比較の方法があり、完璧で正確な比較の方法は存在しません。 色々なbenchmarkを様々なエンジニアが実装している以下のリポジトリでJSONのパース処理を見ると、 C++はPHPの10倍の処理速度を叩き出していることが分かります。 https://github.com/kostya/benchmarks#json Language Time, s C++/g++(DAW
JSON Link) 0.130 PHP 1.345 DevOps & QAエンジニアLT大会 Vol.1 9 / 19
[FYI] PHPとC++の速度比較 プログラミング言語の速度には色々な比較の方法があり、完璧で正確な比較の方法は存在しません。 色々なbenchmarkを様々なエンジニアが実装している以下のリポジトリでJSONのパース処理を見ると、 C++はPHPの10倍の処理速度を叩き出していることが分かります。 https://github.com/kostya/benchmarks#json Language Time, s C++/g++(DAW
JSON Link) 0.130 PHP 1.345 今回の処理も更に10倍程度の高速化を目指せるはず! DevOps & QAエンジニアLT大会 Vol.1 9 / 19
C++への移植チャレンジ 幸いなことに、お客様には以下のような高速化するモチベーションがあることが分かっていました。 1. 少ない遅延で情報を提示したい 2. 余裕があれば配置されるデータに入っている他の情報も有効活用したい DevOps & QAエンジニアLT大会 Vol.1
10 / 19
C++への移植チャレンジ 幸いなことに、お客様には以下のような高速化するモチベーションがあることが分かっていました。 1. 少ない遅延で情報を提示したい 2. 余裕があれば配置されるデータに入っている他の情報も有効活用したい お客様からも同意をいただき、 PHPより速いC++での速度向上にチャレンジしてみることに! DevOps &
QAエンジニアLT大会 Vol.1 10 / 19
C++に単純移植 PHPのコードをほぼそのままC++に移植してみました。 データ初期化 1秒 データ伸長・分析 12秒 データ変換 4秒 DevOps &
QAエンジニアLT大会 Vol.1 11 / 19
C++に単純移植 PHPのコードをほぼそのままC++に移植してみました。 データ初期化 1秒 データ伸長・分析 12秒 データ変換 4秒 17秒と2分から約7倍の高速化を達成! DevOps
& QAエンジニアLT大会 Vol.1 11 / 19
C++に単純移植 PHPのコードをほぼそのままC++に移植してみました。 データ初期化 1秒 データ伸長・分析 12秒 データ変換 4秒 17秒と2分から約7倍の高速化を達成! …でもまだ遅く感じる。
DevOps & QAエンジニアLT大会 Vol.1 11 / 19
C++に単純移植 PHPのコードをほぼそのままC++に移植してみました。 データ初期化 1秒 データ伸長・分析 12秒 データ変換 4秒 17秒と2分から約7倍の高速化を達成! …でもまだ遅く感じる。
C++はもっと「できる子」だって示したい! DevOps & QAエンジニアLT大会 Vol.1 11 / 19
C++の底力を絞り出す! unordered_mapの変わりにmartinus/robin-hood-hashingを使う 17秒 → 15秒 fmtlib/fmtの引数をFMT_COMPILEに変更する 15秒 → 13秒 doubleの文字列化処理を整数に変換してから実施
13秒 → 11秒 dbubleの文字列化処理をキャッシュして保持 11秒 → 10秒 martinus/robin-hood-hashingの一部をTessil/robin-mapに変更 10秒 → 9秒 CSV parserの利用をやめて最適化したロジックへ 9秒 → 8秒 標準allocatorの代わりにmicrosoft/mimallocを使う 8秒 → 7秒 条件分岐をループの外に移動 7秒 → 6秒 さらに3倍弱の高速化! DevOps & QAエンジニアLT大会 Vol.1 12 / 19
同僚からはちょっと呆れられました。 DevOps & QAエンジニアLT大会 Vol.1 13 / 19
そして、ふと気がつく DevOps & QAエンジニアLT大会 Vol.1 14 / 19
そして、ふと気がつく これだけ速くでいるならば、処理方式を変更できるのでは? DevOps & QAエンジニアLT大会 Vol.1 14 / 19
そして、ふと気がつく これだけ速くでいるならば、処理方式を変更できるのでは? 契約先が ファイルを 配置 オリジナル データを 保存 参照しやすいデータを ⽣成して、保存
( 重い処理) 最新データを⼀部を取得 業務に応じて⾮定期で 最新状態を閲覧 DevOps & QAエンジニアLT大会 Vol.1 14 / 19
そして、ふと気がつく これだけ速くでいるならば、処理方式を変更できるのでは? 契約先が ファイルを 配置 オリジナル データを 保存 ⽣データから 必要な部分だけ抽出
業務に応じて⾮定期で 最新状態を閲覧 DevOps & QAエンジニアLT大会 Vol.1 15 / 19
そして、ふと気がつく これだけ速くでいるならば、処理方式を変更できるのでは? 契約先が ファイルを 配置 オリジナル データを 保存 ⽣データから 必要な部分だけ抽出
業務に応じて⾮定期で 最新状態を閲覧 お客様に提案したところ、プロトタイピングすることに! DevOps & QAエンジニアLT大会 Vol.1 15 / 19
変更した処理方式でプロトタイピング 「特定の範囲の情報だけを取得する」ロジックを試作して計測。 DevOps & QAエンジニアLT大会 Vol.1 16 / 19
変更した処理方式でプロトタイピング 「特定の範囲の情報だけを取得する」ロジックを試作して計測。 1回の実行が0.3秒で実行できることを確認できました。 DevOps & QAエンジニアLT大会 Vol.1 16 / 19
変更した処理方式でプロトタイピング 「特定の範囲の情報だけを取得する」ロジックを試作して計測。 1回の実行が0.3秒で実行できることを確認できました。 メンテナンスの都合上、本開発ではGo言語を採用することになりましたが、 エラー処理を入れても1秒以下で処理できる方式で運用中。 DevOps & QAエンジニアLT大会 Vol.1 16
/ 19
変更した処理方式でプロトタイピング 「特定の範囲の情報だけを取得する」ロジックを試作して計測。 1回の実行が0.3秒で実行できることを確認できました。 メンテナンスの都合上、本開発ではGo言語を採用することになりましたが、 エラー処理を入れても1秒以下で処理できる方式で運用中。 高速化によって処理方式に選択肢が生まれ、 運用方式が変化した! と言えるのではないかと思います。 DevOps &
QAエンジニアLT大会 Vol.1 16 / 19
環境的な後押しも大きな要因 こんなにうまくいったのは、環境に寄るところも大きかったと思います。 1. 運用と開発の両方に関わっているお客様だったため、両方の課題を把握されていた 2. ソフトウェアの規模が数千行程度で、細かいチャレンジがしやすかった 3. 私たちも、運用・開発と垣根を作らず、提案ができる体制で臨めた DevOps &
QAエンジニアLT大会 Vol.1 17 / 19
環境的な後押しも大きな要因 こんなにうまくいったのは、環境に寄るところも大きかったと思います。 1. 運用と開発の両方に関わっているお客様だったため、両方の課題を把握されていた 2. ソフトウェアの規模が数千行程度で、細かいチャレンジがしやすかった 3. 私たちも、運用・開発と垣根を作らず、提案ができる体制で臨めた 運用と開発を一緒に話せる環境って大事と実感しました。 DevOps
& QAエンジニアLT大会 Vol.1 17 / 19
まとめ 1. PHPで書かれたバッチ処理を25倍高速化しました 2. さらにC++での移植して7倍高速化しました 3. C++で最適化をくりかえし更に3倍弱高速化しました 4. 500倍以上の高速化によって処理内容への違う考え方が生まれ、運用の仕方も変えられました。 DevOps
& QAエンジニアLT大会 Vol.1 18 / 19
まとめ 1. PHPで書かれたバッチ処理を25倍高速化しました 2. さらにC++での移植して7倍高速化しました 3. C++で最適化をくりかえし更に3倍弱高速化しました 4. 500倍以上の高速化によって処理内容への違う考え方が生まれ、運用の仕方も変えられました。 性能改善で運用にも貢献できるかもしれない!
DevOps & QAエンジニアLT大会 Vol.1 18 / 19
最後までご覽いただき、ありがとうございました。 このスライドは で作成しました。 DevOps & QAエンジニアLT大会 Vol.1 19 / 19