系统性能信息模块psutil

psutil能够轻松实现获取系统运行的进程和系统利用率包括(CPU,内存,磁盘 和网络)等。主要用于系统监控。对于系统维护来说是个不错的模块。

  1. wget https://files.pythonhosted.org/packages/14/a2/8ac7dda36eac03950ec2668ab1b466314403031c83a95c5efc81d2acf163/psutil-5.4.5.tar.gz
  2.  
  3. yum install -y gcc readline-devel* zlib*
  4. tar -xzvf psutil-5.4..tar.gz
  5. cd psutil-5.4.
  6. python setup.py install

获取系统性能信息

(1)获取CPU信息

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

  • User Time    #执行用户进程的时间百分比
  • System Time  #执行内核进程和总段的时间百分比
  • Wait IO        #由于IO等待而使CPU处于idle(空闲状态的时间百分比)
  • Idle                    #CPU处于Idle状态的时间百分比

使用psutil.cpu_times()函数取出CPU简要信息,如需要完整信息使用psutil.cpu_times(True)即可

  1. >>> import psutil
  2. >>>
  3. >>> psutil.cpu_times()
  4. scputimes(user=52745.65625, system=26600.859375, idle=384777.265625, interrupt=1410.8125, dpc=1468.984375)
  5. >>> psutil.cpu_times(True)
  6. [scputimes(user=12148.0, system=7542.421875, idle=96366.203125, interrupt=1105.546875, dpc=1091.84375), scputimes(user=13037.046875, system=6173.28125, idle=96845.85937499999, interrupt=137.734375, dpc=151.171875), scputimes(user=13006.953125, system=6257.390625, idle=96791.84374999999, interrupt=87.5, dpc=137.671875), scputimes(user=14555.515624999998, system=6629.703124999985, idle=94870.9375, interrupt=80.0625, dpc=88.4375)]
  7. >>>

获取单项数据信息,如以下获取user的CPU时间比

  1. >>> psutil.cpu_times().user
  2. 52766.546875
  3. >>>

获取CPU逻辑个数,默认logical=True4

  1. >>> psutil.cpu_count()
  2. 4
  3. >>>

获取CPU物理个数

  1. >>> psutil.cpu_count(logical=False)
  2. 4
  3. >>>

(2)获取内存信息

Linux操作系统对内存的统计有以下几个部分:

  • Total             #内存总数
  • User               #已使用内存
  • Free            #空闲内存数
  • Buffers             #缓冲使用数
  • Cache              #缓存使用数
  • Swap               #交换分区

获取内存完整信息

  1. >>> import psutil
  2. >>>
  3. >>> mem=psutil.virtual_memory()
  4. >>>
  5. >>> mem #获取到的内存数据
  6. svmem(total=8457035776, available=5508038656, percent=34.9, used=2948997120, free=5508038656)
  7. >>>
  8. >>> mem.total #获取内存总数
  9. 8457035776
  10. >>>
  11. >>> mem.free #获取内存剩余
  12. 5508038656
  13. >>>
  14. >>> psutil.swap_memory() #获取swap交换内存
  15. sswap(total=9799213056, used=3736629248, free=6062583808, percent=38.1, sin=0, sout=0)
  16. >>>
  17. >>>

(3)获取磁盘信息

  • Read_count     #读IO数
  • Write_count     #写IO数
  • Read_byte       #IO读字节数
  • Write_byte        #IO写字节数
  • Read_time        #磁盘读时间
  • Write_time        #磁盘写时间
  1. >>> import psutil
  2. >>>
  3. >>> psutil.disk_partitions() #获取当前磁盘完整信息
  4. [sdiskpart(device='C:\\', mountpoint='C:\\', fstype='NTFS', opts='rw,fixed'), sdiskpart(device='D:\\', mountpoint='D:\\', fstype='NTFS', opts='rw,fixed')]
  5. >>>
  6. >>> psutil.disk_usage("C:\\") #获取指定分区(参数)的使用情况
  7. sdiskusage(total=115865546752, used=31459299328, free=84406247424, percent=27.2)
  8. >>> >>>
  9. >>> psutil.disk_io_counters() #获取硬盘总的IO个数,与读写信息
  10. sdiskio(read_count=1577844, write_count=1529528, read_bytes=71110199808, write_bytes=103924939776, read_time=6624, write_time=8764)
  11. >>>
  12. >>> psutil.disk_io_counters(perdisk=True) #获取单个分区IO个数,与读写信息
  13. {'PhysicalDrive0': sdiskio(read_count=837428, write_count=944450, read_bytes=37869357056, write_bytes=32956311040, read_time=1928, write_time=2476), 'PhysicalDrive1': sdiskio(read_count=740416, write_count=585185, read_bytes=33240842752, write_bytes=70969325056, read_time=4696, write_time=6288)}
  14. >>>
  15. >>>

(4)获取网络信息

  • Bytes_sent       #发送字节数
  • Bytes_recv       #接收字节数
  • Packets_sent   #发送数据包
  • Packets_recv    #接收数据包
  1. >>> import psutil
  2. >>>
  3. >>> psutil.net_io_counters() #获取网络IO信息,默认pernic=False
  4. snetio(bytes_sent=1137465964, bytes_recv=1533965380, packets_sent=18466211, packets_recv=4429783, errin=0, errout=0, dropin=0, dropout=0)
  5. >>>
  6. >>> psutil.net_io_counters(pernic=True) #输出每个网络接口的IO信息
  7. {'eth0': snetio(bytes_sent=1137468550, bytes_recv=1533958095, packets_sent=18466313, packets_recv=4429706, errin=0, errout=0, dropin=0, dropout=0), 'lo': snetio(bytes_sent=33796, bytes_recv=33796, packets_sent=455, packets_recv=455, errin=0, errout=0, dropin=0, dropout=0)}
  8. >>>

