使用Python監控Linux系統


一、Python編寫的監控工具

  一、多功能系統資源統計工具dstat

  1、dstat介紹

  dstat是一個用Python語言實現的多功能系統資源統計工具,用來取代Linux下的vmstat、iostat、netstat和ifstat等命令。並且,dstat克服了這些命令的限制,增加了額外的功能、以及更多的計數器與更好的靈活性。dstat可以在一個界面上展示非常全面的監控信息。

  dstat將以列表的形式顯示監控信息,並且用不同的顏色進行輸出,以可讀性較強的單位展示監控數值。例如,對於字節數值,dstat自動根據數值的大小,以K、M、G等單位進行顯示,避免了開發者使用其他命令時因為數值太大造成的困惑和錯誤。此外,使用dstat還可以非常方便地編寫插件用來收集默認情況下沒有收集的監控信息。dstat是專門為人們實時查看監控信息設計的,因此,默認將監控結果輸出到屏幕終端。

  2、dstat的特性

 1 綜合了 vmstat, iostat, ifstat, netstat 等監控工具的功能,並且提供了更多的監控信息;
 2 實時顯示監控數據; 3 在問題分析和故障排查時,可以監視最重要的計數器,也可以對計數器進行排序; 4 模塊化設計; 5 使用 Python 語言編寫,更方便擴展現有的工作任務; 6 容易擴展,便於添加自定義的計數器; 7 包含許多擴展插件; 8 可以分組統計塊設備/網絡設備,並給出、匯總信息; 9 可以顯示每台設備中斷信息; 10 非常准確的時間精度,即便是系統負荷較高也不會延遲顯示; 11 准確顯示單位,限制轉換誤差范圍; 12 用不同的顏色顯示不同的單位,增加可讀性; 13 支持 csv 格式輸出,便於將監控信息導人 Gnumeric 和 Excel 以生成圖形。

  3、安裝使用

yum install -y dstat

  dstat命令的--version選項,除了顯示出tat的版本以外,還會顯示操作系統的版本、Python語言的版本、cpu的個數,以及dstat支持的插件列表等詳細信息。

dstat --version

  dstat --list獲取dstat的插件列表

dstat --list

  直接在終端輸入dstat命令,dstat將以默認參數運行。默認情況下,dstat會收集cpu、磁盤、網絡、換頁和系統信息,並以一秒鍾一次的頻率進行輸出,直到我們按 ctrl+c 結束。

  

  4、dstat常用選項

  執行 dstat 命令的時候,默認他會 收集-cpu-、-disk-、-net-、-paging-、-system-的數據,一秒鍾收集一次。默認輸入 dstat 等於輸入了dstat -cdngy 1dstat -a 1。

1 CPU狀態:CPU的使用率。這項報告更有趣的部分是顯示了用戶,系統和空閑部分,這更好地分析了CPU當前的使用狀況。如果你看到”wait”一欄中,CPU的狀態是一個高使用率值,那說明系統存在一些其它問題。當CPU的狀態處在”waits”時,那是因為它正在等待I/O設備(例如內存,磁盤或者網絡)的響應而且還沒有收到。
2 磁盤統計:磁盤的讀寫操作,這一欄顯示磁盤的讀、寫總數。 3 網絡統計:網絡設備發送和接受的數據,這一欄顯示的網絡收、發數據總數。 4 分頁統計:系統的分頁活動。分頁指的是一種內存管理技術用於查找系統場景,一個較大的分頁表明系統正在使用大量的交換空間,或者說內存非常分散,大多數情況下你都希望看到page in(換入)和page out(換出)的值是0 0。 5 系統統計:這一項顯示的是中斷(int)和上下文切換(csw)。這項統計僅在有比較基線時才有意義。這一欄中較高的統計值通常表示大量的進程造成擁塞,需要對CPU進行關注。你的服務器一般情況下都會運行運行一些程序,所以這項總是顯示一些數值。

  默認情況下,dstat每秒都會刷新數據。dstat可以通過傳遞2個參數運行來控制報告間隔和報告數量。

  dstat輸出默認監控、報表輸出的時間間隔為3秒鍾,並且報表中輸出10個結果:

   

  dstat命令中有很多參數可選,你可以通過man dstat命令查看,大多數常用的參數有這些:

 1 -l :顯示負載統計量
 2 -m :顯示內存使用率(包括used,buffer,cache,free值) 3 -r :顯示I/O統計 4 -s :顯示交換分區使用情況 5 -t :將當前時間顯示在第一行 6 –fs :顯示文件系統統計數據(包括文件總數量和inodes值) 7 –nocolor :不顯示顏色(有時候有用) 8 –socket :顯示網絡統計數據 9 –tcp :顯示常用的TCP統計 10 –udp :顯示監聽的UDP接口及其當前用量的一些動態數據

  dstat附帶了一些插件很大程度地擴展了它的功能。你可以通過查看/usr/share/dstat目錄來查看它們的一些使用方法,常用的有這些:

