LFCS: Linux プロセスのリソース使用状況を監視し、ユーザーごとにプロセス制限を設定する - パート 14
2016 年 2 月 2 日から発効する LFCS 認定試験の目標の最近の変更により、ここで公開されている LFCS シリーズに必要な記事を追加しています。この試験の準備をするには、LFCE シリーズも受講することを強くお勧めします。
すべての Linux システム管理者は、ハードウェア、リソース、および主要なプロセスの整合性と可用性を検証する方法を知る必要があります。さらに、ユーザーごとにリソース制限を設定することも、ユーザーのスキルセットの一部である必要があります。
この記事では、システムのハードウェアとソフトウェアの両方が正しく動作していることを確認し、予期しない生産ダウンタイムや金銭的損失を引き起こす可能性のある潜在的な問題を回避するためのいくつかの方法を検討します。
Linux レポートプロセッサ統計
mpstat を使用すると、各プロセッサのアクティビティを個別に表示したり、システム全体を 1 回限りのスナップショットまたは動的に表示したりできます。
このツールを使用するには、sysstat をインストールする必要があります。
# yum update && yum install sysstat [On CentOS based systems]
aptitutde update && aptitude install sysstat [On Ubuntu based systems]
zypper update && zypper install sysstat [On openSUSE systems]
sysstat とそのユーティリティについて詳しくは、Linux の Sysstat とそのユーティリティ mpstat、pidstat、iostat、sar をご覧ください。
mpstat をインストールしたら、それを使用してプロセッサ統計のレポートを生成します。
すべての CPU (-P
ALL で示される) の CPU 使用率 (-u
) に関する 3 個のグローバル レポートを 2 秒間隔で表示するには、 する:
# mpstat -P ALL -u 2 3
サンプル出力
Linux 3.19.0-32-generic (linux-console.net) Wednesday 30 March 2016 _x86_64_ (4 CPU)
11:41:07 IST CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
11:41:09 IST all 5.85 0.00 1.12 0.12 0.00 0.00 0.00 0.00 0.00 92.91
11:41:09 IST 0 4.48 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.00 94.53
11:41:09 IST 1 2.50 0.00 0.50 0.00 0.00 0.00 0.00 0.00 0.00 97.00
11:41:09 IST 2 6.44 0.00 0.99 0.00 0.00 0.00 0.00 0.00 0.00 92.57
11:41:09 IST 3 10.45 0.00 1.99 0.00 0.00 0.00 0.00 0.00 0.00 87.56
11:41:09 IST CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
11:41:11 IST all 11.60 0.12 1.12 0.50 0.00 0.00 0.00 0.00 0.00 86.66
11:41:11 IST 0 10.50 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.00 88.50
11:41:11 IST 1 14.36 0.00 1.49 2.48 0.00 0.00 0.00 0.00 0.00 81.68
11:41:11 IST 2 2.00 0.50 1.00 0.00 0.00 0.00 0.00 0.00 0.00 96.50
11:41:11 IST 3 19.40 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.00 79.60
11:41:11 IST CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
11:41:13 IST all 5.69 0.00 1.24 0.00 0.00 0.00 0.00 0.00 0.00 93.07
11:41:13 IST 0 2.97 0.00 1.49 0.00 0.00 0.00 0.00 0.00 0.00 95.54
11:41:13 IST 1 10.78 0.00 1.47 0.00 0.00 0.00 0.00 0.00 0.00 87.75
11:41:13 IST 2 2.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.00 97.00
11:41:13 IST 3 6.93 0.00 0.50 0.00 0.00 0.00 0.00 0.00 0.00 92.57
Average: CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
Average: all 7.71 0.04 1.16 0.21 0.00 0.00 0.00 0.00 0.00 90.89
Average: 0 5.97 0.00 1.16 0.00 0.00 0.00 0.00 0.00 0.00 92.87
Average: 1 9.24 0.00 1.16 0.83 0.00 0.00 0.00 0.00 0.00 88.78
Average: 2 3.49 0.17 1.00 0.00 0.00 0.00 0.00 0.00 0.00 95.35
Average: 3 12.25 0.00 1.16 0.00 0.00 0.00 0.00 0.00 0.00 86.59
特定のCPU (次の例ではCPU 0) の同じ統計を表示するには、次のコマンドを使用します。
# mpstat -P 0 -u 2 3
サンプル出力
Linux 3.19.0-32-generic (linux-console.net) Wednesday 30 March 2016 _x86_64_ (4 CPU)
11:42:08 IST CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
11:42:10 IST 0 3.00 0.00 0.50 0.00 0.00 0.00 0.00 0.00 0.00 96.50
11:42:12 IST 0 4.08 0.00 0.00 2.55 0.00 0.00 0.00 0.00 0.00 93.37
11:42:14 IST 0 9.74 0.00 0.51 0.00 0.00 0.00 0.00 0.00 0.00 89.74
Average: 0 5.58 0.00 0.34 0.85 0.00 0.00 0.00 0.00 0.00 93.23
上記のコマンドの出力には、次の列が表示されます。
CPU
: 整数としてのプロセッサ番号、またはすべてのプロセッサの平均としての単語 all。%usr
: ユーザー レベルのアプリケーションの実行中の CPU 使用率のパーセンテージ。%nice
:%usr
と同じですが、nice が優先されます。%sys
: カーネル アプリケーションの実行中に発生した CPU 使用率のパーセンテージ。これには、割り込みの処理やハードウェアの処理に費やされる時間は含まれません。%iowait
: 指定された CPU (またはすべて) がアイドル状態だった時間の割合。その間、その CPU 上でリソースを大量に消費する I/O 操作がスケジュールされていました。より詳細な説明 (例付き) は、ここでご覧いただけます。%irq
: ハードウェア割り込みの処理に費やされた時間の割合。%soft
:%irq
と同じですが、ソフトウェア割り込みが含まれます。%steal
: ゲストとしての仮想マシンが CPU を獲得するために競合しているときにハイパーバイザーの注意を「獲得」しているときに、非自発的な待機に費やされた時間 (スチールまたはスチール時間) の割合。この値はできるだけ小さく保つ必要があります。このフィールドの値が高い場合は、仮想マシンが停止しているか、まもなく停止することを意味します。%guest
: 仮想プロセッサの実行に費やされた時間の割合。%idle
: CPU がタスクを実行していなかった時間の割合。この列の値が低い場合は、システムに高い負荷がかかっていることを示しています。その場合、後で説明するように、プロセス リストを詳しく調べて、原因を特定する必要があります。
プロセッサにある程度の高い負荷をかけるには、次のコマンドを実行してから、別のターミナルで mpstat (示されているように) を実行します。
# dd if=/dev/zero of=test.iso bs=1G count=1
mpstat -u -P 0 2 3
ping -f localhost # Interrupt with Ctrl + C after mpstat below completes
mpstat -u -P 0 2 3
最後に、「通常の」状況での mpstat の出力と比較します。
上の画像からわかるように、%idle
列で示されているように、最初の 2 つの例では CPU 0 に高い負荷がかかっていました。
次のセクションでは、これらのリソースを大量に消費するプロセスを特定する方法、それらに関する詳細情報を取得する方法、および適切なアクションを実行する方法について説明します。
Linux プロセスのレポート
CPU 使用率でソートしてプロセスを一覧表示するには、よく知られている ps
コマンドと -eo
(ユーザー定義の形式ですべてのプロセスを選択するため) および を使用します。 --sort
(カスタムの並べ替え順序を指定する) オプション。次のようになります。
# ps -eo pid,ppid,cmd,%cpu,%mem --sort=-%cpu
上記のコマンドは、PID
、PPID
、プロセスに関連付けられたコマンド、および CPU 使用率の降順で並べ替えられた CPU と RAM の使用率のみを表示します。 。 .iso ファイルの作成中に実行すると、出力の最初の数行は次のようになります。
対象のプロセス (PID=2822
など) を特定したら、/proc/PID
(/proc/2822
) に移動できます。この場合は )、ディレクトリのリストを作成します。
このディレクトリには、この特定のプロセスの実行中に、そのプロセスに関する詳細情報が含まれるいくつかのファイルとサブディレクトリが保存されます。
例えば:
/proc/2822/io
には、プロセスの IO 統計 (特に、IO 操作中に読み書きされた文字数とバイト数) が含まれています。/proc/2822/attr/current
は、プロセスの現在の SELinux セキュリティ属性を示します。/proc/2822/cgroup
は、CONFIG_CGROUPS カーネル構成オプションが有効になっている場合にプロセスが属する制御グループ (略して cgroups) を記述します。これは次のコマンドで確認できます。
# cat /boot/config-$(uname -r) | grep -i cgroups
このオプションが有効になっている場合は、次のように表示されます。
CONFIG_CGROUPS=y
cgroups
を使用すると、『Red Hat Enterprise Linux 7 リソース管理ガイド』の第 1 章から第 4 章、『openSUSE システム分析』の第 9 章で説明されているように、プロセスごとに許可されたリソース使用量を管理できます。およびチューニング ガイド、および Ubuntu 14.04 サーバー ドキュメントの「コントロール グループ」セクションに記載されています。
/proc/2822/fd
は、プロセスが開いたファイル記述子ごとに 1 つのシンボリック リンクを含むディレクトリです。次の画像は、.iso イメージを作成するために tty1 (最初の端末) で開始されたプロセスの情報を示しています。
上の画像は、stdin (ファイル記述子 0)、stdout (ファイル記述子 1)、および を示しています。 >stderr (ファイル記述子 2) は /dev/zero、/root/test.iso、および にマッピングされます。 >/dev/tty1となります。
/proc
の詳細については、Kernel.org によって保管および管理されている「The /proc
filesystem」ドキュメントと、Linux Programmer's Manual を参照してください。
Linux でユーザーごとにリソース制限を設定する
注意を怠り、任意のユーザーに無制限のプロセスの実行を許可すると、最終的には予期しないシステムのシャットダウンが発生したり、システムが使用不能な状態になってロックアウトされたりする可能性があります。これを防ぐには、ユーザーが開始できるプロセスの数に制限を設ける必要があります。
これを行うには、/etc/security/limits.conf を編集し、ファイルの最後に次の行を追加して制限を設定します。
* hard nproc 10
最初のフィールドは、ユーザー、グループ、またはそのすべて (*)
を示すために使用できます。一方、2 番目のフィールドは、プロセス (nproc) の数にハード制限を適用し、 10 個です。変更を適用するには、ログアウトして再度ログインするだけで十分です。
したがって、root 以外の特定のユーザー (正規ユーザーかどうか) がシェル フォーク ボムを開始しようとした場合に何が起こるかを見てみましょう。制限を実装していなかった場合、最初に関数の 2 つのインスタンスが起動され、その後、それらのそれぞれが無限ループで複製されます。したがって、最終的にはシステムが最悪の状態に陥ることになります。
ただし、上記の制限が適用されていると、フォーク ボムは成功しませんが、システム管理者がそれに関連付けられたプロセスを強制終了するまで、ユーザーは引き続きロックアウトされます。
ヒント: ulimit によって可能になるその他の制限については、limits.conf
ファイルに記載されています。
Linux その他のプロセス管理ツール
前述のツールに加えて、システム管理者は次のことも必要になる場合があります。
a) renice を使用してプロセスの実行優先度 (システム リソースの使用) を変更します。これは、カーネルが、割り当てられた優先順位 (-20
から19
)。
値が小さいほど実行優先度が高くなります。通常のユーザー (root 以外) は、自分が所有するプロセスの niceness をより高い値 (実行優先順位が低いことを意味します) にのみ変更できますが、root はどのプロセスでもこの値を変更でき、増減することができます。
renice の基本的な構文は次のとおりです。
# renice [-n] <new priority> <UID, GID, PGID, or empty> identifier
新しい優先順位値の後の引数が存在しない (空) 場合、デフォルトで PID に設定されます。この場合、PID=identifier を持つプロセスのniceness は
に設定されます。
b) 必要に応じて、プロセスの通常の実行を中断します。これは一般にプロセスの「強制終了」として知られています。内部的には、これはプロセスにシグナルを送信して、実行を適切に終了し、使用されているリソースを秩序ある方法で解放することを意味します。
プロセスを強制終了するには、次のように kill コマンドを使用します。
# kill PID
あるいは、pkill を使用して、特定の所有者 (-u)
またはグループ所有者 (-G)
のすべてのプロセス、あるいは PPID を持つプロセスを終了することもできます。共通 (-P)
。これらのオプションの後には、識別子として数値表現または実際の名前が続く場合があります。
# pkill [options] identifier
例えば、
# pkill -G 1000
GID=1000 のグループが所有するすべてのプロセスを強制終了します。
そして、
# pkill -P 4993
PPID が 4993 であるすべてのプロセスを強制終了します。
pkill を実行する前に、最初に pgrep で結果をテストし、おそらく -l
オプションも使用して、プロセスの名前。同じオプションを使用しますが、pkill が使用された場合に強制終了されるプロセスの PID のみを返します (それ以上のアクションは実行されません)。
# pgrep -l -u gacanepa
これを次の図に示します。
まとめ
この記事では、Linux システム内の重要なハードウェアおよびソフトウェア コンポーネントの整合性と可用性を検証するために、リソースの使用状況を監視するいくつかの方法を検討しました。
また、異常な状況下で適切なアクション (特定のプロセスの実行優先順位を調整するか、プロセスを終了する) を実行する方法も学びました。
このチュートリアルで説明した概念がお役に立てば幸いです。ご質問やご意見がございましたら、以下のお問い合わせフォームを使用してお気軽にお問い合わせください。