(5)其他系统信息

  1. >>> import psutil
  2. >>>
  3. >>> psutil.users() #返回当前登录系统用户信息
  4. [suser(name='root', terminal='pts/0', host='27.201.232.42', started=1528273152.0, pid=18905)]
  5. >>>
  6. >>> import psutil,datetime
  7. >>>
  8. >>> psutil.boot_time() #获取开启时间
  9. 1527585242.0
  10. >>>
  11. >>> datetime.datetime.fromtimestamp(psutil.boot_time()).strftime("%Y-%m-%d %H:%M:%S")
  12. '2018-05-29 17:14:02' #获取开机时间,以linux时间戳显示
  13. >>>

系统进程管理方法

常用方法:

  • psutil.pids()                      #列出所有进程PID
  • psutil.Process(2714)        #实例化
  • 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.connections()               #返回打开进程socket的namedutples列表,包括fs.family.laddr等信息
  • p.num_threads()              #进程开启的线程数
  1. >>> import psutil
  2. >>>
  3. >>> psutil.pids() #列出所有进程号
  4. [0, 4, 360, 544, 636, 708, 716, 808, 880, 304, 384, 1028, 1120, 1236, 1420, 1480, 1688, 1788, 1900, 1956, 1848, 2064]
  5. >>>
  6. >>> p=psutil.Process(1956) #实例化一个Process对象,参数为一进程PID
  7. >>>
  8. >>> p.name() #取进程名字
  9. 'RtkAudioService64.exe'
  10. >>>
  11. >>>
  12. >>> p.num_threads() #取进程线程数
  13. 4
  14. >>>

IP地址处理模块IPy

作用:计算大量的IP地址,包括网段,网络掩码,广播地址,子网个数,IP类型等。可以很好的辅助我们高效完成IP地址的规划工作。

1:IP地址与网段的基本处理

#辨别IPv4与IPv6

  1. >>> import IPy
  2. >>> from IPy import IP
  3. >>>
  4. >>> IP("192.168.0.0/24").version() #判断类型为IPv4
  5. 4
  6. >>>
  7. >>> IP("::1").version() #判断类型为IPv6
  8. 6
  9. >>>

#通过指定网段输出该网段的IP个数以及所有IP地址清单

  1. >>> import IPy
  2. >>> from IPy import IP
  3. >>>
  4. >>> ip_address=IP("192.168.1.0/24") #指定IP地址范围
  5. >>>
  6. >>> print(ip_address.len()) #输出该网段的IP个数
  7. 256
  8. >>>
  9. >>> for i in ip_address: #输出该网段的所有IP清单
  10. ... print(i)
  11. ...
  12. 192.168.1.0
  13. 192.168.1.1
  14. 192.168.1.2
  15. 192.168.1.3
  16. 192.168.1.4
  17. 192.168.1.5
  18. 192.168.1.6
  19. ........

#IP地址的反向解析名称,IP类型与转换

  1. >>> import IPy
  2. >>> from IPy import IP
  3. >>>
  4. >>> ip_address=IP("192.168.1.10")
  5. >>>
  6. >>> ip_address.reverseNames() #输出反向解析地址格式
  7. ['10.1.168.192.in-addr.arpa.']
  8. >>>
  9. >>> ip_address.iptype() #查看IP类型,此处为私网类型
  10. 'PRIVATE'
  11. >>>
  12. >>> IP("8.8.8.8").iptype() #查看IP类型,此处为公网类型
  13. 'PUBLIC'
  14. >>>
  15. >>>
  16. >>> IP("8.8.8.8").int() #转换成整形格式
  17. 134744072
  18. >>>
  19. >>> IP("8.8.8.8").strHex() #转换成十六进制格式
  20. '0x8080808'
  21. >>>
  22. >>> IP("8.8.8.8").strBin() #转换成二进制格式
  23. ''
  24. >>>
  25. >>> print(IP(0x8080808)) #十六进制转换成IP格式
  26. 8.8.8.8
  27. >>>

#根据IP与子网掩码生成网段格式

  1. >>> import IPy
  2. >>> from IPy import IP
  3. >>>
  4. >>> IP("192.168.1.0").make_net("255.255.255.0")
  5. IP('192.168.1.0/24')
  6. >>>
  7. >>> IP("192.168.1.0/255.255.255.0",make_net=True)
  8. IP('192.168.1.0/24')
  9. >>>
  10. >>> IP("192.168.1.0-192.168.1.255",make_net=True)
  11. IP('192.168.1.0/24')

#通过strNormal方法指定不同wantprefixlen参数值,定制输出不同类型的网段

  1. >>> import IPy
  2. >>> from IPy import IP
  3. >>>
  4. >>> IP("192.168.1.0/24").strNormal(0)
  5. '192.168.1.0'
  6. >>>
  7. >>> IP("192.168.1.0/24").strNormal(1)
  8. '192.168.1.0/24'
  9. >>>
  10. >>> IP("192.168.1.0/24").strNormal(2)
  11. '192.168.1.0/255.255.255.0'
  12. >>>
  13. >>> IP("192.168.1.0/24").strNormal(3)
  14. '192.168.1.0-192.168.1.255'
  15. >>>

wantprefixlen取值范围:

  • wantprefixlen=0         #无返回值,如192.168.1.0;
  • wantprefixlen=1         #perfix格式,如192.168.1.0/2;
  • wantprefixlen=2         #decimalnetmask格式,如192.168.1.0/255.255.255.0;
  • wantprefixlen=3         #lastIP格式,如192.168.1.0-192.168.1.255

2:多网络的计算比对方法

作用:用于比对两个网段是否存在,包含,重叠等关系

#进行数据比对,判断两个网段是否相等(或者说是否在同一个广播域)

  1. >>> import IPy
  2. >>> from IPy import IP
  3. >>>
  4. >>> IP("10.0.0.0/24") < IP("20.0.0.0/24")
  5. True

#判断IP地址和网段是否包含于另一个网段中

  1. >>> import IPy
  2. >>> from IPy import IP
  3. >>>
  4. >>> "192.168.1.10" in IP("192.168.1.0/24") #1.10是否在0/24这个网段中
  5. True
  6. >>>
  7. >>> IP("192.168.1.0/24") in IP("192.168.0.0/16") #前面的与后面的是否有交叉
  8. True
  9. >>>

