1. 程式人生 > 其它 >第一章 監控系統入門

第一章 監控系統入門

一、監控系統概述

1.什麼是監控?

伺服器監控是實時掌握伺服器工作狀態,並在需要時可以隨時呼叫監控記錄進行檢視。
網站監控是通過軟體或者網站監控服務提供商對網站進行監控以及資料的獲取從而達到網站的排錯和資料的分析。

監控系統是整個運維環節,乃至整個產品生命週期中最重要的一環,事前及時預警發現故障,事後提供翔實的資料用於追查定位問題。

2.為什麼要做監控?

#1.生活中:
1)超市監控:防內外偷
2)交通監控:測速,違章
#2.企業中:
1)系統的監控:實際上是對系統不間斷的實時監控
2)實時反饋系統當前狀態:我們監控某個硬體、或者某個系統,都是需要能實時看到當前系統的狀態,是正常、異常、或者故障。
3)保證服務可靠性安全性:我們監控的目的就是要保證系統、服務、業務正常執行
4)保證業務持續穩定執行:如果我們的監控做得很完善,即使出現故障,能第一時間接收到故障報警,在第一時間處理解決,從而保證業務持續性的穩定執行。(往往,第一時間知道業務宕機的都是使用者)

3.監控怎麼來實現?

1.CACTI(網路監控)

2.NAGIOS(系統監控)

3.ZABBIX(分散式監控)

4.open-falcon(小米監控產品)

5.普羅米修斯(監控docker,K8S)

6.lepus天兔(資料庫監控)

二、常用監控軟體對比

其實,在 Prometheus 之前,市面已經出現了很多的監控系統,如 Zabbix、Open-Falcon、Nagios 等。那麼 Prometheus 和這些監控系統有啥異同呢?我們先簡單回顧一下這些監控系統。

1.zabbix

Zabbix 是一款企業級的分散式開源監控方案。它由 Alexei Vladishev 建立,由 Zabbix SIA 在持續開發和支援。Zabbix 能夠監控網路引數,伺服器健康和軟體完整性。它提供通知機制,允許使用者配置告警,從而快速反饋問題。基於儲存的資料,Zabbix 提供報表和資料視覺化,並且支援主動輪詢和被動捕獲。它的所有報告、統計資訊和配置引數都可以通過 Web 頁面訪問。
	
Zabbix 核心元件主要是 Agent 和 Server。其中 Agent 主要負責採集資料並通過主動或者被動的方式將採集資料傳送到 Server/Proxy。除此之外,為了擴充套件監控項,Agent 還支援執行自定義指令碼。Server 主要負責接收 Agent 傳送的監控資訊,並進行彙總儲存、觸發告警等。
	
Zabbix Server 將收集的監控資料儲存到 Zabbix Database 中。Zabbix Database 支援常用的關係型資料庫,如MySQL、PostgreSQL、Oracle 等(預設是 MySQL),並提供 Zabbix Web 頁面(PHP 編寫)資料查詢。由於使用了關係型資料儲存時序資料,Zabbix在監控大規模叢集時常常在資料儲存方面捉襟見肘。所以從 4.2 版本後 Zabbix開始支援 TimescaleDB 時序資料庫,不過目前成熟度還不高。

Zabbix 由 Server,Agent,Proxy(可選項)組成:
	Agent 負責收集資料,並且傳輸給 Server。
	Server 負責接受 Agent 的資料,進行儲存或者告警。
	Proxy 負責代理 Server 收集 Agent 傳輸的資料,並且轉發給 Server。Proxy 是安裝在被監控的伺服器上的,用來和 Server 端進行通訊,從而傳輸資料。
Zabbix 的資料採集,主要有兩種模式:Server 主動拉取資料和 Agent 主動上報資料。以 Server 拉取資料為例,使用者在 Web-portal 中,設定需要監控的機器,配置監控項,告警策略。Zabbix-Server 會根據策略主動獲取 Agent 的資料,然後儲存到 MySQL 中。

同時根據使用者配置的策略,判定是否需要告警。使用者可以在 Web 端,以圖表的形式,檢視各種指標的歷史趨勢。
在 Zabbix 中,將 Server 主動拉取資料的方式稱之為 Active Check。這種方式配置起來較為方便,但是會對 ZabbixServer 的效能存在影響。

