如何靈活運用Linux 進程資源監控和進程限制

導讀 每一個 Linux 系統管理員都應該知道如何驗證硬件、資源和主要進程的完整性和可用性。另外,基於每一個用戶設置資源限制也是其中一項必備技能。

在這篇文章中,咱們會介紹一些可以確保系統硬件和軟件正常工做的方法,這些方法可以避免潛在的會致使生產環境下線或錢財損失的問題發生。html

報告 Linux 進程統計信息

你能夠使用 mpstat 單獨查看每一個處理器或者系統總體的活動,能夠是每次一個快照或者動態更新。linux

爲了使用這個工具,你首先須要安裝 sysstatios

# yum update && yum install sysstat              [基於 CentOS 的系統]
# aptitutde update && aptitude install sysstat   [基於 Ubuntu 的系統]
# zypper update && zypper install sysstat        [基於 openSUSE 的系統]

你能夠在 Linux 中學習 Sysstat 和其中的工具 mpstat、pidstat、iostat 和 sar,瞭解更多和 sysstat 和其中的工具相關的信息。shell

安裝完 mpstat 以後,就能夠使用它生成處理器統計信息的報告。安全

你能夠使用下面的命令每隔 2 秒顯示全部 CPU(用-P ALL 表示)的 CPU 利用率(-u),共顯示3次。服務器

# mpstat -P ALL -u 2 3

示例輸出:ide

Linux 3.19.0-32-generic (tecmint.com)   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 (tecmint.com)   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 的輸出做比較:

LFCS 系列第十四講: Linux 進程資源用量監控和按用戶設置進程限制

正如你在上面圖示中看到的,在前面兩個例子中,根據%idle的值能夠判斷 CPU 0 負載很高。

在下一部分,咱們會討論如何識別資源飢餓型進程,如何獲取更多和它們相關的信息,以及如何採起恰當的措施。

Linux 進程報告

咱們能夠使用有名的ps命令,用-eo選項(根據用戶定義格式選中全部進程) 和--sort選項(指定自定義排序順序)按照 CPU 使用率排序列出進程,例如:

# ps -eo pid,ppid,cmd,%cpu,%mem --sort=-%cpu

上面的命令只會顯示PIDPPID、和進程相關的命令、 CPU 使用率以及 RAM 使用率,並按照 CPU 使用率降序排序。建立 .iso 文件的時候運行上面的命令,下面是輸出的前面幾行:
LFCS 系列第十四講: Linux 進程資源用量監控和按用戶設置進程限制

一旦咱們找到了感興趣的進程(例如PID=2822的進程),咱們就能夠進入/proc/PID(本例中是/proc/2822) 列出目錄內容。

這個目錄就是進程運行的時候保存多個關於該進程詳細信息的文件和子目錄的目錄。

例如:

/proc/2822/io:包括該進程的 IO 統計信息(IO 操做時的讀寫字符數)。

/proc/2822/attr/current:顯示了進程當前的 SELinux 安全屬性。

/proc/2822/cgroup:若是啓用了 CONFIGCGROUPS 內核設置選項,這會顯示該進程所屬的控制組(簡稱cgroups),你能夠使用下面命令驗證是否啓用了 CONFIGCGROUPS:

# cat /boot/config-$(uname -r) | grep -i cgroups

若是啓用了該選項,你應該看到:

CONFIG_CGROUPS=y

根據紅帽企業版 Linux 7 資源管理指南第一到四章的內容、openSUSE 系統分析和調優指南第九章、Ubuntu 14.04 服務器文檔Control Groups 章節,你能夠使用cgroups管理每一個進程容許使用的資源數目。

/proc/2822/fd這個目錄包含每一個打開的描述進程的文件的符號連接。下面的截圖顯示了 tty1(第一個終端) 中建立 .iso 鏡像進程的相關信息:

LFCS 系列第十四講: Linux 進程資源用量監控和按用戶設置進程限制

上面的截圖顯示 stdin(文件描述符 0)、stdout(文件描述符 1)、stderr(文件描述符 2) 相應地被映射到 /dev/zero/root/test.iso/dev/tty1

在 Linux 中爲每一個用戶設置資源限制

若是你不夠當心、讓任意用戶使用不受限制的進程數,最終你可能會遇到意外的系統關機或者因爲系統進入不可用的狀態而被鎖住。爲了防止這種狀況發生,你應該爲用戶能夠啓動的進程數目設置上限。

你能夠在 /etc/security/limits.conf 文件末尾添加下面一行來設置限制:* hard nproc 10
第一個字段能夠用來表示一個用戶、組或者全部人(*), 第二個字段強制限制能夠使用的進程數目(nproc) 爲 10。退出並從新登陸就能夠使設置生效。

而後,讓咱們來看看非 root 用戶(合法用戶或非法用戶) 試圖引發 shell fork 炸彈時會發生什麼。若是咱們沒有設置限制, shell fork 炸彈會無限制地啓動函數的兩個實例,而後無限循環地複製任意一個實例。最終致使你的系統卡死。

可是,若是使用了上面的限制,fort 炸彈就不會成功,但用戶仍然會被鎖在外面直到系統管理員殺死相關的進程。

LFCS 系列第十四講: Linux 進程資源用量監控和按用戶設置進程限制

提示limits.conf文件中能夠查看其它 ulimit 能夠更改的限制。

其它 Linux 進程管理工具

除了上面討論的工具, 一個系統管理員還可能須要:

a) 經過使用 renice 調整執行優先級(系統資源的使用)。這意味着內核會根據分配的優先級(衆所周知的 「niceness」,它是一個範圍從-20到19的整數)給進程分配更多或更少的系統資源。

這個值越小,執行優先級越高。普通用戶(而非 root)只能調高他們全部的進程的 niceness 值(意味着更低的優先級),而 root 用戶能夠調高或調低任何進程的 niceness 值。

renice 命令的基本語法以下:

# renice [-n] <new priority> <UID, GID, PGID, or empty> identifier

若是 new priority 後面的參數沒有(爲空),默認就是 PID。在這種狀況下,PID=identifier 的進程的 niceness 值會被設置爲<new priority>

b) 須要的時候中斷一個進程的正常執行。這也就是一般所說的「殺死」進程。實質上,這意味着給進程發送一個信號使它恰當地結束運行並以有序的方式釋聽任何佔用的資源。

按照下面的方式使用 kill 命令殺死進程:

# kill PID

另外,你也能夠使用pkill結束指定用戶(-u)、指定組(-G), 甚至有共同的父進程 ID (-P)的全部進程。這些選項後面能夠使用數字或者名稱表示的標識符。

# pkill [options] identifier

例如:

殺死組GID=1000的全部進程.

# pkill -G 1000

殺死PPID 是 4993的全部進程.

# pkill -P 4993

在運行pkill以前,先用pgrep測試結果、或者使用-l選項列出進程名稱是一個很好的辦法。它須要和pkill相同的參數、可是隻會返回進程的 PID(而不會有其它操做),而pkill會殺死進程。

# pgrep -l -u gacanepa

用下面的圖片說明:

LFCS 系列第十四講: Linux 進程資源用量監控和按用戶設置進程限制

總結

在這篇文章中咱們探討了一些監控資源使用的方法,以便驗證 Linux 系統中重要硬件和軟件組件的完整性和可用性。咱們也學習瞭如何在特殊狀況下采起恰當的措施(經過調整給定進程的執行優先級或者結束進程)。咱們但願本篇中介紹的概念能對你有所幫助。

本文地址:http://www.linuxprobe.com/linux-process-monitoring.html

相關文章
相關標籤/搜索