Linux学習記録　〜Linuxリソースの管理〜

# この記事
もやっとしたインフラ知識をスッキリさせていく方針で
Linuxの学習をしており、その記録をしていきます。

今回はLinuxのキャパシティプランニング分野です。
学習ベースは現在LinuCレベル２としてます。

学習に際して詰めが甘い部分もありますが、
Linuxお兄さん目指して精進します。


## About キャパシティプランニング
コンピュータリソースは、無限にあるわけではなく
節約してうまく運用していかねばならない

必要なハードウェアやクラウド上のリソースを見積もることが、一般的なキャパシティプランニングを指す

## 何をするのか

### リソースを知る、見積もる

リソースを予想するのは難しく、ピーク時に急激にリソース不足になることもある。

しかし、システム上の各プログラムがどれだけリソースを削るかのデータを収集すれば、将来の負荷をある程度まで見積もることはできる。

#### リソースの種類

主にCPU、メモリ、ディスクI/Oなどが挙げられる。
他にもネットワークI/O、スワップ利用率など。

Linuxにはこれらを知るためのツールやユーティリティが存在するので、**手段を知ること**が大事。

### リソースを調整する
システム上のリソースを設定調整することで、**性能の最適化**を目指す。
**パフォーマンスチューニング**といい、キャパシティプランニングとともに重要なこと。

## どうやるのか

システムリソースを知るために、Linuxではいくつかのコマンドが用意されている。
今回は代表的なtopコマンドを見てみる

### 現時点でのシステムリソースを知る

**topコマンド**

リアルタイムで実行中のプロセスを表示できる。

※これらはmanコマンドだったり、ググったりすればわかるので、覚える必要はないのだが
一度しっかり見ておくことで「ほー、こんなものなのか」と頭に入れておく

#### 1行目

<img width="1592" alt="LinuC_topL1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406764/a1bb7662-18b7-9e57-5104-39917b600f96.png">



1:現在日時(Linux上)
2:システム起動してからの経過時間
3:ログイン中のユーザー数
4:ロードアベレージ

**ロードアベレージ**は、システム全体の負荷状況。
直近1/5/15(分)の値であり、1CPUにおける(単位時間あたりの)実行待ちとディスクI/Oプロセス数。

つまり、現在動いてるプロセスと待ち状態のプロセスを足し合わせたシステムの負荷数値という感じ
１より高いと処理待ち中のプロセスがいる、のような判断材料。

※値はもちろんCPUのコア数によって違う。
16コアであれば、16.0 = CPU100%が続いた、ということ

ロードアベレージが高いときは、CPU使用率やディスクI/O（Input/Output）を見たりしていく。
勘で動くのではなく、数値計測をして原因を探るためのもの


#### 2行目

__プロセスの状態__
<img width="1559" alt="LinuC_topTASK.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406764/e7330d33-c423-cbc7-86ba-f7b3b553cb26.png">


1:総プロセス数
2:実行状態
3:スリープ状態
4:停止状態
5:ゾンビ状態

ゾンビ気になる。
プロセスは、PIDという番号を持っていて、プロセステーブルにエントリがあるが
プロセステーブルに残っているのにその実態が存在しない場合にゾンビプロセスと言われる

ゾンビプロセスのエントリを消すにはkillコマンドでPIDを指定すれば可能


#### 3行目

**CPUの状態**

<img width="1535" alt="LinuC_topCPU.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406764/2a364ae8-7575-800b-8855-84de3eb73694.png">


1:ユーザプロセスが、CPUを使用している時間割合
us: user 

2:カーネルが、CPUを使用している時間割合
sy: system

3:**優先度が変更されたプロセス**が、CPUを使用している時間割合
ni: nice
→プログラムを実行する優先度をnice値といい、rootユーザのみが変更できる

4:CPUがアイドル状態の時間割合
id: idle

5:ディスクI/O待ちの時間の割合
wa: io-wait

6:ハードウェア割込み要求時間の割合
hi: hardwareirq

7:ソフトウェア割込み要求時間の割合
si: softwareirq

