Lesson 8

リソースの管理

Lesson 8 Chapter 1
メモリーリソースの管理

はじめに

Lesson8では、Linuxでのリソース管理について解説します。 サーバーのリソース管理は、システムの障害を未然に防ぎ、安定稼働を実現するためにとても大切な事項です。 本レッスンでは、メモリー、CPU、ストレージ、I/Oのリソース管理方法について順を追って説明します。

メモリーとは

メモリーとはデータを一時的に保存するための記憶領域を指します。 同じようにデータを保存する物としてストレージがあります。 両者の違いは、ストレージが永続的にデータを保存する場所であるのに対して、 メモリーはデータの使用用途に応じて一時的にしかデータを保存しない点にあります。

身近なもので例えると、ストレージは本棚、メモリーは机ということが出来ます。 本棚には、持っている全ての本をしまうことが出来ます。本棚が広ければ、沢山の本をしまうことが出来ます。 他方、机には作業するのに必要な本を一時的に置くことが出来ます。机が広ければ沢山の本を同時に参照して快適に作業が出来ます。 Chapter1ではメモリーの使用状況を把握する方法をご紹介します。

free

メモリーの使用状況を確認するには、freeコマンドを使用します。 以下のように実行してください。

 $ free 
               total      used       free   shared  buff/cache   available
 Mem:        1014756    170068     704776     6904      139912      699816
 Swap:      16793656         0    1679356

「Mem」と記載されている1行目から、メモリーの使用量を把握することが出来ます。デフォルトだと単位はキロバイトで表されています。 「Swap」と記載された2行目は、「仮想メモリー」と呼ばれるもので、実体としてはハードディスクドライバの一部です。 これは、通常のメモリーが足りなくなった場合に、メモリーに記憶していたデータを一時的に仮想メモリーに退避させ、実際のメモリースペック以上の計算が出来るようにするためのものです。 上記で出力された項目の意味は、以下の表・図のとおりとなります。

項目 内容
total システムのメモリー合計
used 使用済みメモリー(total - free - buffers - cache)
free 未使用のメモリー
shared メモリーの内、tmpfs(メモリ上に作成される一時的なファイルシステム)として使うように割り当てられている領域
buff/cache buffersとcacheの合計
(buffers) メモリーの内、バッファとして使うように割り当てられている領域
(cache) メモリーの内、キャッシュとして使うように割り当てられている領域
available 実質的な空きメモリー(free + buff/cacheのうち解放可能な領域)

また、freeコマンドの主なオプションは以下になります。

オプション 内容
-b バイト単位で表示する
-m メガバイト単位で表示する
-t 物理メモリーとスワップの合計も追加表示する
-s 指定した間隔(秒)ごとに、繰り返し実行する

メモリー使用量の計算

上記freeコマンドの出力結果項目を用いて、メモリーの使用量を確認します。 メモリーの使用量とは、全体のメモリーのうち実行中のプログラムが占有している領域をパーセンテージで表記したものです。 メモリーの使用量の計算式は以下のとおりとなります。

 メモリー使用率 = {(total - available) / total } × 100

上で掲載したfreeコマンドの実行結果で出力された値を当てはめると、 「total」が1014756、「available」が699816ですので、メモリー使用量={(1014756-699816)/1014756} × 100 = 約31.036%となります。

既に学習したawkコマンドを用いて、メモリーの使用量を計算するコマンドを作ってみましょう。

 $ free 
               total      used       free   shared  buff/cache   available
 Mem:        1014756    170068     704776     6904      139912      699816
 Swap:      16793656         0    1679356
 $ free | awk '/Mem/{print (($2 - $7)/$2)*100 }' 
31.0609

上のコマンドでは、まず free |の部分で、freeコマンドの出力結果をパイプラインでawkコマンドに渡しています。 次に、awkコマンド中の'/Mem/の部分で、その出力結果の内から「Mem」と記載された行のみを抽出しています。 最後に、2列目($2)と7列目の($7)の計算結果を出力(print)しています。

