Linux系统性能监控--CPU、内存、磁盘I/O、网络I/O--基于psutil库

 

目录

1. psutil简介

2. psutil安装

3. psutil使用

 4. psutil实例


 


1. psutil简介

  • psutil是一个开源切跨平台的库,其提供了便利的函数用来获取才做系统的信息,比如CPU,内存,磁盘,网络等。此外,psutil还可以用来进行进程管理,包括判断进程是否存在、获取进程列表、获取进程详细信息等。
  • psutil是一个跨平台的库,在官方网站上查到其支持如下操作系统。
    • Linux
    • Windows
    • OSX
    • FreeBSD
    • OpenBSD
    • NetBSD
    • Sun Solaris
    • AIX
  • psutil包含了异常、类、功能函数和常量,其中功能函数用来获取系统的信息,如CPU、磁盘、内存、网络等。类用来实现进程的管理功能

2. psutil安装

$ pip install psutil

3. psutil使用

  1. 获取CPU信息
     
    >>> import psutil
    >>> psutil.cpu_count()     # CPU逻辑数量
    4
    >>> psutil.cpu_count(logical=False)     # CPU物理核心
    4
    >>> psutil.cpu_times()      # CPU时间  
    scputimes(user=1.92, nice=0.0, system=4.64, idle=297.77, iowait=0.56, irq=0.0, softirq=0.0, steal=0.0, guest=0.0)
  2. 获取内存信息
    >>> import psutil
    >>> psutil.virtual_memory()    # 总内存/可用内存/内存使用率/已用内存/空闲内存
    svmem(total=16926494720, available=10762715136, percent=36.4, used=6163779584, free=10762715136)
  3.  获取磁盘信息
>>> import psutil
>>> psutil.disk_partitions()         # 磁盘分区信息
[sdiskpart(device='/dev/mapper/vg_tony-lv_root', mountpoint='/', fstype='ext4', opts='rw'), sdiskpart(device='/dev/sda1', mountpoint='/boot', fstype='ext4', opts='rw')]
>>> psutil.disk_usage('/')         # 磁盘使用情况
sdiskusage(total=18569568256, used=1994440704, free=15631831040, percent=11.3)
>>> psutil.disk_io_counters()         # 磁盘IO
sdiskio(read_count=6118, write_count=897, read_bytes=107744256, write_bytes=5440512, read_time=3123, write_time=367, read_merged_count=1704, write_merged_count=432, busy_time=1984)

     4. 获取网络信息

>>> import psutil
>>> psutil.net_io_counters()     # 获取网络读写字节/包的个数
snetio(bytes_sent=23277, bytes_recv=134908, packets_sent=226, packets_recv=1865, errin=0, errout=0, dropin=0, dropout=0)
>>> psutil.net_if_addrs()     # 获取网络接口信息
{
'lo': [*****], 
'eth0': [****)]
}
>>> psutil.net_if_stats()     # 获取网络接口状态
{
'lo': snicstats(isup=True, duplex=, speed=0, mtu=16436), 
'eth0': snicstats(isup=True, duplex=, speed=1000, mtu=1500)
}

 