#判断两个网段是否有重叠,采用IPy提供的overlaps方法

  1. >>> import IPy
  2. >>> from IPy import IP
  3. >>>
  4. >>> IP("192.168.0.0/23").overlaps("192.168.1.0/24") #返回1代表存在重叠
  5. 1
  6. >>>
  7. >>> IP("192.168.1.0/24").overlaps("192.168.2.0") #返回0代表不存在重叠
  8. 0
  9. >>>

#输入IP或子网,返回网络,掩码,广播,反向解析,子网个数,IP类型等信息

  1. import IPy
  2. from IPy import IP
  3.  
  4. ip_s =input("输入IP地址或网段地址:") #例如:192.168.1.0/24
  5.  
  6. ips=IP(ip_s)
  7.  
  8. if len(ips) > 1: #为一个网络地址时执行
  9.  
  10. print("网络地址:%s" %ips.net())
  11. print("子网掩码:%s" %ips.netmask())
  12. print("广播地址:%s" %ips.broadcast())
  13. print("反向解析:%s" %ips.reverseNames()[0])
  14. print("网络子网数:%s" %len(ips))
  15.  
  16. else: #为单个IP时执行
  17.  
  18. print("反向解析:%s" %ips.reverseNames()[0])
  19. print("十六进制地址:%s" %ips.strHex())
  20. print("二进制地址:%s" %ips.strBin())
  21. print("地址类型:%s" %sips.iptype())

DNS处理模块dnspython

目录:

  • 利用模块解析域名的方法
  • 常见的解析类型实例
  • 实践:DNS域名轮询业务监控

dnspython是python实现的一个DNS工具包,它支持几乎所有的记录类型,可用于查询,传输并动态更新ZONE信息,同时支持TSIG(事务签名),验证消息和EDNS0(扩展DNS)。

 #实现A记录的查询

  1. import dns.resolver
  2.  
  3. domain=input("输入一个域名:") #输入域名,例如:www.baidu.com
  4.  
  5. A=dns.resolver.query(domain,"A") #指定查询A记录
  6. for i in A.response.answer: #通过response.answer方法获取查询回应信息
  7. for j in i.items: #遍历回应信息
  8. print(j)

 #实现MX邮件交换记录的查询

  1. import dns.resolver
  2.  
  3. domain=input("输入一个域名:") #输入域名,例如:163.com
  4.  
  5. MX=dns.resolver.query(domain,"MX") #指定查询MX记录
  6. for i in MX:
  7. print("MX preference=",i.preference,"main exchanger=",i.exchange)

 #实现NS记录的查询

  1. import dns.resolver
  2.  
  3. domain=input("输入一个域名:") #输入域名,例如:qq.com
  4.  
  5. NS=dns.resolver.query(domain,"NS") #制定查询NS
  6. for i in NS.response.answer:
  7. for j in i.items:
  8. print(j.to_text())

#实现CNAME别名的查询

  1. import dns.resolver
  2.  
  3. domain=input("输入一个域名:") #输入域名,例如:www.baidu.com
  4.  
  5. cname=dns.resolver.query(domain,"CNAME")
  6.  
  7. for i in cname.response.answer:
  8. for j in i.items:
  9. print(j.to_text())

#实践:DNS域名轮询业务监控(实现监控指定域名的后端主机)

  1. import dns.resolver
  2. import os
  3. import http.client
  4.  
  5. iplist=[] #定义域名IP列表变量
  6. appdomain="www.baidu.com" #定义业务域名
  7.  
  8. def get_iplist(domain=""): #域名解析函数,解析成功IP将追加到iplist
  9. try:
  10. A = dns.resolver.query(domain, 'A') #解析A记录类型
  11. except Exception (e):
  12. print ("DNS记录解析错误:"+str(e))
  13. return
  14. for i in A.response.answer:
  15. for j in i.items:
  16. iplist.append(j.address) #追加到iplist
  17. return True
  18.  
  19. def checkip(ip):
  20. checkurl=ip+":80"
  21. getcontent=""
  22. http.client.socket.setdefaulttimeout(5) #定义http连接超时时间(5秒)
  23. conn=http.client.HTTPConnection(checkurl) #创建http连接对象
  24.  
  25. try:
  26. conn.request("GET", "/",headers = {"Host": appdomain}) #发起URL请求,添加host主机头
  27. r=conn.getresponse()
  28. getcontent =r.read(15) #获取URL页面前15个字符,以便做可用性校验
  29. finally:
  30. if getcontent=="<!doctype html>": #监控URL页的内容一般是事先定义好,比如“HTTP200”等
  31. print (ip+" [OK]")
  32. else:
  33. print (ip+" [Error]") #此处可放告警程序,可以是邮件、短信通知
  34.  
  35. if __name__=="__main__":
  36. if get_iplist(appdomain) and len(iplist)>0: #条件:域名解析正确且至少要返回一个IP
  37. for ip in iplist:
  38. checkip(ip)
  39. else:
  40. print ("DNS解析错误.")

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等操作系统。

1、psutil模块安装

(1)源码安装psutil

  1. git clone https://github.com/giampaolo/psutil.git
  2. cd psutil
  3. python3 setup.py install

(2)pip安装

  1. pip3 install psutil

(3)windows上安装

  1. C:\python35\python.exe -m pip install psutil
  2.  
  3. 或者源码编译安装:
  4. make.bat build
  5. make.bat install

2、获取CPU信息

  1. In [10]: psutil.cpu_times(percpu=False) #查看CPU所有信息
  2. Out[10]: scputimes(user=306.98, nice=2.01, system=337.34, idle=410414.39, iowait=78.37, irq=0.0, softirq=17.42, steal=0.0, guest=0.0, guest_nice=0.0)
  3.  
  4. #user:用户进程花费的时间
  5. #nice:用户模式执行Niced优先级进程花费的时间
  6. #system:内核模式进程花费的时间
  7. #idle:闲置时间
  8. #iowait:等待I/O完成的时间
  9. #irq:处理硬件中断的时间
  10. #softirq:处理软件中断的时间
  11. #steal:虚拟化环境中运行的其他操作系统花费的时间
  12. #guest:在linux内核的控制下为客户端操作系统运行虚拟CPU所花费的时间
  13. #guest_nice:虚拟机运行niced所花费的时间

