• python自动化运维笔记1 —— 系统性能信息模块psutil


    一.系统基础信息模块

    1.1 系统性能信息模块psutil

      psutil是一个跨平台库(http://code.google.com/p/psutil/),能够轻松实现获取系统运行的进程和系统利用率(包括CPU、内存、磁盘、网络等)信息。它主要应用于系统监控,分析和限制系统资源及进程的管理。它实现了同等命令行工具提供的功能,如ps、top、lsof、netstat、ifconfig、who、df、kill、free、nice、ionice、iostat、iotop、uptime、pidof、tty、taskset、pmap等。目前支持32位和64位的Linux、Windows、OS X、FreeBSD和Sun Solaris等操作系统,支持从2.4到3.4的python版本。

      相对shell而言,使用psutil库实现则更加简单明了。psutil大小单位一般都采用字节,如下:

    >>> import psutil
    >>> mem=psutil.virtual_memory()
    >>> mem.total,mem.used
    (506081280L, 224522240L)

      psutil的源码安装步骤为:

      1.下载源码包psutil-*.tar.gz

      2.tar -xf psutil-*.tar.gz

      3.cd psutil-*

      4.python setup.py install

    1.1.1 获取系统性能信息

      采集系统的基本性能信息包括cpu、内存、磁盘、网络等,可以完整描述当前系统的运行状态及质量。psutil模块已经封装了这些方法,用户可以根据自身的应用场景,调用相应的方法来满足需求,非常简单使用。

      (1)CPU信息

      linux操作系统的CPU利用率有以下几个部分:

        User Time,执行用户进程的时间百分比

        System Time,执行内核进程和中断的时间百分比

        Wait IO,由于IO等待而使CPU处于idle(空闲)状态的时间百分比

        Idle,CPU处于idle状态的时间百分比

      使用python的psutil.cpu_times()方法可以非常简单地得到这些信息,同时也可以获取CPU的硬件相关信息,比如CPU的物理个数和逻辑个数,具体如下:

    >>> import psutil
    >>> psutil.cpu_times()#使用cpu_times方法获取cpu完整信息,需要显示所有逻辑cpu信息
    scputimes(user=5.46, nice=0.0, system=14.949999999999999, idle=6876.1300000000001, iowait=32.549999999999997, irq=0.57999999999999996, 
    softirq=5.7699999999999996, steal=0.0, guest=0.0) >>> psutil.cpu_times().user #获取用户user的cpu时间比 5.4699999999999998 >>> psutil.cpu_count()  #获取cpu的逻辑个数,默认logical=True4 1 >>> psutil.cpu_count(logical=False)  #获取cpu的物理个数 >>>

      (2)内存信息

      linux系统的内存利用率信息涉及到的total、used、free、buffers、cache、swap等,分别使用psutil.virtual_memory()与psutil.swap_memory()方法获取这些信息。如下:

    >>> import psutil
    >>> mem=psutil.virtual_memory() #获取内存完整信息
    >>> mem
    svmem(total=506081280L, available=426848256L, percent=15.699999999999999, used=224903168L, free=281178112L, active=100843520, inactive=62648320, 
    buffers=20275200L, cached=125394944) >>> mem.total  #获取内存总数 506081280L >>> mem.free  #获取内存空闲数 281178112L >>> psutil.swap_memory()  #获取swap分区信息 sswap(total=1073733632L, used=0L, free=1073733632L, percent=0.0, sin=0, sout=0) >>>

      (3)磁盘信息

      在系统的所有磁盘信息中,我们更加关注磁盘的利用率及IO信息,其中磁盘利用率使用psutil.disk_usage方法获取。磁盘IO信息包括read_count(读IO数)、write_count(写IO数)、read_bytes(IO读字节数)、write_bytes(IO写字节数)、read_time(磁盘读时间)、write_time(磁盘写时间)等。这些信息可以使用psutil.disk_io_counters()获取,如下:

    >>> psutil.disk_partitions()  #获取磁盘完整信息
    [sdiskpart(device='/dev/sda3', mountpoint='/', fstype='ext4', opts='rw'), sdiskpart(device='/dev/sda1', mountpoint='/boot', fstype='ext4', opts='rw')
    , sdiskpart(device='/dev/sr0', mountpoint='/mnt/cdrom', fstype='iso9660', opts='ro')]
    >>> psutil.disk_usage('/')  #获取分区/的使用情况 sdiskusage(total=51579129856, used=1919442944, free=47039557632, percent=3.7000000000000002)
    >>> psutil.disk_io_counters()  #获取磁盘总的IO个数、读写信息 sdiskio(read_count=5349, write_count=2021, read_bytes=137484288, write_bytes=28660736, read_time=46320, write_time=130772)
    >>> psutil.disk_io_counters(perdisk=True)  #参数perdisk=Ture获取单个分区IO个数、读写信息 {'sda2': sdiskio(read_count=332, write_count=0, read_bytes=1486848, write_bytes=0, read_time=417, write_time=0), 'sda3': sdiskio(read_count=4433,
    write_count=2019, read_bytes=133624832, write_bytes=28655616, read_time=44745, write_time=130803), 'sda1': sdiskio(read_count=584, write_count=4,
    read_bytes=2372608, write_bytes=13312, read_time=1158, write_time=5)}

      (4)网络信息

      系统的网络信息与磁盘IO类似,涉及几个关键点,包括bytes_send(发送字节数)、bytes_recv(接收字节数)、packets_send(发送数据包数)、packets_recv(接收数据包数)等,这些网络信息使用psutil.net_io_counters()方法获取。

    >>> psutil.net_io_counters()  #获取网络总的io信息,默认pernic=False
    snetio(bytes_sent=10996033, bytes_recv=745015181, packets_sent=134047, packets_recv=535137, errin=0, errout=0, dropin=0, dropout=0)
    >>> psutil.net_io_counters(pernic=True)  #获取每个网络接口的io信息 {'lo': snetio(bytes_sent=507772, bytes_recv=507772, packets_sent=3874, packets_recv=3874, errin=0, errout=0, dropin=0, dropout=0),
    'eth0': snetio(bytes_sent=10493255, bytes_recv=744516466, packets_sent=130220, packets_recv=531361, errin=0, errout=0, dropin=0, dropout=0)}

      (5)其他系统信息

      除以上几个获取系统基本信息的方法,psutil模块还支持获取用户登录数、开机时间信息等

    >>> psutil.users()  #返回当前登录系统的用户信息
    [suser(name='danny', terminal='pts/0', host='192.168.0.151', started=1516339712.0)]
    >>> import psutil,datetime
    >>> psutil.boot_time()  #获取开机时间,以linux时间戳格式返回 1516330008.0 >>> datetime.datetime.fromtimestamp(psutil.boot_time()).strftime("%Y-%m-%d %H:%M:%S")   #转换为自然时间格式 '2018-01-19 10:46:48'

    1.1.2  系统进程管理方法

      获取当前系统的进程信息,可以让运维人员得知应用程序的运行状态,包括进程的启动时间、查看或设置CPU亲和度、内存使用率、IO信息、socket连接、线程数等,这些信息可以呈现出指定进程是否存活、资源利用情况。

      (1)进程信息

      psutil模块在获取进程信息方面也提供了很好的支持,包括使用psutil.pids()方法获取所有进程PID,使用psutil.Process()方法获取单个进程的名称、路径、状态、系统资源利用率等信息,具体如下:

    >>> psutil.pids()  #列出所有进程PID
    [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,... 3301, 3322, 3323, 3571, 3775, 3782, 4126, 4135]
    >>> p=psutil.Process(3323)  #实例化一个Process对象
    >>> p.name()  #进程名
    'bash'
    >>> p.exe()  #进程bin路径
    '/bin/bash'
    >>> p.cwd()  #进程工作目录绝对路径
    '/home/danny'
    >>> p.status()  #进程状态
    'sleeping'
    >>> p.create_time()  #进程创建时间
    1516339775.1600001
    >>> p.uids()  #进程uid信息
    puids(real=0, effective=0, saved=0)
    >>> p.gids()  #进程gid信息
    pgids(real=0, effective=0, saved=0)
    >>> p.cpu_times()  #进程CPU时间信息,包括user、system两个CPU时间
    pcputimes(user=0.059999999999999998, system=0.16)
    >>> p.cpu_affinity()  #get进程CPU亲和度,如要设置进程CPU亲和度,将CPU号作为参数即可
    [0]  #该进程可以被CPU0调度
    >>> p.memory_percent()  #进程内存利用率
    0.27356238112581438
    >>> p.memory_info()  #进程内存rss、vms信息
    pmem(rss=1384448, vms=110899200)
    >>> p.io_counters()  #进程IO信息,包括读写IO数及字节数
    pio(read_count=4565, write_count=1281, read_bytes=24219648, write_bytes=0)
    >>> p.connections()  #返回打开进程socket的namedutples列表,包括fs、family、laddr等信息
    []
    >>> p.num_threads()  #进程开启的线程数
    1

      (2)popen类的使用

      psutil提供的popen类的作用是获取用户启动的应用程序进程信息,以便跟踪程序进程的运行状态。

    >>> from subprocess import PIPE
    #通过psutil的Popen方法启动的应用程序,可以跟踪该程序运行的所有相关信息
    >>> p=psutil.Popen(["/usr/bin/python","-c","print('hello')"],stdout=PIPE) >>> p.name() #进程的名称 'python' >>> p.username()  #进程的用户 'root' >>> p.communicate()  ('hello ', None)
  • 相关阅读:
    4-12日 面向对象的组合和继承
    4-8日 递归和二分查找
    4-11 对象的交互 命名空间作用域
    [LeetCode]-algorithms-Reverse Integer
    [LeetCode]-algorithms-Longest Palindromic Substring
    [LeetCode]-algorithms-Median of Two Sorted Arrays
    [LeetCode]-algorithms-Longest Substring Without Repeating Characters
    [LeetCode]-algorithms-Add Two Numbers
    Java中创建String的两种方式
    Java中String为什么是不可变的
  • 原文地址:https://www.cnblogs.com/dannylinux/p/8311086.html
Copyright © 2020-2023  润新知