所以在生產環境中,一般會選擇主動推送資料到 Zabbix-Server 的方式,稱之為 Trapper。即使用者可以定時生成資料,再按照 Zabbix 定義的資料格式,批量傳送給 Zabbix-Server,這樣可以大大提高 Server的處理能力。

Proxy,作為可選項,起到收集 Agent 資料並且轉發到 Server 的作用。當 Server 和 Agent 不在一個網路內,就需要使用 Proxy 做遠端監控,特別是遠端網路有防火牆的時候。同時它也可以分擔 Server 的壓力,降低 Server 處理連線數的開銷。

隨著雲端計算,彈性計算,容器器技術,SaaS等IT形態的出現,Zabbix已經無法覆蓋這些監控,或者只能通過相容的方式實現對其監控,如在一個主機上去監控這些物件,而這些物件則變成了主機的某個指標。

2.open-falcon

Open-Falcon 是小米開源的企業級監控工具,用 Go 語言開發而成。這是一款靈活、可擴充套件並且高效能的監控方案, 包括小米、滴滴、美團等在內的網際網路公司都在使用它。它的主要元件包括: 
1.Falcon-agent:
這是用 Go 語言開發的 Daemon 程式,執行在每臺 Linux 伺服器上,用於採集主機上的各種指標數 據,主要包括 CPU、記憶體、磁碟、檔案系統、核心引數、Socket 連線等,目前已經支援 200 多項監控指標。並且, Agent 支援使用者自定義的監控指令碼。

2.Hearthbeat server:
簡稱 HBS 心跳服務。每個 Agent 都會週期性地通過 RPC 方式將自己的狀態上報給 HBS,主 要包括主機名、主機 IP、Agent 版本和外掛版本,Agent 還會從 HBS 獲取自己需要執行的採集任務和自定義外掛。

3.Transfer:
負責接收 Agent 傳送的監控資料,並對資料進行整理,在過濾後通過一致性 Hash 演算法傳送到 Judge 或 者 Graph。 

4.Graph:
這是基於 RRD 的資料上報、歸檔、儲存元件。Graph 在收到資料以後,會以 rrdtool 的資料歸檔方式來存 儲,同時提供 RPC 方式的監控查詢介面。 

5.Judge 告警模組:
Transfer 轉發到 Judge 的資料會觸發使用者設定的告警規則,如果滿足,則會觸發郵件、微信或者 回撥介面。這裡為了避免重複告警引入了 Redis 暫存告警,從而完成告警的合併和抑制。 

6.Dashboard:
這是面向使用者的監控資料查詢和告警配置介面。

3.nagios

Nagios 原名為 NetSaint,由 Ethan Galstad 開發並維護。Nagios 是一個老牌監控工具,由 C 語言編寫而成,主要針對主機監控(CPU、記憶體、磁碟等)和網路監控(SMTP、POP3、HTTP 和 NNTP 等),當然也支援使用者自定義的監控指令碼。

它還支援一種更加通用和安全的採集方式:NREP(Nagios Remote Plugin Executor)。它會先在遠端啟動一個NREP 守護程序,用於在遠端主機上執行檢測命令,在 Nagios 服務端用 check nrep 的 plugin 外掛通過 SSL 對接到NREP 守護程序執行相應的監控行為。相比 SSH 遠端執行命令的方式,這種方式更加安全。

4.Prometheus(普羅米修斯)

隨著這幾年雲環境的發展,Prometheus 被廣泛地認可。它的本質是時間序列資料庫,而 Zabbix 採用 MySQL 進行資料儲存。

從上面我們對時間序列資料庫的分析來看,Prometheus 能夠很好地支援大量資料的寫入。它採用拉的模式(Pull)從應用中拉取資料,並通過 Alert 模組實現監控預警。據說單機可以消費百萬級時間序列。

一起來看看 Prometheus 的幾大元件:
1.Prometheus Server,用於收集和儲存時間序列資料,負責監控資料的獲取,儲存以及查詢。

2.監控目標配置,Prometheus Server 可以通過靜態配置管理監控目標,也可以配合 Service Discovery(K8s,DNS,Consul)實現動態管理監控目標。

3.監控目標儲存,Prometheus Server 本身就是一個時序資料庫,將採集到的監控資料按照時間序列儲存在本地磁碟中。