#显示CPU所有逻辑信息

  1. In [7]: psutil.cpu_times(percpu=True) #显示所有CPU逻辑信息
  2. Out[7]:
  3. [scputimes(user=45.48, nice=0.31, system=69.41, idle=101285.67, iowait=19.67, irq=0.0, softirq=3.06, steal=0.0, guest=0.0, guest_nice=0.0),
  4. scputimes(user=110.04, nice=0.46, system=70.63, idle=101210.2, iowait=22.99, irq=0.0, softirq=5.0, steal=0.0, guest=0.0, guest_nice=0.0),
  5. scputimes(user=58.5, nice=0.5, system=126.64, idle=100934.59, iowait=14.47, irq=0.0, softirq=4.36, steal=0.0, guest=0.0, guest_nice=0.0),
  6. scputimes(user=92.1, nice=0.72, system=68.3, idle=101146.96, iowait=21.12, irq=0.0, softirq=4.79, steal=0.0, guest=0.0, guest_nice=0.0)]

#显示用户占CPU的时间比

  1. In [11]: psutil.cpu_times().user #显示用户占CPU的时间比
  2. Out[11]: 307.11

#显示CPU逻辑个数和物理个数

  1. In [8]: psutil.cpu_count(logical=True) #显示CPU逻辑个数
  2. Out[8]: 4
  3.  
  4. In [9]: psutil.cpu_count(logical=False) #显示CPU物理个数
  5. Out[9]: 4

#将各种CPU统计信息作为命名元组返回

  1. In [15]: psutil.cpu_stats() #CPU统计信息
  2. Out[15]: scpustats(ctx_switches=9838934, interrupts=10572621, soft_interrupts=5582125, syscalls=0)
  3.  
  4. #ctx_switches:启动后的上下问切换次数
  5. #interrupts:自启动以来的中断次数
  6. #soft_interrupts:启动后的软件中断数量
  7. #syscalls:启动以来的系统调用次数,在linux上始终为0

3、内存信息

psutil.virtual_memory()以字节返回内存使用情况的统计信息

  1. In [20]: mem = psutil.virtual_memory() #获取内存完整信息
  2. In [21]: mem
  3. Out[21]: svmem(total=2078892032, available=1508818944, percent=27.4, used=367063040, free=135192576, active=874614784, inactive=694231040, buffers=122880, cached=1576513536, shared=10444800, slab=255148032)
  4.  
  5. #total:总物理内存
  6. #available:可用的内存
  7. #used:使用的内存
  8. #free:完全没有使用的内存
  9. #active:当前正在使用的内存
  10. #inactive:标记为未使用的内存
  11. #buffers:缓存文件系统元数据使用的内存
  12. #cached:缓存各种文件的内存
  13. #shared:可以被多个进程同时访问的内存
  14. #slab:内核数据结构缓存的内存
  15.  
  16. In [22]: mem.total #获取内存总数
  17. Out[22]: 2078892032
  18.  
  19. In [23]: mem.used #获取已使用内存
  20. Out[23]: 367063040
  21.  
  22. In [24]: mem.free #获取空闲内存
  23. Out[24]: 135192576
  24.  
  25. In [25]: psutil.swap_memory() #获取swap内存信息
  26. Out[25]: sswap(total=2148528128, used=270336, free=2148257792, percent=0.0, sin=0, sout=12288)
  27.  
  28. #total:以字节为单位的总交换内存
  29. #used:以字节为单位使用交换内存
  30. #free:以字节为单位的可用交换内存
  31. #percent:使用百分比
  32. #sin:系统从磁盘交换的字节数
  33. #sout:系统从磁盘换出的字节数

4、磁盘信息

psutil.disk_partitions(all=False):返回所有安装的磁盘分区作为名称元组的列表,包括设备,安装点和文件系统类型,类似于Unix上的‘df’命令.

  1. In [25]: import psutil
  2. In [26]: psutil.disk_partitions(all=False) #获取磁盘完整信息
  3. Out[26]:
  4. [sdiskpart(device='/dev/sda3', mountpoint='/', fstype='xfs', opts='rw,seclabel,relatime,attr2,inode64,noquota'),
  5. sdiskpart(device='/dev/sda5', mountpoint='/home', fstype='xfs', opts='rw,seclabel,relatime,attr2,inode64,noquota'),
  6. sdiskpart(device='/dev/sda1', mountpoint='/boot', fstype='xfs', opts='rw,seclabel,relatime,attr2,inode64,noquota')]

psutil.disk_usage(path):将有关包含给定路径的分区的磁盘使用情况统计信息返回为指定元组,包括以字节表示的,总共,已使用和空闲的空间以及百分比使用率,如果路径存在则引发OSError.

  1. In [30]: psutil.disk_usage('/') #获取分区使用情况
  2. Out[30]: sdiskusage(total=53660876800, used=3662462976, free=49998413824, percent=6.8)
  3.  
  4. #total:总的大小(字节)
  5. #used:已使用的大小(字节)
  6. #free:空闲的大小(字节)
  7. #percent:使用百分比

psutil.disk_io_counters(perdisk=False,nowrap=True)  #将系统范围的磁盘I/0统计作为命名元组返回,包括以下字段:

  • read_count:读取次数
  • write_count:写入次数
  • read_bytes:读取的字节数
  • write_bytes:写入的字节数
  • read_time:从磁盘读取的时间(以毫秒为单位)
  • write_time:写入磁盘的时间(毫秒为单位)
  • busy_time:花费在实际I/O上的时间
  • read_merged_count:合并读取的数量
  • write_merged_count:合并写入次数

