# 第十章:監控CentOS的系統狀態
## 如何查看系統變量
- 執行`env`可以查看系統的環境變量,如主機的名稱、當前用戶的SHELL類型、當前用戶的家目錄、當前系統所使用的語言等。
- 執行`set`可以看到系統當前所有的變量,其中包括了:
- 系統的所有預設變量,這其中既包括了`env`所顯示的環境變量,也包含了其它許多預設變量。
- 用戶自定義的變量。
## 監控系統的狀態
### 使用w命令查看當前系統整體上的負載
使用`w`命令可以查看當前系統整體上的負載:
```
# w
20:33:11 up 309 days, 10:03, 1 user, load average: 0.00, 0.01, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 113.102.224.86 20:33 3.00s 0.00s 0.00s w
```
需要關注的是第一行的最后一個部分——**load average**,這里的3個數字分別表示了系統在1分鐘/5分鐘/15分鐘內的平均負載值,值越大說明服務器壓力就越大。
那么,如何看負載是不是太滿了呢?其實這個值是與服務器的物理CPU做對比的,那么只要負載值不超過物理CPU數量即可;如當前服務器有兩個CPU,那么就盡量不要讓負載值超過2。
### 用vmstat命令查看系統具體負載
`vmstat`命令打印的結果共分為6部分:procs、memory、swap、io、system和cpu,其中又有許多的細分字段,這里我們重點關注r、b、si、so、bi、bo、wa字段。
```
# vmstat 1 5
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 707116 15392 177284 0 0 81 5 110 267 0 0 99 1 0
0 0 0 707100 15392 177284 0 0 0 0 121 274 1 0 99 0 0
0 0 0 706712 15392 177284 0 0 0 0 107 254 0 1 99 0 0
0 0 0 706696 15392 177284 0 0 0 40 94 235 0 0 100 0 0
0 0 0 706712 15392 177284 0 0 0 0 93 231 0 0 100 0 0
```
- r(run):表示正在運行或等待CPU時間片的進程數,**該數值如果長期大于服務器CPU的個數,則說明CPU資源不夠用了**。
- b(block):表示等待資源(I/O、內存等)的進程數。舉個例子,當磁盤讀寫非常頻繁時,寫數據就會非常慢,此時CPU運算很快就結束了,但進程需要把計算的結果寫入磁盤,這樣進程的任務才算完成,因此這個任務只能慢慢等待磁盤了。**該數值如果長時間大于1,則需要查一下具體是缺的哪項資源**。
- si和so:分別表示由交換區寫入內存的數據量以及由內存寫入交換區的數據量;**一般情況下,si、so的值都為0,如果si、so的值長期不為0,則表示系統內存不足**,需要借用磁盤上的交換區,由于這往往對系統性能影響極大,因此需要考慮是否增加系統內存。
- bi和bo:分別表示從塊設備讀取數據的量和往塊設備寫入數據的量;**如果這兩個值很高,那么表示磁盤I/O壓力很大**。
- wa:表示I/O等待所占用CPU的時間百分比。**wa值越高,說明I/O等待越嚴重。如果wa值超過20%,說明I/O等待嚴重。**
另外,`vmstat`命令后可帶兩個數字,第一個數字表示每多少秒打印一次結果,第二個數字表示總共打印多少次結果;如果只有第一個數字,則會不停地打印結果,直到你終止該命令。
### 用top命令顯示進程所占的系統資源
`top`命令的結果有很多信息,但我們主要用它來監控進程所占的系統資源。top命令的結果每隔3秒變1次,它的特點是把占用系統資源(CPU、內存、磁盤I/O等)最高的進程放到最前面。
```
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 41060 3576 2396 S 0.0 0.4 0:00.89 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/0
```
這里面我們主要關注RES(所占內存大小)、%CPU、%MEM(占用內存的百分比)、COMMAND這4個字段。
另外,如果需要一次性打印系統資源的使用情況,可以使用`top - bn1`。
### 監控網卡流量
#### 使用sar命令查看網卡流量歷史記錄
使用`sar`命令前可能需要先進行安裝:`yum install -y sysstat`。
使用方法是:`sar -n DEV`,第一次使用時會報錯,因為還沒有生成相應的數據記錄。打印出來的結果里有很多字段,我們關注`rxpck/s`和`rxkB/s`。
- `rxpck/s`表示網卡每秒收取的包的數量,如果數值大于4000則考慮是被攻擊了。
- `rxkB/s`表示網卡每秒收取的數據量(單位為KB)。
#### 使用nload命令監控網卡實時流量
使用`nload`前需進行安裝:`yum install -y epel-release;yum install -y nload`。
使用起來也很簡單,直接使用`nload`命令則可動態顯示當前的網卡流入/流出的流量。
### 使用free命令查看內存使用狀況
為了檢查內存是否夠用,除了`vmstat`外,我們還可以使用更直接有效的`free`命令:`free -h`。
```
# free -h
total used free shared buff/cache available
Mem: 992M 141M 462M 516K 388M 714M
Swap: 1.0G 0B 1.0G
```
- total:內存總量,相當于used+free+buff/cache=used+available。
- used:已真正使用的內存量。
- free:剩余(未被分配)的內存量。
- shared:不關注。
- buff/cache:緩解CPU和I/O速度差距所用的內存緩存區,由系統預留出來備用,但如果剩余內存都不夠用了,那么這部分也是可以挪用出來供服務來使用的。
- available:可用內存,相當于free+buff/cache。
### 使用ps命令查看系統進程
與`top`命令類似,`ps`命令也是用來查看系統具體進程占用資源的情況;由于`top`命令本身是動態的,而`ps`命令是非動態的(相當于執行命令時的一個快照),因此`ps`命令的功能實際上更接近于`top -bn1`。
### 使用netstat命令查看網絡情況
`netstat`的功能非常強大,這里舉兩個實際使用場景:`netstat -lnp`(打印當前系統啟動哪些端口)和`netstat -an`(打印網絡連接狀況)。
```
# netstat -an
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
tcp 0 0 172.18.63.215:36492 140.205.140.205:80 ESTABLISHED
```
```
netstat -lnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 1604/mysqld
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1636/httpd
tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN 1639/vsftpd
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 674/sshd
tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN 1636/httpd
```