4.監控資料查詢,Prometheus Server 對外提供了自定義的 PromQL 語言,實現對資料的查詢以及分析。

5.Client Library,客戶端庫。為需要監控的服務生成相應的 Metrics 並暴露給 Prometheus Server。

6.當 Prometheus Server 來 Pull 時,直接返回實時狀態的 Metrics。通常會和 Job 一起合作。

7.Push Gateway,主要用於短期的 Jobs。由於這類 Jobs 存在時間較短,可能在 Prometheus 來 Pull 之前就消失了。為此,這些 Jobs 可以直接向 Prometheus Server 端推送它們的 Metrics。

8.Exporters,第三方服務介面。將 Metrics(資料集合)傳送給 Prometheus。

9.Exporter 將監控資料採集的端點,通過 HTTP 的形式暴露給 Prometheus Server,使其通過 Endpoint 端點獲取監控資料。

10.Alertmanager,從 Prometheus Server 端接收到 Alerts 後,會對資料進行處理。例如:去重,分組,然後根據規則,發出報警。

11.Web UI,Prometheus Server 內建的 Express Browser UI,通過 PromQL 實現資料的查詢以及視覺化。
說完了 Prometheus 的元件,再來看看 Prometheus 的架構:
Prometheus Server 定期從 Jobs/Exporters 中拉 Metrics。同時也可以接收來自 Pushgateway 發過來的 Metrics。

Prometheus Server 將接受到的資料儲存在本地時序資料庫,並執行已定義好的 alert.rules(告警規則),一旦滿足告警規則就會向 Alertmanager 推送警報

Alertmanager 根據配置檔案,對接收到的警報進行處理,例如:發出郵件告警,或者藉助第三方元件進行告警。

WebUI/Grafana/APIclients,可以藉助 PromQL 對監控資料進行查詢。

5.綜合對比

綜合對比如上面的表格,
從開發語言上看,為了應對高併發和快速迭代的需求,監控系統的開發語言已經慢慢從 C語言轉移到 Go。不得不說,Go 憑藉簡潔的語法和優雅的併發,在 Java 佔據業務開發、C 佔領底層開發的情況下,準確定位中介軟體開發需求,在當前開源中介軟體產品中被廣泛應用。

從系統成熟度上看,Zabbix 和 Nagios 都是老牌的監控系統:Nagios 是在 1999 年出現的,Zabbix 是在 1998 年出現的,系統功能比較穩定,成熟度較高。而 Prometheus 和 Open-Falcon 都是最近幾年才誕生的,雖然功能還在不斷迭代更新,但站在巨人的肩膀之上,在架構設計上借鑑了很多老牌監控系統的經驗。

從系統擴充套件性方面看,Zabbix 和 Open-Falcon 都可以自定義各種監控指令碼,並且 Zabbix 不僅可以做到主動推送,還可以做到被動拉取。Prometheus 則定義了一套監控資料規範,並通過各種 exporter 擴充套件系統採集能力。

從資料儲存方面來看,Zabbix 採用關係資料庫儲存,這極大限制了 Zabbix 的採集效能;Nagios 和 Open-Falcon 都採用RDD 資料儲存,Open-Falcon 還加入了一致性 hash 演算法分片資料,並且可以對接到 OpenTSDB;而Prometheus 則自研了一套高效能的時序資料庫,在 V3 版本可以達到每秒千萬級別的資料儲存,通過對接第三方時序資料庫擴充套件歷史資料的儲存。

從配置複雜度上看,Prometheus 只有一個核心 server 元件,一條命令便可以啟動。相比而言,其他系統配置相對麻煩,尤其是 Open-Falcon。從社群活躍度上看,目前 Zabbix 和 Nagios 的社群活躍度比較低,尤其是 Nagios;Open-Falcon 雖然也比較活躍,但基本都是國內公司在參與;Prometheus 在這方面佔據絕對優勢,社群活躍度最高,並且受到 CNCF 的支援,後
期的發展值得期待。

從容器支援角度看,由於 Zabbix 和 Nagios 出現得比較早,當時容器還沒有誕生,它們對容器的支援自然比較差;Open-Falcon 雖然提供了容器的監控,但支援力度有限;Prometheus 的動態發現機制,不僅可以支援 Swarm 原生叢集,還支援 Kubernetes 容器叢集的監控,是目前容器監控最好解決方案;Zabbix 在傳統監控系統中,尤其是在
伺服器相關監控方面,佔據絕對優勢;而 Nagios 則在網路監控方面有廣泛應用。伴隨著容器的發展,Prometheus已開始成為主導及容器監控方面的標配,並且在未來可見的時間內將被廣泛應用。

