python模块之psutil详解
<h1 id="python模块之psutil详解">python模块之psutil详解</h1><p></p><div class="toc"><div class="toc-container-header">目录</div><ul><li>python模块之psutil详解<ul><li>简介</li></ul></li><li>功能函数<ul><li>CPU相关:</li><li>Memory内存相关:</li><li>Disk相关:</li><li>Network相关:</li><li>进程管理</li></ul></li></ul></div><p></p>
<h2 id="简介">简介</h2>
<p>psutil是一个开源切跨平台的库,其提供了便利的函数用来获取才做系统的信息,比如CPU,内存,磁盘,网络等。此外,psutil还可以用来进行进程管理,包括判断进程是否存在、获取进程列表、获取进程详细信息等。而且psutil还提供了许多命令行工具提供的功能,包括:ps,top,lsof,netstat,ifconfig, who,df,kill,free,nice,ionice,iostat,iotop,uptime,pidof,tty,taskset,pmap。</p>
<p>psutil是一个跨平台的库,在官方网站上查到其支持如下操作系统。</p>
<ul>
<li>Linux</li>
<li>Windows</li>
<li>OSX</li>
<li>FreeBSD</li>
<li>OpenBSD</li>
<li>NetBSD</li>
<li>Sun Solaris</li>
<li>AIX</li>
</ul>
<p>Works with Python versions from 2.6 to 3.X.</p>
<p>psutil包含了异常、类、功能函数和常量,其中功能函数用来获取系统的信息,如CPU、磁盘、内存、网络等。类用来实现进程的管理功能</p>
<h1 id="功能函数">功能函数</h1>
<p>根据函数的功能,主要分为CPU、磁盘、内存、网络几类,下面将会总几个方面来介绍psutil提供的功能函数。</p>
<h2 id="cpu相关">CPU相关:</h2>
<table>
<thead>
<tr>
<th>函数</th>
<th>描述</th>
</tr>
</thead>
<tbody>
<tr>
<td>psutil.cpu_count()</td>
<td>cpu_count(,):默认返回逻辑CPU的个数,当设置logical的参数为False时,返回物理CPU的个数。</td>
</tr>
<tr>
<td>psutil.cpu_percent()</td>
<td>cpu_percent(,,):返回CPU的利用率,percpu为True时显示所有物理核心的利用率,interval不为0时,则阻塞时显示interval执行的时间内的平均利用率</td>
</tr>
<tr>
<td>psutil.cpu_times()</td>
<td>cpu_times(,):以命名元组(namedtuple)的形式返回cpu的时间花费,percpu=True表示获取每个CPU的时间花费</td>
</tr>
<tr>
<td>psutil.cpu_times_percent()</td>
<td>cpu_times_percent(,):功能和cpu_times大致相同,看字面意思就能知道,该函数返回的是耗时比例。</td>
</tr>
<tr>
<td>psutil.cpu_stats()</td>
<td>cpu_stats()以命名元组的形式返回CPU的统计信息,包括上下文切换,中断,软中断和系统调用次数。</td>
</tr>
<tr>
<td>psutil.cpu_freq()</td>
<td>cpu_freq():返回cpu频率</td>
</tr>
<tr>
<td><strong>示例</strong>:</td>
<td></td>
</tr>
</tbody>
</table>
<pre><code># 查看cpu个数
>>> import psutil
>>> psutil.cpu_count()
2
>>> psutil.cpu_count(logical=False)
1
>>>
# 查看cpu利用率
>>> psutil.cpu_percent()
0.2
>>> psutil.cpu_percent(percpu=True)
>>>
# 查看cpu时间花费
>>> psutil.cpu_times()
scputimes(user=29.09, nice=0.0, system=22.62, idle=24434.77, iowait=1.74, irq=0.0, softirq=0.28, steal=0.27, guest=0.0, guest_nice=0.0)
>>> psutil.cpu_times(percpu=True)
[scputimes(user=13.64, nice=0.0, system=12.02, idle=12235.5, iowait=1.0, irq=0.0, softirq=0.16, steal=0.09, guest=0.0, guest_nice=0.0),
scputimes(user=15.47, nice=0.0, system=10.62, idle=12229.44, iowait=0.74, irq=0.0, softirq=0.12, steal=0.17, guest=0.0, guest_nice=0.0)]
>>> print(cpu_time)
scputimes(user=29.24, nice=0.0, system=22.76, idle=24618.94, iowait=1.74, irq=0.0, softirq=0.28, steal=0.27, guest=0.0, guest_nice=0.0)
>>> cpu_time.user
29.24
</code></pre>
<h2 id="memory内存相关">Memory内存相关:</h2>
<p><strong>virtual_memory()</strong>:以命名元组的形式返回内存使用情况,包括总内存,可用内存,内存利用率,buffer和cache等。单位为字节。</p>
<pre><code>>>> import psutil
>>> psutil.virtual_memory()
svmem(total=8071716864, available=6532554752, percent=19.1, used=1258717184, free=6526308352, active=1153519616, inactive=194592768, buffers=2129920, cached=284561408, shared=9011200, slab=39006208)
</code></pre>
<hr>
<p><strong>swap_memory()</strong>:以命名元组的形式返回swap/memory使用情况,包含swap中页的换入和换出。</p>
<pre><code>>>> import psutil
>>> psutil.swap_memory()
sswap(total=17179865088, used=0, free=17179865088, percent=0.0, sin=0, sout=0)
>>>
</code></pre>
<p><strong>单位转换</strong></p>
<pre><code>import psutil
def bytes2human(n):
symbols = ('K','M','G','T','P','E','Z','Y')
prefix = {}
for i,s in enumerate(symbols):
prefix = 1 << (i + 1) * 10
for s in reversed(symbols):
if n >= prefix:
value = float(n) / prefix
return '%.1f%s' % (value,s)
return '%sB' % n
print(bytes2human(psutil.virtual_memory().total))
</code></pre>
<h2 id="disk相关">Disk相关:</h2>
<table>
<thead>
<tr>
<th>函数</th>
<th>描述</th>
</tr>
</thead>
<tbody>
<tr>
<td>psutil.disk_io_counters()</td>
<td>disk_io_counters():以命名元组的形式返回磁盘io统计信息(汇总的),包括读、写的次数,读、写的字节数等。<br>当perdisk的值为True,则分别列出单个磁盘的统计信息(字典:key为磁盘名称,value为统计的namedtuple)。</td>
</tr>
<tr>
<td>psutil.disk_partitions()</td>
<td>disk_partitions():以命名元组的形式返回所有已挂载的磁盘,包含磁盘名称,挂载点,文件系统类型等信息。<br>当all等于True时,返回包含/proc等特殊文件系统的挂载信息</td>
</tr>
<tr>
<td>psutil.disk_usage()</td>
<td>disk_usage(path):以命名元组的形式返回path所在磁盘的使用情况,包括磁盘的容量、已经使用的磁盘容量、磁盘的空间利用率等。</td>
</tr>
</tbody>
</table>
<pre><code># 查看所有已挂在的磁盘
>>> psutil.disk_partitions()
# 使用列表表达式查询指定挂载点信息
>>>
>>>
# 查看磁盘使用情况
>>> psutil.disk_usage('/')
sdiskusage(total=85857402880, used=3858100224, free=81999302656, percent=4.5)
# 查看磁盘io统计汇总
>>> psutil.disk_io_counters()
sdiskio(read_count=6828, write_count=3878, read_bytes=273637888, write_bytes=30182912, read_time=6870, write_time=2079, read_merged_count=7, write_merged_count=126, busy_time=4841)
# 分别列出单个磁盘的统计信息
>>> psutil.disk_io_counters(perdisk=True)
{'vda': sdiskio(read_count=6828, write_count=3878, read_bytes=273637888, write_bytes=30182912, read_time=6870, write_time=2079, read_merged_count=7, write_merged_count=126, busy_time=4841), 'vda1': sdiskio(read_count=34, write_count=0, read_bytes=139264, write_bytes=0, read_time=1, write_time=0, read_merged_count=0, write_merged_count=0, busy_time=1), 'vda2': sdiskio(read_count=1934, write_count=2049, read_bytes=22754816, write_bytes=2097152, read_time=570, write_time=801, read_merged_count=0, write_merged_count=0, busy_time=1347), 'vda3': sdiskio(read_count=4009, write_count=1729, read_bytes=187268608, write_bytes=12412416, read_time=5302, write_time=911, read_merged_count=4, write_merged_count=115, busy_time=3114), 'vda4': sdiskio(read_count=6, write_count=0, read_bytes=18432, write_bytes=0, read_time=1, write_time=0, read_merged_count=0, write_merged_count=0, busy_time=1), 'vda5': sdiskio(read_count=48, write_count=0, read_bytes=2248704, write_bytes=0, read_time=13, write_time=0, read_merged_count=0, write_merged_count=0, busy_time=9), 'vda6': sdiskio(read_count=763, write_count=100, read_bytes=60118528, write_bytes=15673344, read_time=948, write_time=367, read_merged_count=3, write_merged_count=11, busy_time=459), 'sr0': 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)}
</code></pre>
<h2 id="network相关">Network相关:</h2>
<table>
<thead>
<tr>
<th>函数</th>
<th>详情</th>
</tr>
</thead>
<tbody>
<tr>
<td>psutil.net_io_counter()</td>
<td>以命名元组的形式返回当前系统中每块网卡的网络io统计信息,包括收发字节数,收发包的数量、出错的情况和删包情况。当pernic为True时,则列出所有网卡的统计信息。</td>
</tr>
<tr>
<td>psutil.net_connections()</td>
<td>以列表的形式返回每个网络连接的详细信息(namedtuple)。命名元组包含fd, family, type, laddr, raddr, status, pid等信息。kind表示过滤的连接类型,支持的值如下:(默认为inet)</td>
</tr>
<tr>
<td>psutil.net_if_addrs()</td>
<td>以字典的形式返回网卡的配置信息,包括IP地址和mac地址、子网掩码和广播地址。</td>
</tr>
<tr>
<td>psutil.net_if_stats()</td>
<td>返回网卡的详细信息,包括是否启动、通信类型、传输速度与mtu。</td>
</tr>
<tr>
<td>psutil.users()</td>
<td>以命名元组的方式返回当前登陆用户的信息,包括用户名,登陆时间,终端,与主机信息</td>
</tr>
<tr>
<td>psutil.boot_time()</td>
<td>以时间戳的形式返回系统的启动时间</td>
</tr>
</tbody>
</table>
<pre><code># 查看网卡信息统计
>>> psutil.net_io_counters()
snetio(bytes_sent=9699431, bytes_recv=1895536, packets_sent=8606, packets_recv=27354, errin=0, errout=0, dropin=0, dropout=0)
# 查看网卡配置信息
>>> psutil.net_if_addrs()
{'lo': , 'eth0': }
>>> a = psutil.net_if_addrs()
>>> a['eth0']
>>> a['eth0']
snicaddr(family=<AddressFamily.AF_INET: 2>, address='172.16.5.12', netmask='255.255.255.0', broadcast='172.16.5.255', ptp=None)
>>> a['eth0']
'172.16.5.12'
# 查看当前登录用户信息
>>> psutil.users()
>>>
</code></pre>
<h2 id="进程管理">进程管理</h2>
<p>psutil还提供了作为进程管理的功能函数,包括获取进程列表,判断是否存在。</p>
<table>
<thead>
<tr>
<th>函数</th>
<th>详情</th>
</tr>
</thead>
<tbody>
<tr>
<td>psutil.pids()</td>
<td>以列表的形式返回当前正在运行的进程</td>
</tr>
<tr>
<td>psutil.pid_exists(1)</td>
<td>判断给点定的pid是否存在</td>
</tr>
<tr>
<td>psutil.process_iter()</td>
<td>迭代当前正在运行的进程,返回的是每个进程的Process对象</td>
</tr>
<tr>
<td>psutil.Process()</td>
<td>对进程进行封装,可以使用该类的方法获取进行的详细信息,或者给进程发送信号。</td>
</tr>
</tbody>
</table>
<p><strong>进程相关信息的方法</strong>:</p>
<ul>
<li>name:获取进程的名称</li>
<li>cmdline:获取启动进程的命令行参数</li>
<li>create_time:获取进程的创建时间(时间戳格式)</li>
<li>num_fds:进程打开的文件个数</li>
<li>num_threads:进程的子进程个数</li>
<li>is_running:判断进程是否正在运行</li>
<li>send_signal:给进程发送信号,类似与os.kill等</li>
<li>kill:发送SIGKILL信号结束进程</li>
<li>terminate:发送SIGTEAM信号结束进程</li>
</ul>
<pre><code># 以列表形式查看正在运行的进程
>>> psutil.pids()
# 查看进程运行状态,以布尔形式显示
>>> psutil.pid_exists(1)
True
# 迭代当前正在运行进程,查看列表中前三个实例的信息
>>> list(psutil.process_iter())[:3]
>>>
# 通过进程号实例化对象
>>> process = psutil.Process(1)
>>> print(process)
psutil.Process(pid=1, name='systemd', started='16:19:47')
# 获取进程的名称
>>> process.name()
'systemd'
>>> process.create_time()
1574151587.05
>>> process.num_fds()
47
>>> process.num_threads()
1
>>>
</code></pre><br><br>
来源:https://www.cnblogs.com/iamjianghao/p/11894623.html
頁:
[1]