perdisk为True时返回物理磁盘相同的信息;nowrap为True它将检测并调整函数调用中的新值。

  1. In [32]: psutil.disk_io_counters(perdisk=True) #获取单个分区的IO信息
  2. Out[32]:
  3. {'fd0': sdiskio(read_count=0, write_count=0, read_bytes=0, write_bytes=0, read_time=0, write_time=0, read_merged_count=0, write_merged_count=0, busy_time=0),
  4. 'sda1': sdiskio(read_count=1003, write_count=25, read_bytes=5893632, write_bytes=2226176, read_time=1143, write_time=11298, read_merged_count=0, write_merged_count=1, busy_time=3976),
  5. 'sda2': sdiskio(read_count=51, write_count=2, read_bytes=2260992, write_bytes=12288, read_time=246, write_time=391, read_merged_count=0, write_merged_count=1, busy_time=545),
  6. 'sda3': sdiskio(read_count=15216, write_count=34370, read_bytes=456854528, write_bytes=2394566656, read_time=186146, write_time=3937459, read_merged_count=17, write_merged_count=37260, busy_time=156705),

5、网络信息

psutil.net_io_counters(pernic=False,nowrap=True):将系统范围的网络I/O统计信息作为命名元组返回,包括以下属性:

  • bytes_sent:发送的字节数
  • bytes_recv:收到的字节数
  • packets_sent:发送的数据包数量
  • packets_recv:接收的数据包数量
  • errin:接收时的错误总数
  • errout:发送时的错误总数
  • dropin:丢弃的传入数据包总数
  • dripout:丢弃的传出数据包总数(在OSX和BSD上始终为0)

如果pernic为True网络接口上安装的每个网络接口返回相同的信息,nowrap为True时将检测并调整函数调用中的这些数字,将旧值添加到新值,保证返回的数字将增加或不变,但不减少,net_io_counters.cache_clear()可用于使nowrap缓存失效。

  1. In [79]: psutil.net_io_counters(pernic=False,nowrap=True)
  2. Out[79]: snetio(bytes_sent=19487039, bytes_recv=301660567, packets_sent=123489, packets_recv=337983, errin=0, errout=0, dropin=0, dropout=0)
  3.  
  4. In [81]: psutil.net_io_counters(pernic=True,nowrap=True)
  5. Out[81]:
  6. {'ens32': snetio(bytes_sent=17684066, bytes_recv=299856862, packets_sent=121275, packets_recv=335825, errin=0, errout=0, dropin=0, dropout=0),
  7. 'lo': snetio(bytes_sent=1812739, bytes_recv=1812739, packets_sent=2270, packets_recv=2270, errin=0, errout=0, dropin=0, dropout=0)}

psutil.net_connections(kind='inet'):返回系统范围的套接字链接,命令元组列表返回,每个命名元组提供了7个属性:

  • fd:套接字文件描述符。
  • family:地址系列,AF_INET, AF_INET6 或AF_UNIX
  • type:地址类型,SOCK_STREAM或 SOCK_DGRAM
  • laddr:本地地址作为命名元组或 AF_UNIX套接字的情况。对于UNIX套接字,请参阅下面的注释。(ip, port)path
  • raddr:远程地址是指定的元组,或者是UNIX套接字的绝对地址。当远程端点未连接时,您将获得一个空元组(AF_INET *)或(AF_UNIX)。对于UNIX套接字,请参阅下面的注释。(ip, port)path""
  • status:表示TCP连接的状态。
  • pid:打开套接字的进程的PID,如果是可检索的,否则None。在某些平台(例如Linux)上,此字段的可用性根据进程权限而变化(需要root)。

kind参数的值包括:

inet:ipv4和ipv6

inet4:ipv4

inet6:ipv6

tcp:TCP

tcp4:TCP over ipv4

tcp6:TCP over ipv6

udp:UDP

dup4:基于ipv4的udp

cpu6:基于ipv6的udp

Unix:UNIX套接字(udp和TCP协议)

all:所有可能的家庭和协议的总和

  1. In [86]: psutil.net_connections(kind='tcp')
  2. Out[86]:
  3. [sconn(fd=3, family=<AddressFamily.AF_INET: 2>, type=<SocketKind.SOCK_STREAM: 1>, laddr=addr(ip='127.0.0.1', port=9090), raddr=(), status='LISTEN', pid=103599),
  4. sconn(fd=4, family=<AddressFamily.AF_INET6: 10>, type=<SocketKind.SOCK_STREAM: 1>, laddr=addr(ip='::', port=22), raddr=(), status='LISTEN', pid=1179),
  5. sconn(fd=13, family=<AddressFamily.AF_INET: 2>, type=<SocketKind.SOCK_STREAM: 1>, laddr=addr(ip='127.0.0.1', port=25), raddr=(), status='LISTEN', pid=1279),
  6. sconn(fd=10, family=<AddressFamily.AF_INET: 2>, type=<SocketKind.SOCK_STREAM: 1>, laddr=addr(ip='0.0.0.0', port=3306), raddr=(), status='LISTEN', pid=70099),
  7. sconn(fd=3, family=<AddressFamily.AF_INET: 2>, type=<SocketKind.SOCK_STREAM: 1>, laddr=addr(ip='0.0.0.0', port=22), raddr=(), status='LISTEN', pid=1179),
  8. sconn(fd=3, family=<AddressFamily.AF_INET: 2>, type=<SocketKind.SOCK_STREAM: 1>, laddr=addr(ip='192.168.146.139', port=22), raddr=addr(ip='192.168.146.1', port=4238), status='ESTABLISHED', pid=122738),
  9. sconn(fd=12, family=<AddressFamily.AF_INET: 2>, type=<SocketKind.SOCK_STREAM: 1>, laddr=addr(ip='127.0.0.1', port=9001), raddr=(), status='LISTEN', pid=103596),
  10. sconn(fd=14, family=<AddressFamily.AF_INET6: 10>, type=<SocketKind.SOCK_STREAM: 1>, laddr=addr(ip='::1', port=25), raddr=(), status='LISTEN', pid=1279)]
  11.  
  12. In [87]: psutil.net_connections(kind='inet4')
  13. Out[87]:
  14. [sconn(fd=3, family=<AddressFamily.AF_INET: 2>, type=<SocketKind.SOCK_STREAM: 1>, laddr=addr(ip='127.0.0.1', port=9090), raddr=(), status='LISTEN', pid=103599),
  15. sconn(fd=13, family=<AddressFamily.AF_INET: 2>, type=<SocketKind.SOCK_STREAM: 1>, laddr=addr(ip='127.0.0.1', port=25), raddr=(), status='LISTEN', pid=1279),
  16. sconn(fd=10, family=<AddressFamily.AF_INET: 2>, type=<SocketKind.SOCK_STREAM: 1>, laddr=addr(ip='0.0.0.0', port=3306), raddr=(), status='LISTEN', pid=70099),
  17. sconn(fd=3, family=<AddressFamily.AF_INET: 2>, type=<SocketKind.SOCK_STREAM: 1>, laddr=addr(ip='0.0.0.0', port=22), raddr=(), status='LISTEN', pid=1179),
  18. sconn(fd=3, family=<AddressFamily.AF_INET: 2>, type=<SocketKind.SOCK_STREAM: 1>, laddr=addr(ip='192.168.146.139', port=22), raddr=addr(ip='192.168.146.1', port=4238), status='ESTABLISHED', pid=122738),
  19. sconn(fd=6, family=<AddressFamily.AF_INET: 2>, type=<SocketKind.SOCK_DGRAM: 2>, laddr=addr(ip='0.0.0.0', port=68), raddr=(), status='NONE', pid=119605),
  20. sconn(fd=12, family=<AddressFamily.AF_INET: 2>, type=<SocketKind.SOCK_STREAM: 1>, laddr=addr(ip='127.0.0.1', port=9001), raddr=(), status='LISTEN', pid=103596),
  21. sconn(fd=1, family=<AddressFamily.AF_INET: 2>, type=<SocketKind.SOCK_DGRAM: 2>, laddr=addr(ip='127.0.0.1', port=323), raddr=(), status='NONE', pid=741)]

psutil.net_if_addrs():以字典的方式返回系统上的每个网络接口的关联地址。

  1. In [88]: psutil.net_if_addrs()
  2. Out[88]:
  3. {'lo': [snic(family=<AddressFamily.AF_INET: 2>, address='127.0.0.1', netmask='255.0.0.0', broadcast=None, ptp=None),
  4. snic(family=<AddressFamily.AF_INET6: 10>, address='::1', netmask='ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff', broadcast=None, ptp=None),
  5. snic(family=<AddressFamily.AF_PACKET: 17>, address='00:00:00:00:00:00', netmask=None, broadcast=None, ptp=None)],
  6. 'ens32': [snic(family=<AddressFamily.AF_INET: 2>, address='192.168.146.139', netmask='255.255.255.0', broadcast='192.168.146.255', ptp=None),
  7. snic(family=<AddressFamily.AF_INET6: 10>, address='fe80::9853:19bb:b07b:89d4%ens32', netmask='ffff:ffff:ffff:ffff::', broadcast=None, ptp=None),
  8. snic(family=<AddressFamily.AF_PACKET: 17>, address='00:50:56:31:d8:11', netmask=None, broadcast='ff:ff:ff:ff:ff:ff', ptp=None)]}

psutil.net_if_stats():将安装在系统上的网络接口的信息作为字典返回,其中包括isup是否启动,duplex双工模式,speed速率,mtu最大传输单位,以字节表示

  1. In [89]: psutil.net_if_stats()
  2. Out[89]:
  3. {'ens32': snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_FULL: 2>, speed=1000, mtu=1500),
  4. 'lo': snicstats(isup=True, duplex=<NicDuplex.NIC_DUPLEX_UNKNOWN: 0>, speed=0, mtu=65536)}