三、面試常見問題

你們公司監控是如何做的?

監控軟體我們使用的是zabbix,我們監控在不同的維度

1.硬體層面

如果說到硬體,肯定要先說物理伺服器用的什麼型號?
物理伺服器,選型,Dell R710 720 730 ...
IDRAC自帶一個遠端管理卡,安裝上一個軟體包之後,就可以監控,如果不使用dell的idrac那就使用zabbix的IPMI介面監控硬體

1)CPU溫度,
2)風扇轉速,
3)磁碟是否損壞,
4)CMOS電池電量
5)記憶體是否損壞
6) ...

2.系統層面

1)CPU:使用率、負載
2)記憶體:使用率
3)磁碟:使用率,IO
4)程序
5)TCP狀態
6)系統負載
7) ...

3.網路層面

1)網路裝置:路由器,交換機
2)網絡卡入口流量
3)網絡卡出口流量
4)頻寬的峰值
5)...
使用zabbix的snmp方式監控

4.應用層面

當然了最基本的就是各個服務的程序,埠號
一些特殊程式我們還需要額外監控:

1)MySQL:主從複製是否有延遲(zabbix監控模板)
2)redis:主從複製是否有延遲
監控思路:zabbix沒有固定模板,可以在主庫中set一個key為時間戳,然後從庫會同步這個時間戳(動態),寫指令碼時時獲取這兩個時間戳,做對比。
3)NFS:磁碟掛載狀況
4)tomcat:JVM監控,老年代、新生代、永久帶、full-gc、垃圾回收
5)rsync的同步情況,MD5校驗檔案是否被篡改
6)...

5.業務層面

1)URL的監控
2)API的監控
3)nginx的狀態碼
4)tomcat的exception
5)請求時間
6)響應時間
7)載入時間
8)渲染時間
9)...

四、單機監控命令瞭解

1.CPU監控命令

1) w

[root@jindada ~]$ w
 15:23:20 up 25 days, 23:52,  1 user,  load average: 0.00, 0.02, 0.05
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
jh       pts/0    139.226.12.44    15:23    0.00s  0.04s  0.02s sshd: jh [priv]  

2)top

[root@redis02 ~]# top
top - 12:31:10 up 1 day,  8:11,  1 user,  load average: 0.00, 0.01, 0.05
Tasks: 100 total,   1 running,  99 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.3 sy,  0.0 ni, 99.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  2030148 total,  1457796 free,   190464 used,   381888 buff/cache
KiB Swap:  1048572 total,  1048572 free,        0 used.  1652944 avail Mem

3)htop

[root@redis02 ~]# htop
 CPU[|                                                                0.7%]   Tasks: 27, 38 thr; 1 running

4)glances

[root@redis02 ~]# glances
redis02 (CentOS Linux 7.5.1804 64bit / Linux 3.10.0-862.el7.x86_64)                                                                                                                                                       Uptime: 1 day, 8:12:51

CPU  [||                                                                         2.9%]   CPU       2.9%  nice:     0.0%                    MEM     13.1%  active:     310M                    SWAP      0.0%                    LOAD    1-core
MEM  [||||||||||                                                                13.1%]   user:     1.9%  irq:      0.0%                    total:  1.94G  inactive:   145M                    total:   1024M                    1 min:    0.14
SWAP [                                                                           0.0%]   system:   1.0%  iowait:   0.0%                    used:    260M  buffers:   2.03M                    used:        0                    5 min:    0.09
                                                                                         idle:    97.1%  steal:    0.0%                    free:   1.68G  cached:     319M                    free:    1024M                    15 min:   0.07

5)uptime

[root@jindada ~]$ uptime
 15:27:44 up 25 days, 23:56,  1 user,  load average: 0.00, 0.01, 0.05

不管用什麼命令監控,檢視CPU,我們都必須瞭解,系統的使用者態和內和態。

%Cpu(s):  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st

us: 使用者態     跟使用者的操作有關35%
sy: 內和態     跟核心的處理有關65%
id: CPU空閒

