1.系统信息的收集
系统信息的收集,对于服务质量的把控,服务的监控等来说是非常重要的组成部分,甚至是核心的基础支撑部分。我们可以通过大量的核心指标数据,结合对应的检测体系,快速的发现异常现象的苗头,进行可控的措施。
我们的运维就像是医生,如果我们在诊断之前对病人的信息以及症状都不了解的话,如何对症下药。
基础信息之psutil模块
要在Linux中下载和安装psutil库,可以按照以下步骤进行操作:
- 打开终端。
- 使用以下命令安装pip(如果已经安装了pip,请跳过此步骤):
- 对于Debian/Ubuntu系统:
sudo apt-get install python3-pip
- 对于CentOS/RHEL系统:
sudo yum install python3-pip
- 对于Debian/Ubuntu系统:
- 使用以下命令安装psutil库:
- 对于Python 2.x:
sudo pip install psutil
- 对于Python 3.x:
sudo pip3 install psutil
- 对于Python 2.x:
现在,您已经成功在Linux中安装了psutil库。您可以在Python脚本中导入它并开始使用它。例如:
psutil是一个跨平台库,我们主要去用它来获取两部分信息
进程信息:
系统利用率 - cpu、内存、磁盘、网络等。
它实现了提供同等命令行的一些相关功能,比如:ps、top、lsof、netstat、ifconfig、who、df、kill、free、nice、ionice、iostat、iotop、uptime、pidof、tty、taskset、pmap (感兴趣的可以去百度一下这些命令的具体作用以及原理,学到就是赚到)
通常我们获取操作系统信息往往采用编写shell来实现,如获取当前物理内存总大小以及使用大小、shell命令如下
物理内存total值: free -m | grep Mem | awk '{print $2}'
物理内存used值:free -m | grep Mem | awk '{print $3}'
这样长长的一段shell 往往我们编写起来会很麻烦 容易出错 同时也不容易记忆
相较而言使用psutil库实现则更加简单明了
安装完成之后我们就可以在python文件中使用啦
当然也可以在终端中去使用
psutil模块已经封装了这些方法,根据需要调用就可以
(1) CPU信息
User Time,执行用户进程时间的百分比
System Time,执行内核进程和中断的时间百分比
WaitIO,由于IO等待而使CPU处于idle(空闲)状态的时间百分比
idle,CPU处于idle状态的时间百分比
import psutil
psutil.cpu_times() # 使用cpu_time方法获取cpu完整信息,需要现实所有逻辑CPU信息
# 指定方法变量 percpu=True即可,如psutil.cpu_times(percpu=True)
print(psutil.cpu_times())
psutil.cpu_times().user
print(psutil.cpu_times().user)
psutil.cpu_count() # 获取CPU的逻辑个数,默认logical=True4
print(psutil.cpu_count())
psutil.cpu_count(logical=False) # 获取CPU的物理个数
print(psutil.cpu_count(logical=False) )
我们使用Python的psutil.cpu_times()方法可以非常简单的得到这些信息,同时也可以获取CPU的硬件相关的信息,比如CPU的物理个数与逻辑个数
( 2)内存信息
linux系统的内存利用率信息涉及total(内存总数)、used(已使用的内存数)、free(空闲的内存数)、buffers(缓冲使用数)、cache(缓存使用数)、swap(交换分区使用数),分别使用psutil.virtual_memory()与psutil.swap_memory()方法获取这些信息
import psutil
mem = psutil.virtual_memory() # 使用psutil.virtual_memory方法获取内存完整信息
print(mem)
mem.total # 获取内存总数
print(mem.total)
mem.free # 获取空闲内存数
print(mem.free)
psutil.swap_memory() # 获取swap分区信息
print(psutil.swap_memory())
(3)磁盘信息
在系统的所有磁盘信息中,磁盘刘勇率使用psutil.disk_usage方法获取。磁盘io信息包括read_count(读io数)、write_count(写io数)、read_bytes(io读字节数)、warite_bytes(IO写字节数)、read_time(磁盘读时间)、write_time(磁盘写时间)。这些io信息可以使用psutil.disk_io_counters()获取
import psutil
psutil.disk_partitions() # 使用psutil.disk_partitions方法获取磁盘完整信息
print(psutil.disk_partitions())
psutil.disk_usage('/') # 使用psutil.disk_usage方法获取分区参数的使用情况
print(psutil.disk_usage('/'))
(4)网络信息
系统的网络信息和磁盘IO信息类似,涉及到几个关键点,包括bytes_sent(发送字节数)、bytes_recv(接受字节数)、packets_sent=200987(发送数据包数)、packets_recv(接受数据包数)等。这些信息都可以使用psutil.net_io_counters()获取
import psutil
psutil.net_io_counters() # 使用psutil.net_io_counters()获取网络总的IO信息,默认pernic = False
print(psutil.net_io_counters())
psutil.net_io_counters(pernic = True) # 输出每个网络接口的IO信息
print(psutil.net_io_counters(pernic = True))
(5)其他系统信息
除了上面介绍的几个获取系统基本信息的方法,psutil模块还支持获取用户登录,开机时间等信息
import psutil,datetime
psutil.users() # 使用psutil.users方法返回当前登录系统的用户信息
print(psutil.users())
psutil.boot_time() # 获取开机时间,以linux时间戳格式返回
print(psutil.boot_time())
# 使用psutil.boot_time方式获取开机时间,以Linux时间戳格式返回
datetime.datetime.fromtimestamp(psutil.boot_time()).strftime("%Y-%m-%d%H:%M:%S")
print(datetime.datetime.fromtimestamp(psutil.boot_time()).strftime("%Y-%m-%d%H:%M:%S"))
2.系统进程管理方法
(1)进程信息
获得当前系统的进程信息,可以让运维人员得知应用程序的运行状态,包括进程的启动时间、查看或者设置CPU亲和度、内存使用率、IO信息、socket链接、线程数等、这些信息可以呈现出指定进程是否存活、资源利用情况、问题定位提供很好的数据参考
import psutil
psutil.pids() # 列出所有进程
p = psutil.Process(2424) # 实例化一个Process对象,参考为一进程PID
p.name('java') # 进程名
p.exe('/usr/bin/java') # 进程bin路径
p.cwd('/usr/local/hadoop-1') # 进程工作目录绝对路径
p.status('sleeping') # 进程状态
p.create_time()
p.uids() # 进程信息
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、ladder等信息
p.num_threads() # 进程开启的线程数
(2)popen类的使用
psutil提供的popen类的作用是获取用户启动的应用程序的进程信息,以便跟踪进程的运行状态
import psutil
from subprocess import PIPE
# 通过psutil的Popen方法启动应用程序,可以根据该程序运行的所有相关信息
p = psutil.Popen(["/usr/bin/python","-c","print('hello')"],stdout = PIPE)
p.name()
p.username()
p.communicate()
p.cpu_times() # 得到进程运行的CPU时间