6、其他系统信息

  1. IN[93]:import psutil,time
  2. In [94]: psutil.boot_time() #系统启动时间戳
  3. Out[94]: 1527457908.0
  4. In [96]: time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(psutil.boot_time
  5. ...: ())) #格式化时间
  6. Out[96]: '2018-05-28 05:51:48'
  7.  
  8. In [97]: psutil.users() #返回当前链接的系统用户
  9. Out[97]:
  10. [suser(name='root', terminal='tty1', host='', started=1527050368.0, pid=769),
  11. suser(name='root', terminal='pts/0', host='192.168.146.1', started=1527559040.0, pid=122742),
  12. suser(name='root', terminal='pts/1', host='192.168.146.1', started=1527559040.0, pid=122761)]

7、系统进程管理

  1. In [1]: import psutil
  2.  
  3. In [2]: psutil.pids() #列出所有进程PID
  4. Out[2]:
  5. [1,2,3,5,6,7,8,]
  6.  
  7. In [3]: p = psutil.Process(1265) #实例化一个Process对象,参数为进程PID
  8.  
  9. In [4]: p.name() #进程名
  10. Out[4]: 'mysqld'
  11.  
  12. In [5]: p.exe() #进程bin路径
  13. Out[5]: '/usr/local/mysql-5.5.32/bin/mysqld'
  14.  
  15. In [6]: p.cwd() #进程工作目录绝对路径
  16. Out[6]: '/mysql/data'
  17.  
  18. In [7]: p.status() #进程状态
  19. Out[7]: 'sleeping'
  20.  
  21. In [8]: p.create_time() #进程创建时间,时间戳格式
  22. Out[8]: 1527642963.22
  23.  
  24. In [9]: p.uids() #进程UID信息
  25. Out[9]: puids(real=1001, effective=1001, saved=1001)
  26.  
  27. In [10]: p.gids() #进程GID信息
  28. Out[10]: pgids(real=1001, effective=1001, saved=1001)
  29.  
  30. In [11]: p.cpu_times() #进程CPU时间信息,包括user、system的CPU时间
  31. Out[11]: pcputimes(user=1.53, system=6.06, children_user=0.0, children_system=0.0)
  32.  
  33. In [12]: p.cpu_affinity() #get进程CPU亲和度,如果设置进程CPU亲和度,将CPU号作为参数即可
  34. Out[12]: [0, 1, 2, 3]
  35.  
  36. In [13]: p.memory_info() #进程内存rss、vms信息
  37. Out[13]: pmem(rss=45268992, vms=460525568, shared=4399104, text=9420800, lib=0, data=425431040, dirty=0)
  38.  
  39. In [14]: p.io_counters() #进程IO信息包括读写IO数及字节数
  40. Out[14]: pio(read_count=594, write_count=27, read_bytes=15859712, write_bytes=32768, read_chars=6917150, write_chars=1555)
  41.  
  42. In [15]: p.connections() #返回发开进程socket的namedutples列表,包括fs、family、laddr等信息
  43. Out[15]: [pconn(fd=10, family=<AddressFamily.AF_INET: 2>, type=<SocketKind.SOCK_STREAM: 1>, laddr=addr(ip='0.0.0.0', port=3306), raddr=(), status='LISTEN')]
  44.  
  45. In [16]: p.num_threads() #进程开启的线程数
  46. Out[16]: 16
  47.  
  48. In [17]: p.memory_percent() #进程内存利用率
  49. Out[17]: 2.177553778800572