8:**ゲストOSがCPUを割り当てられなかった時間の割合**
st: steal
→AWS EC2など、仮想環境でゲストOSが要求しても割り当ててもらえなかったので待機した時間割合
以前、EC2で何故か重くて原因がこいつだったことがあった（T2インスタンス）
T系インスタンスはCPUクレジットが関連することもあり。

#### 4,5行目
![LPIC2-1-L45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406764/7bd6bf37-78f9-0ae4-e31e-3cf9ede7a696.png)

**メモリとスワップの状態**

４行目は、
全物理メモリ量、空きメモリ量、使用中メモリ量、バッファ/キャッシュサイズ。

５行目は、
スワップ領域サイズ、空き、使用中、メモリ不足時に利用可能な物理メモリ量。

Linuxメモリは、以下のようなものとなる
使用中のメモリ：カーネルが通常利用するメモリ
キャッシュ：ストレージとの高速なI/Oのために使用する
空きメモリ：残っている限り、キャッシュが使用していく容量
スワップ：使用メモリが実メモリ数を上回った際に使用される、ストレージ側の容量。ストレージで使用しているのでもちろんI/Oは遅い


#### タスクエリア


![LPIC2-1-L6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406764/3fd2ee45-1ccd-b296-4229-b46a7831c89b.png)


PID: プロセスID
USER: ユーザー名
PR: 実行静的優先度
NI: nice値（相対優先度）
VIRT: 使用中仮想メモリ値(KB)、ただしスワップ含む
RES: 使用中実メモリ(KB)、スワップなし
SHR: 共有メモリ(KB)
　共有というのは、他のプロセスとの共有しているメモリを指す
S: プロセスの状態
　割り込み不能、実行中、ゾンビなどの状態を文字で表す

%CPU: CPU使用率
%MEM: 物理メモリの使用率
TIME+: プロセス開始からのCPU時間合計
COMMAND: 実行コマンド
このあたりは特に、例えばMac上のアクティビティモニタでも戦闘に表示される内容
（よくブラウザのスレッド数やCPU時間を見て反省する）


topコマンドの表示は、表示やソートを切り替えることが出来る。
メモリ使用率を確認する際に'm'を2度押して、グラフ表示に変えたりしている


デフォルト時
![スクリーンショット 2020-11-28 14.12.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406764/c7119a1c-589a-d81b-7bd3-bcd5970ac644.png)

メモリのグラフ表示
![スクリーンショット 2020-11-28 14.12.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406764/9da01320-ebb1-1df4-8c4b-193fd369d0e7.png)


'f'を押すと、表示する項目を選択可能になる
![スクリーンショット 2020-11-28 14.14.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406764/ca6ddb3f-78a2-dd59-86c7-a08306131914.png)


他にチェックしたいコマンドとして、vmstat, sar, w等が挙げられる。


### リソースを分析する
システムリソースの分析、予測をするためには、これらコマンドの結果を比較したり、よりわかりやすく可視化するために
監視ツールを使用することが一般的である

監視ツールを導入すると、継続的にデータを取得することが出来るため、
キャパシティの限界値に達する前に予測をする事ができるようになる

#### CPU
平均負荷のみを眺めるのではなく、システム使用率、ユーザーごとの使用率から、
**システムのどの部分にCPU負荷がかかっているのか**を分析する。

#### メモリ
**稼働時間が長くなるほど空きメモリ自体はなくなる**のが一般的であるため、
空きメモリではなく**スワップ使用状況**なども確認する。
スワップは使用メモリが実メモリ数を上回った際に使用されるため、**恒常的に使用されているならば増設が必要**。
スワップ領域の確認には**vmstat, free**コマンドを活用できる。

#### ディスク
I/Oは、パーテイション別に見て特定の部分に負荷がかかっていないか等、ボトルネックを探す。
ディスク容量自体の増加は、アラートを設定しておき、**必要なストレージ容量を予測**する。
**ログファイルがたまり続けていないか**なども確認する。

## まとめ
今回はキャパシティプランニングについて少しまとめました。
まだあまり使ったことないコマンドもあるので、この記事あるいは別記事に増やしていきます。

次はカーネルについての内容をまとめます。