當我們執行一個命令的時候,很快能出來結果,但是有多少人知道,這個很快,他都佔用了哪些時間呢?

[root@jindada ~]$ time ls
pass.txt  wordpress

real	0m0.002s	真實執行時間
user	0m0.001s	使用者執行時間
sys	0m0.001s		系統執行時間   

2.記憶體監控命令

1)free

[root@jindada ~]$ free -m
              total        used        free      shared  buff/cache   available
Mem:           1837         751         426           0         660         930
Swap:             0           0           0
[root@jindada ~]$ free -h
              total        used        free      shared  buff/cache   available
Mem:           1.8G        751M        426M        472K        660M        930M
Swap:            0B          0B          0B

2)top

[root@redis01 ~]# top

top - 15:33:23 up 26 days, 2 min,  1 user,  load average: 0.00, 0.01, 0.05
Tasks:  82 total,   1 running,  81 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.3 us,  0.3 sy,  0.0 ni, 99.3 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  1882016 total,   435980 free,   769832 used,   676204 buff/cache
KiB Swap:        0 total,        0 free,        0 used.   952508 avail Mem 

3)glances

[root@redis01 ~]# yum -y install  glances
[root@redis01 ~]# glances

jindada                                                     Uptime: 26 days, 0:03:41

CPU  [  2.6%]   CPU       2.6%    MEM     50.2%    SWAP      0.0%    LOAD    1-core
MEM  [ 50.2%]   user:     1.6%    total:  1.79G    total:       0    1 min:    0.29
SWAP [  0.0%]   system:   1.0%    used:    923M    used:        0    5 min:    0.09
                idle:    96.1%    free:    915M    free:        0    15 min:   0.07

4)htop

5)如何檢視單個程序佔用記憶體?

#程序佔用記憶體公式
pmem = VmRSS / MemTotal * 100
process mem = 虛擬記憶體 / 總記憶體 * 100

6)python指令碼

[root@redis02 ~]# cat mem.py
#!/usr/bin/env python
# _*_ coding:UTF-8 _*_
# 收集程式所佔用的實體記憶體大小,佔所有實體記憶體的比例
# Python: 2.7.6

import sys
import os
from subprocess import Popen,PIPE

def get_pid(program):
    '獲取目標程式的PID列表'
    p = Popen(['pidof',program],stdout=PIPE,stderr=PIPE)
    pids,stderrput = p.communicate()
#     pids = p.stdout.read()  #這種方法也是可以的
#     這裡也可以對stderrput來進行判斷
    if pids:
        return pids.split()
    else:
        raise ValueError

def mem_calc(pids):
    '計算PIDs佔用的記憶體大小'
    mem_total = 0
    for pid in pids:
        os.chdir('/proc/%s' % pid)
        with open('status') as fd:
            for line in fd:
                if line.startswith('VmRSS'):
                    mem = line.strip().split()[1]
                    mem_total += int(mem)
                    break
    return mem_total


def mem_percent(mem):
    '計算程式記憶體佔用實體記憶體的百分比'
    with open('/proc/meminfo') as fd:
        for line in fd:
            if line.startswith('MemTotal'):
                total = line.strip().split()[1]
        percent = (float(mem)/int(total)) * 100
    return percent


def main():
    try:
        program = sys.argv[1]
        pids = get_pid(program)
    except IndexError as e:
        sys.exit('%s need a Program name ' % __file__)
    except ValueError as e:
        sys.exit('%s not a Process Name or not Start' % program )
    mem_total = mem_calc(pids)
    percent = mem_percent(mem_total)
    return program,mem_total,percent

if __name__ == '__main__':
    program,mem_total,mem_percent=main()
    print('程序名稱:%s\n實體記憶體為:%s\n百分比為:%.2f%%'% (program,mem_total,mem_percent))

3.磁碟監控命令

1)df

