系统基础信息

通过运用Python的第三方模块,获取服务关键运营指标。包括Linux基本性能,块设备,网卡接口,系统信息,网络地址库等信息。采集到这些数据后,我们可以了解服务的状态,再结合告警机制,可以在第一时间响应,将异常出现在苗头就处理了。

系统性能信息模块psutil

安装

psutil版本:5.8

1
2
3
4
5
6
7
# 源码安装
wget https://pypi.python.org/packages/source/p/psutil/psutil-5.8.0.tar.gz
tar zxvf psutil-5.8.0.tar.gz
cd psutil-5.8.0
yum -y install python-devel (如果提示缺少python.h头文件,执行此命令。)
python setup.py install

1
2
# pip 安装
pip3 install psutil

第一个程序

1
2
3
4
import psutil

mem = psutil.virtual_memory()
print(mem.total,mem.used)

系统性能信息

基本性能包括CPU,内存,磁盘,网络等,可以完整描述当前的系统的运行状态及质量。

CPU信息

cpu利用率有以下几个部分:

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

我们用psutil.cpu_times()可以非常简单的得到这些信息。可以获取CPU的硬件相关信息,比如CPU的物理个数和逻辑个数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import psutil

# 获取CPU完整信息,需要显示所有的逻辑CPU信息
state = psutil.cpu_times()

print(state)

# 获取单项数据,例如用户user的cpu时间比
print(state.user)

# 获取CPU的逻辑个数,默认logical=4
print(psutil.cpu_count())

# 获取CPU物理个数
print(psutil.cpu_count(logical=False))

内存信息

Linux系统的内存利用率信息涉及total(内存总数)used(已使用内存),**free(空闲内存)buffers(缓存使用)cache(缓存使用)swap(交换分区使用)**等。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import psutil

# 获取内存完整信息
mem = psutil.virtual_memory()
print(mem)

# 获取内存总数
print(mem.total)

# 获取内存空余
print(mem.free)

# 交换分区信息
print(psutil.swap_memory())

磁盘信息

我们关注磁盘利用率及IO信息,磁盘利用率用psutil.disk_usage方法获取。磁盘IO信息包括read_count(读IO数),write_count(写IO数),read_bytes(IO读字节数),write_bytes(写字节数),read_time(磁盘读时间),write_time(磁盘写时间)。这些可以由psutil.disk_io_counters()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import psutil

# 获取磁盘完整信息
state = psutil.disk_partitions()
print(state)

# 获取分区使用情况
print(psutil.disk_usage('/'))

# 获取硬盘的总IO个数,读写信息
print(psutil.disk_io_counters())

# 获取硬盘的单个分区,读写信息
print(psutil.disk_io_counters(perdisk=True))

网络信息

主要是bytes_sent(发送字节数),bytes_recv(接收字节数)

packets_sent(发送数据包数),packets_recv(接收数据包数)

这些网络信息可以用psutil.net_io_counters()方法。

1
2
3
4
import psutil

state = psutil.net_io_counters()
print(state)

image-20230627173322352

其他信息

用户登录时间信息

psutil.users()

1
2
3
4
5
6
7
import psutil

state = psutil.users()
print(state)import psutil

state = psutil.users()
print(state)

开机时间

1
2
3
4
5
6
7
8
9
10
import psutil
import datetime

# 获取开机时间,用Linux时间戳格式返回
boot_time = psutil.boot_time()
print(boot_time)

# 这不习惯,换成自然时间格式
butty_time = datetime.datetime.fromtimestamp(boot_time).strftime("%Y-%m-%d %H:%M:%S")
print(butty_time)

image-20230627174554987

系统进程管理方法

获取进程信息,可以让运维人员了解应用程序的运行状态,包括进程启动时间,查看或者设置cpu亲和度,内存使用率,IO信息,socket连接,线程数。

进程信息

psutil.pids获取所有的进程pid,使用psutil.Process获取单个进程的名称、路径、状态等信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import psutil

# 所有的进程PID
print(psutil.pids())

# 我的进程随机取一个为例子
p = psutil.Process(11388)
p.name() # 进程名字
p.exe() # 进程bin路径
p.cwd() # 进程工作目录绝对路径
p.status() # 进程状态
p.create_time # 进程创建时间,时间戳格式
p.uids() # 进程uid信息
p.gid()
p.cpu_times() #cpu时间信息,包括user,system两个时间
p.cpu_affinity() # get进程cpu亲和度,如果要设置亲和度,将CPU号设置为参数就行
p.memory_info() # 进程内存rss、vms信息
p.io_counters() # 进程Io信息,包括读写和字节数
p.connections() # 返回打开进程的socket的namedutples列表
p.num_threads() # 进程开启的线程数

image-20230627175535103

popen类的使用

psutil提供的popen类的作用是获取用户启动应用程序的进程信息,用来跟踪程序进程的运行状态。

1
2
3
4
5
6
7
8
9
10
import psutil
from subprocess import PIPE

# 跟踪应用程序
p = psutil.Popen(["/usr/bin/python","-c","print('hello')"],stdout=PIPE)

print(p.name())
print(p.username())
print(p.communicate())
print(cpu_times())

举例

1
2
3
4
5
6
7
8
9
10
import psutil

from subprocess import PIPE

# 跟踪应用程序
p = psutil.Popen(["/usr/local/bin/python3","-c","print('hello')"],stdout=PIPE)

print(p.name())
print(p.username())
print

我的python3安装位置是

image-20230627182548767

image-20230627182623048

IP地址处理模块IPy

ip地址规划是网络设计的重要环节,规划的好坏会直接影响路由协议算法的效率、网络性能、可扩展性。在这个过程中,需要计算大量的IP地址,包括网段、网络掩码、广播地址、子网数、IP类型等。IPy可以很好的帮助我们。

安装

1
pip3 install IPy

IP地址、网段的基本处理

  • version方法区分IPv4和IPv6
1
2
3
4
IP('10.0.0.0/8').version()

IP('10.0.0.0').version()

image-20230627234602226

  • 输出网段IP个数和IP地址清单
1
2
3
4
5
6
from IPy import IP

ip = IP('192.168.1.0/24')
print(ip.len()) # 输出网段的个数
for per_ip in ip:
print(per_ip)
  • IP常见方法
1
2
3
4
from IPy import IP

ip = IP('192.168.1.2')
ip.reverseNames() # 反向地址解析

业务服务监控

定制业务质量报表

Python与系统安全

1
2
3
4
5
6
7
8
9
10
graph TB
A[用户] -- 垃圾投放 --> B[智能垃圾桶]
B -- 数据上传 --> C[云服务平台]
C -- 数据分析 --> D[政府/运营商]
C -- 数据调度 --> E[智能垃圾回收车]
E -- 垃圾回收 --> B
A -- 领取垃圾袋 --> F[智能垃圾袋发放机]
A -- 查询/兑换 --> G[移动平台]
G -- 数据交互 --> C