以上より、メモリーの使用量が訳31パーセント程度だと分かります。 メモリー使用量は刻々と変化しているため、freeコマンドの実行結果である「total=1014756とavailable=699816」から計算したメモリー使用量(約31.036%)と、 「31.0609」は微妙に一致しませんが、メモリーの使用量を計算できていることを確認できると思います。

Lesson 8 Chapter 2
CPUリソースの管理

CPUとは

CPUとはコンピューター内の他の装置・回路の制御やデータの演算を行う装置です。 CPUの中でも実際に演算を行う中核部分をコアといいます。 コアの数は、一つしかない場合もあれば、複数の場合もあります。 コア数が一つの場合をシングルコア、複数の場合をマルチコアといいます。

先ほどメモリーを机で例えましたが、CPUは頭脳と例えることが出来ます。 脳のキャパシティーに余裕があれば、コンピューターに処理の重いプログラムを実行させることが出来ます。 Chapter2では、CPU使用率の確認方法についてご紹介します。

CPU使用率とは

CPU使用率とは、ある実行中のプログラムが、CPUの処理時間を占有している割合を指します。 実行状態にある個々のプログラムごとに計算したものを指す場合と、全てのプログラムの使用率の合計を指す場合があります。

mpstat

mpstatコマンドを使えばCPUの使用率を確認することができます。 mpstatはsysstatパッケージに収録されているため、インストールされていない場合は、下記コマンドでインストールして下さい。

$ yum install sysstat

これでmpstatコマンドが使用可能になりましたので、早速使って結果を見てみましょう。

 $ mpstat
 Linux 3.10.0-1062.9.1.el7.x86_64 (localhost.localdomain)   2022年11月10日  _x86_64_    (1 CPU)
 10:30:15 AM  CPU   %usr  %nice   %sys %iowait   %irq  %soft  %steal  %guest  %gnice   %idle
 10:30:15 AM  all   8.39   0.02   1.83    1.07   0.00   0.05    0.32    0.00    0.00   88.32

それぞれの意味については以下の表のとおりとなります。

項目 内容
CPU CPU番号。ALLの場合は、全CPUの平均値
%user アプリケーション実行中に発生したCPU使用率
%nice 実行優先度(nice値)によるユーザーレベルのCPU使用量
%sys カーネルでプログラム実行中に発生したCPU使用率
%iowait ディスクI/Oが処理中なため待機状態となっているCPUの使用率
%irq CPUのハードウェア割り込み実行時間割合
%soft CPUのソフトウェア割り込み実行時間割合
%steal 仮想CPUによる強制待ちで費やした時間の割合
%quest 仮想CPUによるシステム処理時間の割合
%gnice 仮想CPUによる実行優先度(nice値)で優先指定されたシステム処理時間の割合
%idle 待機状態となっているCPUの使用率で、ディスクI/Oが処理中でないもの

また、mpstatコマンドでは以下のオプションを指定できます。

オプション 内容
-P <CPU番号> 特定のCPUを指定して表示
-P ALL すべてのCPUを表示

mpstatコマンドにオプションを指定しないで実行した場合、CPUの項目は「ALL」と表示されますが、 オプションを指定することで、CPUのコアごとに使用率を表示させることが出来ます。 その場合、個別のCPUの項目は「ALL」ではなく、各「CPU番号」が表示されます。

以下のように実行してください。 筆者の環境ではCPUが一つのみであるため、オプションを指定しない場合と比べて、以下のように「0」と表示された行が一行追加されています。

 $ mpstat -P ALL
 Linux 3.10.0-1062.9.1.el7.x86_64 (localhost.localdomain)   2022年11月10日  _x86_64_    (1 CPU)
 10:30:15 AM  CPU   %usr  %nice   %sys %iowait   %irq  %soft  %steal  %guest  %gnice   %idle
 10:30:15 AM  all   8.39   0.02   1.83    1.07   0.00   0.05    0.32    0.00    0.00   88.32
 10:30:15 AM    0   8.39   0.02   1.83    1.07   0.00   0.05    0.32    0.00    0.00   88.32

