zoukankan      html  css  js  c++  java
  • python模块之psutil

    一、模块安装

    1、简介

    psutil是一个跨平台库(http://pythonhosted.org/psutil/)能够轻松实现获取系统运行的进程和系统利用率(包括CPU、内存、磁盘、网络等)信息。
    它主要用来做系统监控,性能分析,进程管理。它实现了同等命令行工具提供的功能:
    如ps、top、lsof、netstat、ifconfigwhodfkillfreenice、ionice、iostat、iotop、uptimepidof、tty、taskset、pmap等。
    目前支持32位和64位的Linux、Windows、OS X、FreeBSD和Sun Solaris等操作系统.


    2、安装

    CentOS安装psutil包:
    python版本:3.5
     
    wget https://pypi.python.org/packages/source/p/psutil/psutil-3.2.1.tar.gz --no-check-certificate
    tar zxvf psutil-3.2.1.tar.gz
    cd psutil-3.2.1
    python setup.py install
    
    
    
    Windows安装:
    pip3.exe install psutil


    二、获取系统基本信息的使用

    1、CPU

    使用cpu_times方法获取cpu的完整信息,如下所示:
    >>> import psutil
    >>> psutil.cpu_times()
    scputimes(user=26712.69, nice=6.59, system=16096.79, idle=23242025.75, iowait=37.75, irq=0.0, softirq=568.43, steal=0.0, guest=0.0, guest_nice=0.0)
    
    
    
    
    获取单个数据,如用户的cpu时或io等待时间,如下所示:
    >>> psutil.cpu_times().user
    26712.98
    
    >>> psutil.cpu_times().iowait
    37.75
    
    
    
    
    获取cpu逻辑和物理个数,默认logical值为True:
    
    #CPU逻辑个数
    >>> psutil.cpu_count()
    6
    
    #CPU物理个数
    >>> psutil.cpu_count(logical=False)
    2
    
    
    
    
    获取cpu的使用率:
    >>> psutil.cpu_percent()
    0.2
    
    >>> psutil.cpu_percent(1)
    0.0


    2、内存信息

    内存信息的获取主要使用virtual_memory方法。swap使用就用swap_memory方法。
    
    >>> MEM = psutil.virtual_memory()
    
    >>> MEM
    svmem(total=4136796160L, available=3620245504L, percent=12.5, used=1297555456L, free=2839240704L, active=627490816, inactive=404381696, buffers=974848L, cached=780029952)
    
    >>> MEM.total
    4136796160L
    
    >>> MEM.used
    1297555456L
    
    >>> MEM.free
    2839240704L
    
    #也可以格式化一下单位
    >>> print(MEM.free/1024/1024)
    2707
    
    
    
    其中percent表示实际已经使用的内存占比。available表示还可以使用的内存。


    3、磁盘信息

    磁盘信息主要有两部分,一个是磁盘的利用率,另一个是io,他们分别可以通过disk_usage和disk_io_counters方法获取。
    
    如下先获取分区信息,然后看下根分区的使用情况:
    >>> psutil.disk_partitions()
    [sdiskpart(device='/dev/mapper/centos-root', mountpoint='/', fstype='xfs', opts='rw,relatime,attr2,inode64,noquota'), sdiskpart(device='/dev/sda1', mountpoint='/boot', fstype='xfs', opts='rw,relatime,attr2,inode64,noquota')]
    
    >>> psutil.disk_usage('/')
    sdiskusage(total=304470978560, used=46186463232, free=258284515328, percent=15.2)
    
    
    
    
    默认disk_io_counters方法获取的是硬盘总的io数和读写信息,如果需要获取单个分区的io和读写信息加上"perdisk=True"参数。
    
    >>> psutil.disk_io_counters()
    sdiskio(read_count=22311, write_count=2684382, read_bytes=871543808, write_bytes=24955394048, read_time=133691, write_time=41573396)
    
    >>> psutil.disk_io_counters(perdisk=True)
    {'fd0': sdiskio(read_count=1, write_count=0, read_bytes=4096, write_bytes=0, read_time=64, write_time=0), 'sr0': sdiskio(read_count=11, write_count=0, read_bytes=45056, write_bytes=0, 
    read_time=79, write_time=0), 
    'sda2': sdiskio(read_count=10925, write_count=1253459, read_bytes=424309760, write_bytes=12476611584, read_time=63902, write_time=18987876), 'sda1': sdiskio(read_count=297, 
    write_count=2073, read_bytes=23391232, write_bytes=2179072, read_time=617, write_time=354), 'dm-0': sdiskio(read_count=10948, write_count=1428852, read_bytes=422695936, 
    write_bytes=12476611584, read_time=68948, write_time=22585166), 'dm-1': sdiskio(read_count=129, write_count=0, read_bytes=1097728, write_bytes=0, read_time=81, write_time=0)}


    4、网络信息

    网络io和磁盘io使用方法差不多,主要使用net_io_counters方法,如果需要获取单个网卡的io信息,加上pernic=True参数。
    
    
    #获取网络总的io情况
    >>> psutil.net_io_counters()
    snetio(bytes_sent=3297791475, bytes_recv=1389796856, packets_sent=8756507, packets_recv=16250143, errin=0, errout=0, dropin=776532, dropout=0)
    
    #获取网卡的io情况
    >>> psutil.net_io_counters(pernic=True)
    {'lo': snetio(bytes_sent=4706567, bytes_recv=4706567, packets_sent=71051, packets_recv=71051, errin=0, errout=0, dropin=0, dropout=0), 'ens192': snetio(bytes_sent=3293097784, 
    bytes_recv=1385095182, packets_sent=8685489, packets_recv=16179153, errin=0, errout=0, dropin=776535, dropout=0)}


    5、其他系统信息

    1.获取开机时间
    #以linux时间格式返回,可以使用时间戳转换
    >>> psutil.boot_time()
    1560134542.0
    
    >>> import datetime
    >>> datetime.datetime.fromtimestamp(psutil.boot_time()).strftime("%Y-%m-%d %H: %M: %S")
    '2019-06-10 10: 42: 22'
    
    
    
    
    2.查看系统全部进程
    >>> psutil.pids()
    [1, 2, 3, 4, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 21, 22, 23, 24, 26, 27, 28, 29, 30, 32, 33, 34, 35, 36, 38, 39, 40, 41, 42, 44, 45, 46, 47, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 
    61, 62, 65, 115, 118, 119, 120, 121, 122, 123, 125, 138, 361, 362, 363, 364, 365, 366, 367, 368, 370, 371, 453, 462, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 562, 582, 
    590, 678, 698, 699, 700, 701, 702, 703, 704, 705, 729, 747, 748, 752, 753, 759, 763, 767, 769, 788, 827, 828, 866, 1001, 1003, 1009, 1010, 1011, 1025, 1116, 1124, 1125, 1126, 1127, 
    1128, 1409, 1411, 1459, 2221, 2329, 2330, 2331, 2332, 2334, 2335, 2337, 2338, 2339, 2340, 2920, 2967, 3043, 4002, 4255, 4257, 4283, 4284, 4300, 4547, 4677, 5304, 5307, 5871, 
    6189, 6252, 6529, 6559, 6560, 6588, 10618, 10622, 10629, 10631, 20556, 21194, 24406, 25219, 28097]
    
    
    
    
    3.查看单个进程
    p = psutil.Process(10631)
    
    p.name()      #进程名
    
    p.exe()         #进程的bin路径
    
    p.cwd()        #进程的工作目录绝对路径
    
    p.status()     #进程状态
    
    p.create_time()  #进程创建时间
    
    p.uids()      #进程uid信息
    
    p.gids()      #进程的gid信息
    
    p.cpu_times()    #进程的cpu时间信息,包括user,system两个cpu信息
    
    p.cpu_affinity()  #get进程cpu亲和度,如果要设置cpu亲和度,将cpu号作为参考就好
    
    p.memory_percent()  #进程内存利用率
    
    p.memory_info()    #进程内存rss,vms信息
    
    p.io_counters()    #进程的IO信息,包括读写IO数字及参数
    
    p.connectios()    #返回进程列表
    
    p.num_threads()  #进程开启的线程数
    
    psutil的Popen方法启动应用程序,可以跟踪程序的相关信息
    from subprocess import PIPE
    p = psutil.Popen(["/usr/bin/python", "-c", "print('hello')"],stdout=PIPE)
    p.name()
    p.username()


    6、 查看系统硬件脚本

    #!/usr/bin/env python
    #coding:utf-8
    
    import psutil
    import datetime
    import time
    
    # 当前时间
    now_time = time.strftime('%Y-%m-%d-%H:%M:%S', time.localtime(time.time()))
    print(now_time)
    
    # 查看cpu物理个数的信息
    print(u"物理CPU个数: %s" % psutil.cpu_count(logical=False))
    
    #CPU的使用率
    cpu = (str(psutil.cpu_percent(1))) + '%'
    print(u"cup使用率: %s" % cpu)
    
    #查看内存信息,剩余内存.free  总共.total
    #round()函数方法为返回浮点数x的四舍五入值。
    
    free = str(round(psutil.virtual_memory().free / (1024.0 * 1024.0 * 1024.0), 2))
    total = str(round(psutil.virtual_memory().total / (1024.0 * 1024.0 * 1024.0), 2))
    memory = int(psutil.virtual_memory().total - psutil.virtual_memory().free) / float(psutil.virtual_memory().total)
    print(u"物理内存: %s G" % total)
    print(u"剩余物理内存: %s G" % free)
    print(u"物理内存使用率: %s %%" % int(memory * 100))
    # 系统启动时间
    print(u"系统启动时间: %s" % datetime.datetime.fromtimestamp(psutil.boot_time()).strftime("%Y-%m-%d %H:%M:%S"))
    
    # 系统用户
    users_count = len(psutil.users())
    #
    # >>> for u in psutil.users():
    # ...   print(u)
    # ...
    # suser(name='root', terminal='pts/0', host='61.135.18.162', started=1505483904.0)
    # suser(name='root', terminal='pts/5', host='61.135.18.162', started=1505469056.0)
    # >>> u.name
    # 'root'
    # >>> u.terminal
    # 'pts/5'
    # >>> u.host
    # '61.135.18.162'
    # >>> u.started
    # 1505469056.0
    # >>>
    
    users_list = ",".join([u.name for u in psutil.users()])
    print(u"当前有%s个用户,分别是 %s" % (users_count, users_list))
    
    #网卡,可以得到网卡属性,连接数,当前流量等信息
    net = psutil.net_io_counters()
    bytes_sent = '{0:.2f} Mb'.format(net.bytes_recv / 1024 / 1024)
    bytes_rcvd = '{0:.2f} Mb'.format(net.bytes_sent / 1024 / 1024)
    print(u"网卡接收流量 %s 网卡发送流量 %s" % (bytes_rcvd, bytes_sent))
    
    io = psutil.disk_partitions()
    # print(io)
    # print("io[-1]为",io[-1])
    #del io[-1]
    
    print('-----------------------------磁盘信息---------------------------------------')
    
    print("系统磁盘信息:" + str(io))
    
    for i in io:
        o = psutil.disk_usage(i.device)
        print("总容量:" + str(int(o.total / (1024.0 * 1024.0 * 1024.0))) + "G")
        print("已用容量:" + str(int(o.used / (1024.0 * 1024.0 * 1024.0))) + "G")
        print("可用容量:" + str(int(o.free / (1024.0 * 1024.0 * 1024.0))) + "G")
    
    print('-----------------------------进程信息-------------------------------------')
    # 查看系统全部进程
    for pnum in psutil.pids():
        p = psutil.Process(pnum)
        print(u"进程名 %-20s  内存利用率 %-18s 进程状态 %-10s 创建时间 %-10s " 
        % (p.name(), p.memory_percent(), p.status(), p.create_time()))
    
    
  • 相关阅读:
    【转】ArcGIS 合并要素 Union Dissolve Append Merge
    Linux命令行下编辑常用快捷键
    rpm aid用法
    SUSE 吉祥物图片
    F9初装体验
    openSUSE10、SUSE EVAL10和SUSE10的区别[翻译]
    装有Linux DIY牛人百元人民币昂贵甜头液晶一体机
    SUSE10.3恢复GRUB体例
    64位Fedora还挑CPU
    Ubuntu8.04安置XCrysDen
  • 原文地址:https://www.cnblogs.com/weiyiming007/p/11242428.html
Copyright © 2011-2022 走看看