psutil.process_iter(attrs=None,ad_value=None):返回一个迭代器process,为本地机器上的所有正在运行的进程生成一个类实例。

psutil.pid_exists(pid):检查给定的PID是否存在于当前进程列表中。

psutil.wait_procs(procs,timeout=None,callback=None):等待process终止实例列表的便捷函数,返回一个元组,指示哪些进程已经消失,哪些进程还活着。

class psutil.Popen(*args,**kwargs):它启动一个子进程,并完全像使用subprocess.Popen一样处理,它还提供了所有psutil.Process类的方法。Popen类的作用是获取用户启动的应用程序进程信息,以便跟踪程序进程的运行状态。

  1. In [18]: import psutil
  2.  
  3. In [19]: from subprocess import PIPE
  4.  
  5. In [20]: p = psutil.Popen(["/usr/bin/python","-c","print('hello world')"],stdout=
  6. ...: PIPE)
  7.  
  8. In [21]: p.name()
  9. Out[21]: 'python'
  10.  
  11. In [22]: p.username()
  12. Out[22]: 'root'
  13.  
  14. In [23]: p.communicate()
  15. Out[23]: (b'hello world\n', None)

进程过滤实例:

  1. In [25]: import psutil
  2.  
  3. In [26]: from pprint import pprint as pp
  4.  
  5. #根据进程名查看系统中的进程名与pid
  6. In [27]: pp([p.info for p in psutil.process_iter(attrs=['pid','name']) if 'python
  7. ...: ' in p.info['name']])
  8. [{'name': 'ipython3', 'pid': 2429}]
  9.  
  10. In [28]: pp([p.info for p in psutil.process_iter(attrs=['pid','name']) if 'mysql'
  11. ...: in p.info['name']])
  12. [{'name': 'mysqld_safe', 'pid': 987}, {'name': 'mysqld', 'pid': 1265}]
  13.  
  14. #所有用户进程
  15. In [32]: import getpass
  16.  
  17. In [33]: pp([(p.pid,p.info['name']) for p in psutil.process_iter(attrs=['name','u
  18. ...: sername']) if p.info['username'] == getpass.getuser()])
  19. [(1, 'systemd'),
  20. (2, 'kthreadd'),
  21. (3, 'ksoftirqd/0'),
  22. (5, 'kworker/0:0H'),
  23. (6, 'kworker/u256:0'),
  24. ...
  25. (5004, 'kworker/0:0')]
  26.  
  27. #查看积极运行的进程:
  28. In [37]: pp([(p.pid,p.info) for p in psutil.process_iter(attrs=['name','status'])
  29. ...: if p.info['status'] == psutil.STATUS_RUNNING])
  30. [(2429, {'name': 'ipython3', 'status': 'running'})]
  31.  
  32. #使用日志文件的进程
  33. In [38]: import os,psutil
  34.  
  35. In [39]: for p in psutil.process_iter(attrs=['name','open_files']):
  36. ...: for file in p.info['open_files'] or []:
  37. ...: if os.path.splitext(file.path)[1] == '.log':
  38. ...: print("%-5s %-10s %s" % (p.pid,p.info['name'][:10],file.path
  39. ...: ))
  40. ...:
  41. 689 auditd /var/log/audit/audit.log
  42. 725 vmtoolsd /var/log/vmware-vmsvc.log
  43. 974 tuned /var/log/tuned/tuned.log
  44.  
  45. #消耗超过5M内存的进程:
  46. In [42]: pp([(p.pid,p.info['name'],p.info['memory_info'].rss) for p in psutil.pro
  47. ...: cess_iter(attrs=['name','memory_info']) if p.info['memory_info'].rss > 5
  48. ...: * 1024 * 1024])
  49. [(1, 'systemd', 7118848),
  50. (411, 'systemd-udevd', 6254592),
  51. (712, 'polkitd', 13553664),
  52. (716, 'abrtd', 5734400),
  53. (724, 'VGAuthService', 6262784),
  54. (725, 'vmtoolsd', 6426624),
  55. (974, 'tuned', 19648512),
  56. (1265, 'mysqld', 45268992),
  57. (2204, 'sshd', 5726208),
  58. (2429, 'ipython3', 37232640)]
  59.  
  60. #消耗量最大的3个进程
  61. In [43]: pp([(p.pid, p.info) for p in sorted(psutil.process_iter(attrs=['name', '
  62. ...: memory_percent']), key=lambda p: p.info['memory_percent'])][-3:])
  63. [(974, {'memory_percent': 0.9451434561080659, 'name': 'tuned'}),
  64. (2429, {'memory_percent': 1.7909847854955845, 'name': 'ipython3'}),
  65. (1265, {'memory_percent': 2.177553778800572, 'name': 'mysqld'})]
  66.  
  67. #消耗最多CPU时间的前3个进程
  68. In [44]: pp([(p.pid, p.info['name'], sum(p.info['cpu_times'])) for p in sorted(ps
  69. ...: util.process_iter(attrs=['name', 'cpu_times']), key=lambda p: sum(p.info
  70. ...: ['cpu_times'][:2]))][-3:])
  71. [(1265, 'mysqld', 13.93),
  72. (2429, 'ipython3', 14.809999999999999),
  73. (725, 'vmtoolsd', 16.74)]
  74.  
  75. #导致最多I/O的前3个进程
  76. In [45]: pp([(p.pid, p.info['name']) for p in sorted(psutil.process_iter(attrs=['
  77. ...: name', 'io_counters']), key=lambda p: p.info['io_counters'] and p.info['
  78. ...: io_counters'][:2])][-3:])
  79. [(2429, 'ipython3'), (725, 'vmtoolsd'), (1, 'systemd')]
  80.  
  81. #前3个进程打开最多的文件描述符:
  82. In [46]: pp([(p.pid, p.info) for p in sorted(psutil.process_iter(attrs=['name', '
  83. ...: num_fds']), key=lambda p: p.info['num_fds'])][-3:])
  84. [(377, {'name': 'systemd-journald', 'num_fds': 24}),
  85. (1, {'name': 'systemd', 'num_fds': 43}),
  86. (1307, {'name': 'master', 'num_fds': 91})]

《Python自动化运维之路》 系统基础信息模块(一)的更多相关文章

  1. python自动化运维之路~DAY5

    python自动化运维之路~DAY5 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.模块的分类 模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数 ...

  2. Python自动化运维之路-01

    python的主要应用 python的擅长领域 学python有没有前途?python的语言排名 语言选择 运维会了开发后可以干什么? python的最大优势就是什么都能做. 课程概述 毕业目标 周五 ...

  3. 《Python自动化运维之路》 业务服务监控(二)

    文件内容差异对比方法 使用diffie模块实现文件内容差异对比.dmib作为 Python的标准库模块,无需安装,作用是对比文本之间的差异,且支持输出可读性比较强的HTML文档,与 Linux下的di ...

  4. 【Python自动化运维之路Day9】Socket

    socket也可以认为是套接字是一种源IP地址和目的IP地址以及源端口号和目的端口号的组合.网络化的应用程序在开始任何通讯之前都必须要创建套接字.就像电话的插口一样,没有它就没办法通讯. socket ...

  5. python自动化运维之路2

    list列表 列表是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储.修改等操作 #!/usr/bin/env python # _*_ encoding:utf-8 _*_ # a ...

  6. 【Python自动化运维之路Day7】

    1. configparser模块 import configparser config = configparser.ConfigParser() #先把config应用一下configparser ...

  7. 【Python自动化运维之路Day6】

    1.递归思考题,阶乘 使用递归方式(函数)计算: 1*2*3*4*5*6*7*8*9*10的值 def func(num): if num==1: return 1 return num*func(n ...

  8. 【Python自动化运维之路Day4】

    abs()  取绝对值all()  所有为真,则为真,否则为假any()  至少有一个为真,就为真,否则为假callable()   判断函数是否可以被调用,如果可以返回True,否则返回False ...

  9. 【Python自动化运维之路Day2】

    1. 常量命名规则 在Python中,会在变量命名上标明某变量是常量,通常采用全是大写的方式来标明,如: CONNECT= '127.0.0.1' PORT = ' 2.Python编译 python ...

随机推荐

  1. SparkStreaming 监控文件目录

    SparkStream 监控文件目录时,只能监控文件内是否添加新的文件,如果文件名没有改变只是文件内容改变,那么不会检测出有文件进行了添加. )) )).reduceByKey(_ + _) word ...

  2. mysql之索引查询1

    一 备份数据 备份库: mysqldump:拷贝数据 --database:数据库 基本语法是:mysqldump -h服务器名 -u用户名 -p密码 --database 库名 > 备份路径. ...

  3. LINUX系统下MySQL 压力测试工具super smack

    摘要:1.源文件下载地址:http://vegan.net/tony/supersmack/2.安装:注意在编译时,可以先把对应的libmysqlclient.so.*拷贝到/usr/lib3.测试: ...

  4. Firefox,chrome,IE上传图片预览

    首先判断IE或是Firefox,chrome.本文只测试了IE8中和Firefox,chrome是不一样的. 判断是否IE: if(-[1,]){//判断浏览器不是IE    //alert((-[1 ...

  5. boost--线程同步

    1.互斥锁(互斥量) mutex是独占式的互斥锁.timed_mutex增加了超时功能. 成员函数:lock()用于锁定,try_lock()为非阻塞版本的锁定,unlock()用于解锁.timed_ ...

  6. java常用设计模式十:模板模式

    一.定义 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 如果上面的话不好理解,请看下面的例子 二.示例 1)定义一个模 ...

  7. 删除一直处于deleting状态的数据卷

    一.场景 有一个volume数据卷hzb-1G-xxxxxx创建在nc8的ceph节点上,并且该数据卷的但是有一天nc8节点坏掉了.当我们删除hzb-1G-xxxxxx的时候,就会一直处于deleti ...

  8. font-style字体设置

    用到一些字体找起来很麻烦,扒了一些 未测试 HTML,CSS,font-family:中文字体的英文名称 宋体 SimSun黑体 SimHei微软雅黑 Microsoft YaHei微软正黑体 Mic ...

  9. 返回结点值为e的二叉树指针

    题意为,如果二叉树某结点的值为e(假定是整型二叉树),返回这个结点的指针.初看这道题,联想到二叉树可以很简单的遍历,直接返回这个指针不就行了吗?如下图所示,假如要返回值为3的结点指针: 设计好了一个函 ...

  10. Ubuntu安装spyder并添加快捷方式

    Ubuntu安装spyder并添加快捷方式 之前通过 sudo apt install spyder sudo apt install spyder3 安装spyder,但是这样有个坏处,编译器只能用 ...