4. psutil实例

  • 利用psutil功能获取系统资源信息
    import psutil
    
    
    def cpu_info():
        
        print_str = ''
        print_str += "当前系统cpu使用情况:\n"
    
        cpu_per = []
        cpu_user = []
        cpu_nice = []
        cpu_system = []
        cpu_idle = []
        cpu_iowait = []
        cpu_irq = []
        cpu_softirq = []
        cpu_steal = []
        cpu_guest = []
    
        count = 3
        while count > 0:
            cpu_status = psutil.cpu_times()
            cpu_per.append(psutil.cpu_percent(interval=2))
            cpu_user.append(cpu_status.user)
            cpu_nice.append(cpu_status.nice)
            cpu_system.append(cpu_status.system)
            cpu_idle.append(cpu_status.idle)
            cpu_iowait.append(cpu_status.iowait)
            cpu_irq.append(cpu_status.irq)
            cpu_softirq.append(cpu_status.softirq)
            cpu_steal.append(cpu_status.steal)
            cpu_guest.append(cpu_status.guest)
    
            count -= 1
    
        print_str += ("   cpu利用率 = " + str(round(sum(cpu_per)/3, 2)) + "%\n")
        print_str += ("   user = " + str(round(sum(cpu_user)/3, 2)) + "\n")
        print_str += ("   nice = " + str(round(sum(cpu_nice)/3, 2)) + "\n")
        print_str += ("   system = " + str(round(sum(cpu_system)/3, 2)) + "\n")
        print_str += ("   idle = " + str(round(sum(cpu_idle)/3, 2)) + "\n")
        print_str += ("   iowait = " + str(round(sum(cpu_iowait)/3, 2)) + "\n")
        print_str += ("   irq = " + str(round(sum(cpu_irq)/3, 2)) + "\n")
        print_str += ("   softirq = " + str(round(sum(cpu_softirq)/3, 2)) + "\n")
        print_str += ("   steal = " + str(round(sum(cpu_steal)/3, 2)) + "\n")
        print_str += ("   guest = " + str(round(sum(cpu_guest)/3, 2)) + "\n")
        print_str += "************\n"
    
        return print_str
    
    
    def mem_info():
           print_str = ""
    
           mem_total = []
           mem_ava = []
           mem_per = []
           mem_free = []
           mem_ava_per = []
    
           count = 3
           while count > 0:
                  mem = psutil.virtual_memory()
                  mem_total.append(mem.total)
                  mem_ava.append(mem.available)
                  mem_per.append(mem.percent)
                  mem_free.append(mem.free)
                  mem_ava_per.append(mem.available*100 / mem.total)
    
                  count -= 1
    
           bytes_M = 1024 * 1024
           print_str += '当前系统内存使用情况:\n'
           print_str += '   总内存:%sM \n' % round(sum(mem_total)/3/bytes_M, 2)
           print_str += '   可用内存:%sM \n' % round(sum(mem_ava)/3/bytes_M, 2)
           print_str += '   已使用(占比):%s%s \n' % (sum(mem_per)/3, '%')
           print_str += '   剩余内存:%sM\n' % round(sum(mem_free)/3/bytes_M, 2)
    
           percent_ava = round((sum(mem_ava)/3 * 100) / (sum(mem_total)/3), 1)
           if percent_ava >= 20:
                  print_str += '   当前系统可用内存充足,清放心使用!\n'
           else:
                  print_str += '   当前系统可用内存不足,请注意!\n'
           print_str += ('   当前系统可用内存百分比:' + str(percent_ava) + '%\n')
    
           if psutil.swap_memory().percent <= 0.7:
                  print_str += '   虚拟内存空间使用率良好.\n'
           else:
                  print_str += '   当前虚拟内存使用超出规定上限,请注意!\n'
           print_str += ('   当前系统的SWAP交换空间(虚拟内存)利用率为:' + str(psutil.swap_memory().percent) + '%\n')
           print_str += '************\n'
    
           return print_str
    
    
    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_dist_info():
    
        disk_total = []
        disk_uesd = []
        disk_free = []
        disk_precent = []
    
        count = 3
        while count > 0:
            disk_usage = psutil.disk_usage("/")
    
            disk_total.append(disk_usage.total)
            disk_uesd.append(disk_usage.used)
            disk_free.append(disk_usage.free)
            disk_precent.append(disk_usage.percent)
    
            count -= 1
    
        print_str = "当前系统磁盘使用情况:\n"
        print_str += ("   磁盘总量 = " + bytes2human(sum(disk_total)/3) + "\n")
        print_str += ("   磁盘使用 = " + bytes2human(sum(disk_uesd)/3) + "\n")
        print_str += ("   磁盘剩余 = " + bytes2human(sum(disk_free)/3) + "\n")
        print_str += ("   磁盘使用率 = " + str(sum(disk_precent)/3) + "%\n")
        print_str += "************\n"
    
        return print_str
    
    
    def write_log(print_info):
        time_str = time.strftime("%Y-%m-%d", time.localtime())
        file_name = "./" + time_str + ".log"
    
        if  not os.path.exists(file_name):
            os.mknod(file_name)
            with open(file_name, "w") as f:
                f.write(print_info)
        else:
            with open(file_name, "a") as f:
                f.write(print_info)
    
    
    if __name__ == '__main__':
        now_time = time.strftime('%H:%M:%S', time.localtime(time.time()))
        cpu = cpu_info.cpu_info()
        mem = mem_info.mem_info()
        disk = disk_io_info.get_dist_info()
        print_total = "*******************************\n" + now_time + '\n' + cpu + mem + disk
    
        write_log(print_total)

     

 

 

你可能感兴趣的:(Linux)