[root@redis01 ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3        98G  2.2G   96G   3% /
devtmpfs        980M     0  980M   0% /dev
tmpfs           991M     0  991M   0% /dev/shm
tmpfs           991M   42M  949M   5% /run
tmpfs           991M     0  991M   0% /sys/fs/cgroup
/dev/sda1       497M  120M  378M  25% /boot
tmpfs           199M     0  199M   0% /run/user/0

[root@redis01 ~]# df -i
Filesystem       Inodes IUsed    IFree IUse% Mounted on
/dev/sda3      51123712 64711 51059001    1% /
devtmpfs         250786   373   250413    1% /dev
tmpfs            253511     1   253510    1% /dev/shm
tmpfs            253511   696   252815    1% /run
tmpfs            253511    16   253495    1% /sys/fs/cgroup
/dev/sda1        256000   326   255674    1% /boot
tmpfs            253511     1   253510    1% /run/user/0

2)iotop

[root@redis01 ~]# yum -y install  iotop
[root@redis01 ~]# iotop
Total DISK READ :	0.00 B/s | Total DISK WRITE :       0.00 B/s
Actual DISK READ:	0.00 B/s | Actual DISK WRITE:       0.00 B/s
   TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN     IO>    COMMAND             
 56720 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.02 % [kworker/0:1]
     1 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % systemd --s~erialize 22
     2 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [kthreadd]

3)iostat

#以兆為單位,每秒執行一次,執行10
[root@redis01 ~]# iostat -dm 1 10
Linux 3.10.0-957.el7.x86_64 (redis01) 	01/06/2021 	_x86_64_	(1 CPU)

Device:            tps    MB_read/s    MB_wrtn/s    MB_read    MB_wrtn
scd0              0.00         0.00         0.00          1          0
sda               0.23         0.00         0.00        236       1425

4)dstat

[root@redis01 ~]# yum -y install  dstat
[root@redis01 ~]# dstat -cdngy
----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system--
usr sys idl wai hiq siq| read  writ| recv  send|  in   out | int   csw 
  0   0 100   0   0   0| 819B 4916B|   0     0 |   0     0 |  93   155 
  0   0 100   0   0   0|   0     0 | 317B  842B|   0     0 |  97   160 
  0   1  99   0   0   0|   0     0 |  60B  362B|   0     0 | 101   159 
  0   0 100   0   0   0|   0     0 |  60B  362B|   0     0 |  91   148 
  0   1  99   0   0   0|   0     0 | 106B  422B|   0     0 | 111   161 
  1   0  99   0   0   0|   0     0 |  60B  362B|   0     0 |  98   158 
  0   0 100   0   0   0|   0     0 |  60B  362B|   0     0 | 102   158 
  0   1  99   0   0   0|   0   611k|  60B  362B|   0     0 | 118   153 
  0   0 100   0   0   0|   0     0 |  60B  362B|   0     

5)glances

[root@redis01 ~]# yum -y install glances
[root@redis01 ~]# glances
redis01                                                     Uptime: 3 days, 12:30:15

CPU  [  6.0%]   CPU       6.0%    MEM     19.1%    SWAP      0.0%    LOAD    1-core
MEM  [ 19.1%]   user:     4.4%    total:  1.93G    total:   2.00G    1 min:    0.00
SWAP [  0.0%]   system:   2.2%    used:    379M    used:        0    5 min:    0.06
                idle:    93.1%    free:   1.56G    free:    2.00G    15 min:   0.06

NETWORK     Rx/s   Tx/s   TASKS  98 (121 thr), 4 run, 94 slp, 0 oth 
eth0        144b    2Kb
eth1          0b     0b     CPU%  MEM%   PID USER        NI S Command 
lo            0b     0b      6.2   0.8 56804 root         0 R /usr/bin/python /usr/b
                             0.0   0.1  6141 dbus         0 S /usr/bin/dbus-daemon -
DISK I/O     R/s    W/s      0.0   0.0     3 root         0 S ksoftirqd/0
sda            0      0      0.0   0.0 56719 root         0 S kworker/0:0
sda1           0      0      0.0   0.0    44 root       -20 S kaluad
sda2           0      0      0.0   0.0    33 root       -20 S crypto
sda3           0      0      0.0   0.0    18 root       -20 S bioset
sr0            0      0      0.0   0.0    13 root         0 S kdevtmpfs

4.網路監控命令

1)glances

[root@redis01 ~]# yum -y install glances
[root@redis01 ~]# glances
redis01                                                     Uptime: 3 days, 12:30:15

