はじめに
難しそ〜、イメージできないんだよね〜と、苦手意識のあるインフラ周りのあれこれ。
克服すべく本を買ったけど読まずに放置されてたので、年内には終わらせたいと読み始めたところの一部をまとめます。
いずれ、そのうちこの辺も知っておかないと・・ってことで。
今回読んだ本は、「Webエンジニアが知っておきたいインフラの基本」という本です。
チューニングするってよく聞くけどなに?
システムチューニングと呼ばれるもので、キャパシティの向上のためにシステム構造の一部を変更し、処理効率を上げるために行う行為のことを指します。
チューニングするときは、インフラもアプリケーションも区別なく、両方みていく必要があります。
チューニングを行う時の鉄則
- 「何を改善するか」を決め、ターゲットとゴールを明確にする
- とにかくボトルネックにアプローチ
- ボトルネックを知るためには「計測」すること
- ターゲットとゴールの設定、改善する、計測する、ボトルネックを見つけるのPDCAをいかに回すかが重要
ボトルネックの見つけ方
探すフローとしては以下のようにすることを紹介されてました。
1. ターゲットとゴールを決める
2. データフローを確認する
3. データフローのポイントごとに処理内容を確認する
4. システムリソースを確認する
基本中の基本ですね。日々の問題解決のときと同じじゃんと思ったのは私だけでしょうか?
データフローの確認の仕方は本に詳しく書いてあったので、実践してみるのが良さそう。。
データフローの確認するポイント
- プログラム外や外部システムとの通信箇所や内容
- exec関数やsystem関数といった外部プログラムの呼び出し
- ディスクの読み書き部分
- 配列やリストのサイズが大きい、または、ループの回数が多い
アプリケーションのソースコードを見て調べていく。
システムリソースの確認するポイント
- CPUの性能を使い切ってないか?
- メモリ容量を使い切ってないか?
- ネットワーク帯域を使い切ってないか?
- ディスク帯域、IOPSを使い切ってないか?
これらをリアルタイムで確認したいときは、topやiostatなどのコマンドを使う。
先輩が以前詳しく書いてくれているので、参考にすると良さそう。
【初心者向け】サーバが重い時に確認すべきこと & サーバの基礎知識
※性能面だけでなく、意図しない制約がかかっていないかも確認
ex)「Too many open files in system」と出たときは、OSの制限である「ulimit」の「open file」が条件に達したことを示す。
以下のようなことが起きていると怪しいポイント
- 値が一定値で推移している → 性能条件に達している可能性
- 前日、先週の同じ曜日、先月と同じ日と動きが大きく違う → 起こるべき変化が起きているか、予想外のことがおきていないか確認
- 値の変動が激しい → データの取得方法、または、データに問題がある可能性
アプリケーション側の確認方法
基本的にはプロファイラと呼ばれる、アプリケーションの性能解析ツールを使うのが一般的なのでしょうか?
プロファイラを使うと、メソッドの呼び出し回数や時間、メモリやCPUの使用量、スレッドの状態がが取れます。
オープンソースが結構あるみたいなので、活用するといいかも。
あとがき
本人的には「チューニングが必要だ」って話を聞いたら、どんなことをするのかがイメージできるレベルまでは理解できたので、よかった。
実際にやってみると、ある程度正常な数値を知っていないとこれ本当にボトルネックとしていいのかなって悩みそうですね。
いざ必要になる前になんとなくでもやっておかねば!(`・ω・´)キリッ