使用Python監控Linux系統

1、Python編寫的監控工具

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

  一、dstat介紹

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

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

  二、dstat的特性

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

  三、安裝使用

yum install -y dstat

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

dstat --version

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

dstat --list

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

  

  四、dstat經常使用選項

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

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 :顯示佔用最多內存的進程

  五、dstat的使用

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

    一、查看所有內存都有誰在佔用
dstat -g -l -m -s --top-mem

  結果以下

  

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

  結果以下:

  

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

  結果以下:

  

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

  2、交互性監控工具glances

  一、glances簡介

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

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

  二、glances 提供的系統信息

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

  三、安裝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

  四、glances的使用

    一、glances的默認輸出

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

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

  

    二、glances中常見的命令
1 h:顯示幫助信息;
2 q:離開程序退出; 3 c:按照 CPU 實時負載對系統進程排序; 4 m:按照內存使用情況對系統進程排序; 5 i:按照 I/O 使用情況對系統進程排序; 6 p:按照進程名稱排序; 7 d:顯示或隱藏磁盤讀寫情況; 8 f:顯示或隱藏文件系統信息; 9 1:分開顯示每一個 CPU 的使用狀況。
    三、若是咱們安裝了 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訪問以下圖:

  

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

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

  1、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、內存、磁盤、網絡和用戶等信息。類用來實現進程管理的功能。

  2、psutil提供的功能函數

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

   一、CPU

  與CPU相關的功能函數

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

  能夠經過interval參數阻塞式地獲取interval時間範圍內的cpu利用率,不然,獲取上一次調用cpu_percent這段時間以來的cpu利用率。可使用pericpu參數指定獲取每一個cpu的利用率,默認獲取總體的cpu利用率。

  3、綜合案例:使用psutil

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

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

  yagmail與smtplib、email模塊的區別:http://www.javashuo.com/article/p-qvtbkkrb-cz.html

    一、安裝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
    二、給單個接受者發送郵箱

  相對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)
    三、給多個接受者發送郵件
yag.send(['aa@126.com', 'bb@qq.com', 'cc@gmail.com'], 'subject', contents)
    四、發送帶附件的郵件
yag.send('aa@126.com', '發送附件', contents, ["E://whitelist.txt","E://baidu_img.jpg"])

   二、代碼實現

  將全部收集到的監控數據保存在一個字典中,並以解引用的方式傳遞給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
相關文章
相關標籤/搜索