CPU  [  6.0%]   CPU       6.0%    MEM     19.1%    SWAP      0.0%    LOAD    1-core
MEM  [ 19.1%]   user:     4.4%    total:  1.93G    total:   2.00G    1 min:    0.00
SWAP [  0.0%]   system:   2.2%    used:    379M    used:        0    5 min:    0.06
                idle:    93.1%    free:   1.56G    free:    2.00G    15 min:   0.06

NETWORK     Rx/s   Tx/s   TASKS  98 (121 thr), 4 run, 94 slp, 0 oth 
eth0        144b    2Kb
eth1          0b     0b     CPU%  MEM%   PID USER        NI S Command 
lo            0b     0b      6.2   0.8 56804 root         0 R /usr/bin/python /usr/b
                             0.0   0.1  6141 dbus         0 S /usr/bin/dbus-daemon -

2)iftop

[root@redis01 ~]# yum -y install  iftop
[root@redis01 ~]# iftop
interface: eth0
IP address is: 10.0.0.81
MAC address is: 00:0c:29:6a:9c:2c
                12.5Kb           25.0Kb           37.5Kb           50.0Kb     62.5Kb
└───────────────┴────────────────┴────────────────┴────────────────┴────────────────
redis01:ssh                  => 10.0.0.1:55825               1.17Kb  1.36Kb  1.64Kb
                             <=                               184b    221b    245b
redis01:ntp                  => 120.25.115.20:ntp               0b      0b     68b
                             <=                                 0b      0b     68b
redis01:43772                => public1.alidns.com:domain       0b      0b     27b
                             <=                                 0b      0b     47b
redis01:33360                => public1.alidns.com:domain	0b	0b     15b
                             <=                                 0b	0b     32b
redis01:41541                => public1.alidns.com:domain	0b	0b     15b
                             <=                                 0b	0b     32b
redis01:40310                => public1.alidns.com:domain	0b	0b     15b
                             <=                                 0b	0b     22b
redis01:39559                => public1.alidns.com:domain	0b	0b     16b
                             <=                                 0b	0b     16b

────────────────────────────────────────────────────────────────────────────────────
TX:             cum:   8.07KB   peak:	3.84Kb      rates:   1.17Kb  1.36Kb  1.79Kb
RX:                    2.03KB           1.70Kb                184b    221b    462b
TOTAL:                 10.1KB           4.20Kb               1.35Kb  1.57Kb  2.2

按P鍵可以看到與什麼服務在互動
#Mb 與 MB的區別
#百兆頻寬:100Mb
#實際:100Mbps / 8 = 12MB

3)nethogs

#該命令可以檢視某個程序所使用的流量
[root@redis01 ~]# yum -y install  nethogs
[root@redis01 ~]# nethogs
Ethernet link detected
                      Ethernet link detected
                                            Waiting for first packet to arrive (see sourceforge.net bug 1019381)
NetHogs version 0.8.5

    PID USER     PROGRAM                        DEV        SENT      RECEIVED       
  56634 root     sshd: root@pts/0               eth0        0.147	0.059 KB/sec
      ? root     unknown TCP                                0.000	0.000 KB/sec

4)ifconfig

