モチベーション

Linuxサーバの性能を引き出すために使うリソース管理コマンドとボトルネックの特定方法まとめる

背景

以前,NginxとElasticsearchの性能試験をしたがその結果がなぜそのようになるかを筋道を立てて説明することができず,結局推測して終わりにしてしまった.このまま終了しても学びがなく次に同じようなことをした時に活かせないので改めてLinuxサーバリソースの管理方法を勉強しようとおもう.

とても良い本に巡り会えた

性能試験についてもっと考えるべき点があると悶々と過ごしている中,自分なりに考えたり調査していた.同じようなことを先輩エンジニアの方々もやっているようで,サーバのリソース管理のツールや方法はWeb上にもかなりの量が転がっていることがわかったが,僕の知識不足のためにどれも納得できなかった.そんな時にこの本に出会った.

該当するページは4章の性能向上チューニングの部分だけだが,とても勉強になった.しょっぱなから推測するな,計測せよと胸に突き刺さるフレーズがあり自分にはピッタリだった.内容はそれほど目新しいものではないが,サーバの負荷,ボトルネックの特定方法が理路整然としており,なるほど確かにそうだ!と思わせてくれる.普段何気なく使っているvmstat,ps,sar,topなどのリソース監視系のコマンドの動作についても深いところまで触れている.以下ではボトルネックの特定手順を簡単にまとめようと思う.

サーバにかかっている負荷を知る

Linuxサーバの場合負荷をしるための情報はLinuxカーネルが持っている.良く使われるps,top,sarなどのコマンドはLinuxで管理されている情報を人の見やすい形に表示しているに過ぎない.負荷を知るということはカーネルの動作を理解するということに他ならない.これらのコマンドは多くの情報を一度に表示しているけど,ボトルネックの基本的な見極め方や負荷とは何なのかを理解していれば見る情報も限られてくる.ということで定石をまず覚えよう.

ボトルネックの見極め方

  1. ロードアベレージを確認する
  2. CPU,I/Oのどちらがボトルネックになっているのか確認する

1. ロードアベレージの確認方法

topもしくはuptimeコマンドのロードアベレージを確認する.ロードアベレージはシステム全体の負荷状況を示す値で,値が高ければ何らかの負荷がかかっていると言える.これだけでは何がボトルネックになっているかは特定できないけどはじめの取り掛かりに使える.また,ロードアベレージが低い時にサーバのパフォーマンスが悪い時は,リモートホストやネットワークなどの外的要因やミドルウェア,ソフトウェアの設定や不具合を疑うといい.

vagrant@vagrant-ubuntu-trusty-64:~$ top
top - 13:11:50 up 12:38,  2 users,  load average: 0.23, 0.09, 0.07
Tasks:  76 total,   2 running,  74 sleeping,   0 stopped,   0 zombie
%Cpu(s):  1.3 us, 19.3 sy,  0.0 ni, 76.0 id,  0.0 wa,  0.0 hi,  3.3 si,  0.0 s
KiB Mem:    501776 total,   390844 used,   110932 free,    52280 buffers
KiB Swap:        0 total,        0 used,        0 free.   207900 cached Mem

2. ボトルネックを特定する

CPUとI/Oどちらがボトルネックか確認する

vmstatもしくはsarでCPU負荷とI/O負荷情報を確認する.

vagrant@vagrant-ubuntu-trusty-64:~$ vmstat  1
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 3  0      0 111084  52292 207932    0    0     7     7   28  113  0  0 99  0  0
 0  0      0 111068  52292 207932    0    0     0     0   13   17  0  0 100  0  0
 0  0      0 111068  52292 207932    0    0     0     0   13   14  0  0 100  0  0
 0  0      0 111068  52292 207932    0    0     0     0   16   28  0  0 100  0  0
 0  0      0 111068  52292 207932    0    0     0     0   13   16  0  0 100  0  0
 0  0      0 111068  52292 207932    0    0     0     0   12   14  0  0 100  0  0
 0  0      0 111068  52292 207932    0    0     0     0   12   12  0  0 100  0  0
 0  0      0 111068  52292 207932    0    0     0     0    9   10  0  0 100  0  0
 0  0      0 111068  52292 207932    0    0     0     0   20   31  0  1 99  0  0
 0  0      0 111068  52292 207932    0    0     0     0   11   14  0  0 100  0  0
 0  0      0 111068  52292 207932    0    0     0     0   13   12  0  0 100  0  0

CPUがボトルネックだった場合

以下の手順でボトルネックを特定する.

  1. システム・プログラムとユーザプログラムどちらに起因するのかtopで確認
  2. psでプロセスの状態とCPU使用時間から原因となるプロセスを特定する
  3. さらに詳細調査をするにはstraceやoprofileを使う

I/Oがボトルネックだった場合

I/O負荷が高い時は,スワップによるディスクアクセスやプログラムからの入出力が原因である場合が多い.従って,スワップ発生に特に注意しながら,以下の手順でボトルネックを特定する.

  1. psで特定のプロセスが過剰にメモリを消費していないか調べる
  2. プログラムに不具合がないか調べる.あれば改善する.
  3. メモリの増設やサーバの分散設計を考える.

このように,ボトルネックを特定するときはまずはロードアベレージなどの総合的な情報を含んでいる情報から,CPU使用率,I/O待ち率などの具体的な数字を調査し,さらにプロセスの情報に目を向けていくなどトップダウンでサーバの状態を確認する戦略が有効です.これらの手順でなぜボトルネックの特定ができるのかは本の中で詳しく書かれているので是非読んで見て下さい.

他にも考える事はある

この記事では,CPUとI/Oがボトルネックになっている場合を例に挙げている.しかし,サーバのリソースとしてはメモリ,ファイル,ディスクリプタ,ポートなど他のリソースもある.vmstatなどの監視系のツールの使い方の定石は確認しつつ,統計値の示す値に応じて適切なボトルネックの特定を行っていきたい.

まとめ

サーバの性能を引き出すためのリソース管理方法と過負荷時のボトルネックの特定方法について簡単にまとめた.普段使っているコマンドも良く考えて使うことでこれまで以上に武器になることがわかった.たかが性能試験,されど学ぶことが沢山ある.エンジニアの世界は知れば知るほど奥が深い.まあ,だから面白いんだけど.今回学んだ知識を利用して性能試験を再度実施してみようと思う.vmstatとは昔からあるコマンドだけど,リソース監視系のコマンドも進化していると思うのでこれいいよ!ってものがあったら教えてくださいませ.