1 -–disk-util :顯示某一時間磁盤的忙碌狀況
2 -–freespace :顯示當前磁盤空間使用率 3 -–proc-count :顯示正在運行的程序數量 4 -–top-bio :指出塊I/O最大的進程 5 -–top-cpu :圖形化顯示CPU占用最大的進程 6 -–top-io :顯示正常I/O最大的進程 7 -–top-mem :顯示占用最多內存的進程

  5、dstat的使用

  dstat的強大之處不僅僅是因為它聚合了多種工具的監控結果,還因為它能通過附帶的插件實現一些高級功能,如找出占用資源最高的進程和用戶。

    1、查看全部內存都有誰在占用
dstat -g -l -m -s --top-mem

  結果如下

  

    2、顯示一些關於CPU資源損耗的數據:
dstat -c -y -l --proc-count --top-cpu

  結果如下:

  

    3、查看當前占用I/O、CPU、內存等最高的進程信息
dstat --top-mem --top-io --top-cpu

  結果如下:

  

    4、將結果輸出到CSV文件,並輸出到桌面
dstat --output dstat_output.csv

  二、交互性監控工具glances

  1、glances簡介

  glances是一款使用Python語言開發、基於psutil的跨平台系統監控工具。在所有的Linux命令行工具中,它與top命令最相似,都是命令行交互式監控工具。但是,glances實現了比top命令更齊全的監控,提供了更加豐富的功能。

  glances可以在用戶終端上實時顯示重要的系統信息,並動態刷新內容。glances每隔3秒鍾對其進行刷新,我們也可以使用命令行參數修改刷新的頻率。與dstat相同的是,glances可以將捕獲到的數據保存到文件中;而不同的是glances提供了API接口以便應用程序從glances中獲取數據。

  2、glances 提供的系統信息

 1 CPU使用率;
 2 內存使用情況; 3 內核統計信息和運行隊列信息; 4 磁盤I/O速度、傳輸和讀/寫比率; 5 文件系統中的可用空間; 6 磁盤適配器; 7 網絡I/O速度、傳輸和讀/寫比率; 8 頁面空間和頁面速度; 9 消耗資源最多的進程; 10 計算機信息和系統資源。

  3、安裝glances

#需要python-devel
yum isntall python-devel -y
pip install glances

  報錯如下

     #include <Python.h>
                        ^
    compilation terminated.
    error: command 'gcc' failed with exit status 1

  解決辦法如下

yum install python-devel

  4、glances的使用

    1、glances的默認輸出

  glances的使用非常簡單,直接輸入glances命令便進入了一個類似於top命令的交互式界面。在這個界面中,顯示了比top更加全面,更加具有可讀性的信息。

  為了增加可讀性,glances會以不同的顏色表示不同的狀態。其中,綠色表示性能良好,元須做任何額外工作;藍色表示系統性能有一些小問題,用戶應當開始關注系統性能;紫色表示性能報警,應當采取措施;紅色表示性能問題嚴重,應當立即處理。
  glances是一個交互式的工具.因此,我們也可以輸入命令來控制glances的行為。

  

    2、glances中常見的命令
1 h:顯示幫助信息;
2 q:離開程序退出; 3 c:按照 CPU 實時負載對系統進程排序; 4 m:按照內存使用狀況對系統進程排序; 5 i:按照 I/O 使用狀況對系統進程排序; 6 p:按照進程名稱排序; 7 d:顯示或隱藏磁盤讀寫狀況; 8 f:顯示或隱藏文件系統信息; 9 1:分開顯示每個 CPU 的使用情況。
    3、如果我們安裝了 Bottle 這個 web 框架,還能夠通過 web 瀏覽器顯示和命令行終端相同的監控界面。

  glances還支持將采集的數據導人到其他服務中心,包括InfluxDB,Cassandra,CouchDB,OpenTSDB,Prometheus,StatsD,ElasticSearch,RabbitMQ/ActiveMQ,ZeroMQ,Kafka和Riemann。