[root@redis01 ~]# ifconfig 
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.0.0.81  netmask 255.255.255.0  broadcast 10.0.0.255
        inet6 fe80::20c:29ff:fe6a:9c2c  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:6a:9c:2c  txqueuelen 1000  (Ethernet)
        RX packets 161066  bytes 181148804 (172.7 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 67296  bytes 5449229 (5.1 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.16.1.81  netmask 255.255.255.0  broadcast 172.16.1.255
        inet6 fe80::20c:29ff:fe6a:9c36  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:6a:9c:36  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 28  bytes 2032 (1.9 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 113  bytes 61984 (60.5 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 113  bytes 61984 (60.5 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

5)route

[root@redis01 ~]# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         gateway         0.0.0.0         UG    0      0        0 eth0
10.0.0.0        0.0.0.0         255.255.255.0   U     0      0        0 eth0
link-local      0.0.0.0         255.255.0.0     U     1002   0        0 eth0
link-local      0.0.0.0         255.255.0.0     U     1003   0        0 eth1
172.16.1.0      0.0.0.0         255.255.255.0   U     0      0        0 eth1

5.TCP11種狀態監控命令

1)netstat

[root@driver-zeng ~]# netstat -an
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 0.0.0.0:443             0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:873             0.0.0.0:*               LISTEN
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:52022           0.0.0.0:*               LISTEN
tcp        0      0 172.24.156.150:59936    100.100.30.25:80        ESTABLISHED
tcp        0      0 172.24.156.150:52022    139.226.172.217:54116   ESTABLISHED
tcp6       0      0 :::873                  :::*                    LISTEN
udp        0      0 172.17.0.1:123          0.0.0.0:*
udp        0      0 172.18.0.1:123          0.0.0.0:*
udp        0      0 172.24.156.150:123      0.0.0.0:*
udp        0      0 127.0.0.1:123           0.0.0.0:*
udp        0      0 0.0.0.0:123             0.0.0.0:*
udp6       0      0 :::123                  :::*

[root@driver-zeng ~]# netstat -an|awk '/^tcp/ {print $NF}'|sort|uniq -c
      4 ESTABLISHED
      6 LISTEN

[root@driver-zeng ~]# netstat -an|awk '/^tcp/ {++state[$NF]} END {for(key in state) print key," \t" ,state[key]}'
LISTEN       6
ESTABLISHED      4

2)ss

[root@driver-zeng ~]# ss -n|awk '{print $2}'|sort|uniq -c
     42 ESTAB
      1 State

五、生產場景需求

1.需求

如何每1分鐘監控當前系統的記憶體使用狀態,如果可用低於100MB則傳送郵件。同時列印當前還剩餘多少記憶體

2.思路

1.如何獲取記憶體的狀態資訊 free -m
2.如何獲取記憶體的可用狀態 free -m|awk '/Mem/{print $NF}'
3.如何進行數字的比對,高於100MB不處理,低於100MB,傳送郵件。
4.如何每分鐘執行

3.編寫shell指令碼

[root@redis01 ~]# vim free.sh
#!/bin/bash

while true;do
  free_av=$(free -m|awk '/^Mem/{print $NF}')
  Hostname=$(hostname)_$(hostname -I|awk '{print $2}')
  Date=$(date +%F-%H:%M)

  if [ $free_av -gt 100 ];then
    echo "$Date: ${Hostname},記憶體高於100MB,還有${free_av}MB記憶體可用"
  else
    echo "$Date: ${Hostname},記憶體低於100MB,還有${free_av}MB記憶體可用" | mail -s "Space use warning"  [email protected]
  fi
      sleep 2
done
                                

[root@redis01 ~]# sh free.sh 
2021-01-06-16:15: redis01_172.16.1.81,記憶體高於100MB,還有1600MB記憶體可用
2021-01-06-16:15: redis01_172.16.1.81,記憶體高於100MB,還有1600MB記憶體可用
2021-01-06-16:15: redis01_172.16.1.81,記憶體高於100MB,還有1600MB記憶體可用
2021-01-06-16:15: redis01_172.16.1.81,記憶體高於100MB,還有1600MB記憶體可用
2021-01-06-16:15: redis01_172.16.1.81,記憶體高於100MB,還有1600MB記憶體可用

六、系統的oom

隨著時間的推移,使用者不斷增多,服務消耗的記憶體越來越多,當系統記憶體不足的時候,可能會導致系統產生oom(out of memory)

1.思路

1.當系統記憶體不足時就會大量使用swap(虛擬記憶體)
2.當系統大量使用swap的時候,系統會特別卡
注意:有時可能記憶體還有剩餘300M或者500M,但是swap依然被使用

2.解決方法

[root@redis02 ~]# dd < /dev/zero > /dev/null bs=2000M

[root@redis02 ~]# tail -f /var/log/messages
Out of memory: Kill process 29957 (dd) score 366 or sacrifice child
Killed process 29957 (dd) total-vm:2532680kB, anon-rss:1416508kB, filers:0kB

#清除所有快取
[root@redis02 ~]# sync; echo 3 > /proc/sys/vm/drop_caches

七、使用指令碼監控nginx

前面的課程中,我們學習了使用指令碼+定時任務的方法自動備份並將檢查結果,發到指定郵箱,那麼這裡,我也可以使用指令碼+定時任務的方法,進行監控,並使用郵件報警

#!/bin/bash
nginx_process=`ps -ef|grep -c [n]ginx`
if [ $nginx_process -lt 2 ];then
    echo "目前nginx程序數是:$nginx_process"|mail -s "完犢子nginx掛了" [email protected]
fi