vmstat

vmstatコマンドはCPU負荷状況、空きメモリー、ディスクI/Oといった情報を表示することが出来ます (ディスクI/Oについては最後のChapterでご説明します。)。以下のように実行してください。

 $ vmstat 
 procs  ---------------memory-------------  --swap--   ---io---  -system-- ------cpu----------
 r  b      swpd      free     buff   cache   si   so   bi    bo   in   cs  us  sy  id  wa  st
 9  0   3686448    251638        0   05516    1    3   53   153    0    0   8   4  88   0   0

ここで表示された値の意味は、以下のとおりです。

procs

内容
r 実行待ちになっているプロセス数
b 処理がスリープしているプロセス数

memory

内容
swap 使用されているスワップメモリー容量(バイト単位)
free 未使用のメモリー容量(バイト単位)
buff カーネルがバッファとして利用しているメモリー容量(バイト単位)
cache キャッシュとして使われるメモリー容量(バイト単位)

swap

内容
si スワップ領域から物理メモリーに書き戻している容量(バイト単位)
so 不要なデータを物理メモリーからスワップ領域に書き込んでいる容量(バイト単位)

io

内容
bi ハードデバイスからの読み取り容量(バイト単位)
bo ハードデバイスへの書き込み容量(バイト単位)

system

内容
in 1秒当たりのカーネルに対する割り込み処理回数。カーネルが行っていた処理を中断し、強制的に別の処理を行わせた回数。この値が大きいと、同時実行するプロセスが多いことが分かる。
cs 1秒当たりのコンテキストスイッチ回数。CPUが実行するプロセスを切り替えた回数。この値が大きいと、同時実行するプロセスが多いことが分かる。

cpu

内容
us アプリケーションによる通常のプログラムの実行でCPUが使用された時間の割合
sy カーネルによるプログラム実行でCPUが使用された時間の割合
id CPUが待機状態だったときの時間の割合。
wa ディスク・ネットワークへのデータの入出力でI/O待ちだった時間の割合
st ゲストOSがリソース要求を行ったが、CPUリソースを割り当てられなかった時間の割合

また、vmstatは引数を与えることでリアルタイムでCPU負荷状況等を確認することもできます。 以下のとおり実行して下さい。

 $ vmstat 10
 procs  ---------------memory-------------  --swap--   ---io---  -system-- ------cpu----------
 r  b      swpd      free     buff   cache   si   so   bi    bo   in   cs  us  sy  id  wa  st
 9  0   3686448    251638        0   05516    1    3   53   153    0    0   8   4  88   0   0

上記の例ではvmstatコマンドの後に引数として「10」を与えています。このようにすることで、10秒ごとに情報を表示してくれます。 コマンドをキャンセルしたいときは「Ctrl+C」で実行を中止することができます。

また、「〇秒間隔で〇回表示する」といったように、ある程度リアルタイムで負荷状況を確認したのち、自動でコマンドを停止させることもできます。 以下のように実行してください。「10」の後に「2」と指定することで、「10秒間隔で2回結果を表示」させることが出来ます。

 $ vmstat 10 2
 procs  ---------------memory-------------  --swap--   ---io---  -system-- ------cpu----------
 r  b      swpd      free     buff   cache   si   so   bi    bo   in   cs  us  sy  id  wa  st
 9  0   3686448    251638        0   05516    1    3   53   153    0    0   8   4  88   0   0
 9  0   3676554    251111        0   05516    0    1   53   211    0    1   8   4  88   0   0

このように、Linuxのパフォーマンスを確認したい場合にはvmstatコマンドが使われています。

Lesson 8 Chapter 3
ストレージの管理

ストレージとは

ストレージとは、データを保存する記憶領域です。Chapter1と重複しますが、ストレージとは本棚に例えることが出来ます。 ストレージの容量が大きければ、その分沢山のデータを保存することが出来ます。Chapter3では、ストレージの使用状況を把握する方法を紹介します。

df

dfコマンドは、ファイルシステムごとのストレージ使用状況を表示するコマンドです。 ファイルシステム「ごと」とはどのような意味でしょうか? Linuxではストレージを複数の領域に分割し、その分割単位ごとにファイルシステムを管理できるようになっています。 この分割単位のことを「パーテーション」と呼びます。 dfコマンドでは、パーテーションごとに、ストレージの使用状況を確認することが出来るのです。

dfコマンドの書式と主なオプションは以下です。 ディレクトリを指定しない場合、各ファイルシステムごとにストレージの使用状況が表示されます。 ディレクトリを指定した場合、そのディレクトリが所属するファイルシステムのストレージ使用状況を表示します。

df <オプション> <ディレクトリ>
オプション 内容
-h サイズに応じて読みやすい単位で表示
--total ストレージ全ての使用状況を表示

早速使っていきましょう。以下を実行してください。 すると、一番左の列に複数のファイルシステムが表示されています。 そして、各ファイルシステムごとに、そのストレージの使用状況が表示されています。

 $ df
 Filesystem                1K-blocks     Used  Available  Use%   Mounted on
 devtmpfs                     495436        0     495436    0%   /dev
 tmpfs                        507376        0     507376    0%   /dev/shm
 tmpfs                        507376     6900     500476    2%   /run
 tmpfs                        507376        0     507376    0%   /sys/fs/cgroup
 /dev/mapper/centos-root    14034944  1542584   12492360   11%   /
 /dev/sda1                   1038336   140188     898148   14%   /boot
 /tmpfs                       101476        0     101476    0%   /run/user/1000

「1k-blocks」と記載されている部分が、各ファイルシステムのストレージ容量、「Used」部分がストレージの使用量、「Available」部分がストレージの空き容量、 「Use%」部分がストレージの使用割合です。 また、「Mounted on」で記載されたディレクトリは同じ行に記載されたファイルシステムに繋がり、ファイルを共有しているという意味になります。

沢山のファイルシステムが出てきたため、筆者のホームディレクトリのストレージ使用状況が分かりづらいかもしれません。 そこでディレクトリを指定して再度dfコマンドを実行します。

以下のように実行すると、筆者のホームディレクトリは「/dev/mapper/centos-root」というファイルシステムに属し、そのファイルシステムはストレージを11%程使用していることがわかりました。

 $ df /home/vboxuser
 Filesystem                1K-blocks     Used  Available  Use%   Mounted on
 /dev/mapper/centos-root    14034944  1542584   12492360   11%   /

また、以下のように「-h」オプションを付けることで、読みやすい単位で表示することも出来ます。 今回はギガバイト単位で表示されています。

 $ df -h /home
 Filesystem                     Size     Used  Available  Use%   Mounted on
 /dev/mapper/centos-root         14G     1.4G        12G   11%   /

最後に、「--total」オプションを付けることで、全体のストレージ合計も表示することが出来ます。

 $ df --total
 Filesystem                1K-blocks     Used  Available  Use%   Mounted on
 devtmpfs                     495436        0     495436    0%   /dev
 tmpfs                        507376        0     507376    0%   /dev/shm
 tmpfs                        507376     6900     500476    2%   /run
 tmpfs                        507376        0     507376    0%   /sys/fs/cgroup
 /dev/mapper/centos-root    14034944  1542584   12492360   11%   /
 /dev/sda1                   1038336   140188     898148   14%   /boot
 /tmpfs                       101476        0     101476    0%   /run/user/1000
 total                      17192329  1689672   15502648   10%   -  

ストレージ管理に関する説明は以上です。

Lesson 8 Chapter 4
I/Oリソースの管理

I/Oとは

I/OとはInput/Outputの略で、「入出力」を意味します。 コンピュータにおいては一般的に、「メモリやCPU」と「ストレージ」間における、データの読込や書込を指します。 また、入出力を行う機器のことを、I/Oデバイスと呼びます。Chapter4では、I/Oデバイスの使用状況を把握する方法をご紹介します。

iostat

I/Oデバイスの使用状況を確認するには、iostatコマンドを使います。 このコマンドは、今まで学習してきたCPU使用率を表示しますが、その他にI/Oの使用率も出力します。 基本書式と代表的なオプションは以下のとおりです。

iostat <オプション> <表示間隔(秒)> <回数>
オプション 内容
-c CPU使用率のみ出力
-d I/Oデバイス使用率のみ出力
-k キロバイト毎秒で出力
-m メガバイト毎秒で出力

早速ですが、以下を実行してください。

 $ iostat 
 Linux 3.10.0-1160.el7.x86_64 (localhost.localdomain)   2022年11月10日  _x86_64_     (1 CPU)

 avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.02    0.00    0.11    0.01    0.00   99.86
  
 Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
 sda               0.57        11.90        11.72     202335     199270
 dm-0              0.50        11.20        11.60     190409     197202
 dm-1              0.01         0.13         0.00       2204          0

上記実行結果で表示された項目の意味は以下の表のとおりとなります。

CPU使用率(avg-cpu)についての項目

内容
%user アプリケーション実行中に発生したCPU使用率
%nice 実行優先度(nice値)によるユーザーレベルのCPU使用率
%system カーネルでプログラムを実行中に発生したCPU使用率
%iowait ディスクI/Oが処理中なため待機状態となっているCPUの使用率
%steal 仮想CPUによる強制待ちで費やした時間の割合
%idle 待機状態となっているCPUの使用率で、ディスクI/Oが処理中でないもの

I/Oデバイス使用率(Device)についての項目

内容
tps 1秒あたりのI/Oリクエスト数
kB_read/s 1秒あたりの読み込み量(キロバイト単位)
kB_wrtn/s 1秒あたりの書き込み量(キロバイト単位)
kB_read 合計読み込み量(キロバイト単位)
kB_wrtn 合計書き込み量(キロバイト単位)

先ほどのコマンド実行時には、オプションを指定しなかったため、CPU使用率(「avg-cpu」の箇所)とI/Oデバイス使用率(「Device」の箇所)の二つが出力されていました。 そこで「-d」オプションを付けることで、I/Oデバイス使用率のみを出力することができます。

 $ iostat -d 
 Linux 3.10.0-1160.el7.x86_64 (localhost.localdomain)   2022年11月10日  _x86_64_     (1 CPU)
  
 Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
 sda               0.55        11.14        11.05     202335     200630
 dm-0              0.48        10.40        10.93     190409     198562
 dm-1              0.01         0.12         0.00       2204          0

また、一定の間隔ごとに結果を出力することも出来ます。以下では、I/Oデバイス使用率を5秒間隔で計2回出力しています。

 $ iostat 5 2
 Linux 3.10.0-1160.el7.x86_64 (localhost.localdomain)   2022年11月10日  _x86_64_     (1 CPU)

 Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
 sda               0.56        11.65        11.50     202335     199732
 dm-0              0.49        11.96        11.38     190409     197664
 dm-1              0.01         0.13         0.00       2204          0
  
 Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
 sda               0.80         0.00         3.21          0         16
 dm-0              0.80         0.00         3.21          0         16
 dm-1              0.00         0.00         0.00          0          0

I/Oデバイスの管理についての説明は以上です。

終わりに

以上でLesson8を終了します。今回はリソース管理に関する様々なコマンドを学習しました。 次のレッスンでは、プログラムの実行と停止、その管理について学んでいきます。