pip install bottle
# glances -w  ##默認端口是61208,訪問地址沒有限制
Glances web server started on http://0.0.0.0:61208/

   web訪問如下圖:

  

二、使用Python開源庫psutil監控Linux

  在Python生態中廣泛使用的開源項目,即psutil。

  一、psutil介紹

  psutil是一個開源且跨平台的庫,其提供了便利的函數用來獲取操作系統的信息,如cpu、內存、磁盤、網絡等信息。此外,psutil還可以用來進行進程管理,包括判斷進程是否存在、獲取進程列表、獲取進程的詳細信息等。psutil廣泛應用於系統監控、進程管理、資源限制等場景。此外,psutil還提供了許多命令行工具提供的功能,包括ps,top,lsof,netstat,ifconfig,who,df,kill,free,nice,ionice,iostat,iotop,uptime,pidof,tty,taskset,pmap。
  psutil是一個跨平台的庫,支持Linux,Windows,OSX,SunSolaris,FreeBSD,OpenBSD以及NetBSD等操作系統。同時,psutil也支持32位與64位的系統架構,支持Python2.6到Python3.6之間所有的Python版本。psutil具有簡單易用、功能強大、跨平台等諸多優點,廣泛應用於開源項目中,比較有名的有glances、facebook的osquery、google的grr等。psutil不但廣泛應用於Python語言開發的開源項目中,還被移植到了其他編程語言中,如Go語言的gopsutil、C語言的cpslib、Rust語言的rust-psutil、Ruby語言的posixpsutil等。作為一個不算復雜的開源項目,psutil可以說是非常成功了。
  psutil是一個第三方的開源項目,因此,需要先安裝才能夠使用。

pip install psutil

  psutil包含了若干異常、類、功能函數和常量。其中,功能函數用來獲取系統的信息,如cpu、內存、磁盤、網絡和用戶等信息。類用來實現進程管理的功能。

  二、psutil提供的功能函數

  psutil來簡化使用shell腳本獲取監控信息的程序,並獲取cpu、內存、磁盤和網絡等不同維度。

   1、CPU

  與CPU相關的功能函數

    1、cpu_count默認返回cpu的個數,也可以指定logical=Flase獲取物理CPU的個數
import psutil
LogicalCpuCount = psutil.cpu_count()
CpuCount = psutil.cpu_count(logical=False)
    2、cpu_percent返回cpu的利用率。

  可以通過interval參數阻塞式地獲取interval時間范圍內的cpu利用率,否則,獲取上一次調用cpu_percent這段時間以來的cpu利用率。可以使用pericpu參數指定獲取每個cpu的利用率,默認獲取整體的cpu利用率。

  三、綜合案例:使用psutil

  收集系統的監控信息並通過郵件的形式發送給管理員。使用psutil收集了cpu的信息、開機時間、內存信息以及磁盤空間等信息,讀者也可以根據需要收集磁盤io信息與網絡io信息。

   1、Python自動發郵件——yagmail庫

  yagmail與smtplib、email模塊的區別:https://www.cnblogs.com/fighter007/p/8454532.html

    1、安裝yagmail
#pip install yagmail
Collecting yagmail
  Downloading https://files.pythonhosted.org/packages/60/05/8000b8c5e3fb7ea2d6c886f647d43ea2cb1bae8ff1a1d6dca96c4b971ba0/yagmail-0.10.212-py2.py3-none-any.whl
Installing collected packages: yagmail
Successfully installed yagmail-0.10.212
    2、給單個接受者發送郵箱

  相對email、smtp模塊而已,yagmail實現起來簡單多了。

import yagmail
  
# 鏈接郵箱服務器
yag = yagmail.SMTP(user="sender@126.com", password="126郵箱授權碼", host="smtp.126.com")

# 郵箱正文
contents = ['This is the body, and here is just text http://somedmain/image.png',
           'You can find an audio file attached.', '/loacl/path/sond.mp3']

# 給單個接受者發送郵件
yag.send('receiver@qq.com', 'subject', contents)
    3、給多個接受者發送郵件
yag.send(['aa@126.com', 'bb@qq.com', 'cc@gmail.com'], 'subject', contents)
    4、發送帶附件的郵件
