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