yag.send('aa@126.com', '發送附件', contents, ["E://whitelist.txt","E://baidu_img.jpg"])

   2、代碼實現

  將所有收集到的監控數據保存在一個字典中,並以解引用的方式傳遞給render函數。render函數的作用非常簡單,在默認情況下根據模板的名稱在當前目錄下查找模板,然后使用Jinja2進行模板渲染。模板渲染以后,就得到一個HTML形式的字符串。在這個例子中,我們的模板將不同的監控項以表格的形式進行組織。

  模板渲染完成以后,使用yagmail將監控數據以郵件的形式發送給收件人。需要注意的是,在我們的程序中使用Unicode表示中文,因此,在發送郵件時需要將Unicode進行編碼。

from __future__ import unicode_literals
import os
import socket
from datetime import datetime
import jinja2
import yagmail
import psutil

EMAIL_USER = 'aa@126.com'
EMAIL_PASSWORD = '123456'
RECIPIENTS = ['wangzhen@wzs.com']


def render(tpl_path, **kwargs):
    path, filename = os.path.split(tpl_path)

    return jinja2.Environment(
        loader=jinja2.FileSystemLoader(path or './')
    ).get_template(filename).render(**kwargs)


def bytes2human(n):
    symbols = ('K', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y')
    prefix = {}
    for i,s in enumerate(symbols):
        prefix[s] =  1 << (i + 1) * 10
    for s in reversed(symbols):
        if n >= prefix[s]:
            value = float(n) / prefix[s]
            return '%.1f%s' % (value, s)

    return "%sB" %n


def get_cpu_info():
    '''
    cpu info
    :return:
    '''
    cpu_count = psutil.cpu_count()
    cpu_percent = psutil.cpu_percent(interval=1)

    return dict(cpu_count=cpu_count, cpu_percent=cpu_percent)


def get_memory_info():
    virtual_mem = psutil.virtual_memory()
    mem_total = bytes2human(virtual_mem.total)
    mem_percent = virtual_mem.percent
    mem_free = bytes2human(virtual_mem.free + virtual_mem.buffers + virtual_mem.cached)
    mem_used = bytes2human(virtual_mem.total * virtual_mem.percent)

    return dict(mem_total=mem_total, mem_percent=mem_percent,
                mem_free=mem_free, mem_used=mem_used)


def get_dist_info():
    disk_usage = psutil.disk_usage('/')
    disk_total = bytes2human(disk_usage.total)
    disk_percent = disk_usage.percent
    disk_free = bytes2human(disk_usage.free)
    disk_used = bytes2human(disk_usage.used)

    return dict(disk_total=disk_total, disk_percent=disk_percent, disk_free=disk_free,
                disk_used=disk_used)


def get_boot_info():
    boot_time = datetime.fromtimestamp(psutil.boot_time()).strftime("%Y-%m-%d %H:%M:%S")
    return dict(boot_time=boot_time)


def collect_monitor_data():
    data = {}
    data.update(get_boot_info())
    data.update(get_cpu_info())
    data.update(get_memory_info())
    data.update(get_dist_info())

    return data


def main():
    hostname = socket.gethostname()
    data = collect_monitor_data()
    data.update(dict(hostname=hostname))
    content = render('monitor.html', **data)
    with yagmail.SMTP(user=EMAIL_USER, password=EMAIL_PASSWORD,
                      host='smtp.163.com', port=25) as yag:
        for recipent in RECIPIENTS:
            yag.send(recipent, "監控信息".encode('utf-8'), content.encode('utf-8'))

if __name__ == '__main__':
    main()
psutil.py
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>監控信息</title>
</head>
<body>
    <table border="1">
        <tr><td>服務器名稱</td><td>{{ hostname }}</td></tr>
        <tr><td>開機時間</td><td>{{boot_time}}</td></tr>

        <tr><td>cpu個數</td><td>{{ cpu_count }}</td></tr>
        <tr><td>cpu利用率</td><td>{{ cpu_percent }}</td></tr>

        <tr><td>內存總量</td><td>{{ mem_percent }}</td></tr>
        <tr><td>內存利用率</td><td>{{ mem_total }}</td></tr>
        <tr><td>內存已用空間</td><td>{{ mem_used }}</td></tr>
        <tr><td>內存可用空間</td><td>{{ mem_free }}</td></tr>

        <tr><td>磁盤空間總量</td><td>{{ disk_total }}</td></tr>
        <tr><td>磁盤空間利用率</td><td>{{ disk_percent }}</td></tr>
        <tr><td>磁盤已用空間</td><td>{{ disk_used }}</td></tr>
        <tr><td>磁盤可用空間</td><td>{{ disk_free }}</td></tr>
    </table>
</body>
</html>
monitor.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM