当前位置: 首页 > news >正文

【Python专项】进阶语法-系统资源监控与数据采集(1)

进阶语法-系统资源监控与数据采集

1.Pycharm配置Python远程解析器

]# mkdir /root/pythonProject

]# dnf install -y python3-pip]# pip install psutil -i https://pypi.tuna.tsinghua.edu.cn/simple

开源地址:https://github.com/giampaolo/psutil

官网:https://psutil.readthedocs.io/stable/

psutil是一个跨平台的 Python 系统监控库,能让你用几行代码获取 CPU、内存、磁盘、网络和进程信息。

一句话优点:替代pstopfree等命令行工具,统一 API,代码更简洁。

2.psutil模块获取单个CPU使用率cpu_percent()

importpsutil# 获取 CPU 总使用率,1 秒间隔cpu_usage=psutil.cpu_percent(interval=1)print('CPU Usage:',cpu_usage,'%')

📝 代码总结

  • 核心知识点:使用psutil库获取系统 CPU 使用率
  • 实现逻辑:调用psutil.cpu_percent(interval=1)采集 1 秒间隔内的平均 CPU 使用率,打印结果
  • 关键语法import psutil导入第三方库、psutil.cpu_percent(interval=秒数)采集 CPU 占用百分比
  • 参数说明interval参数指定采样间隔时间,确保获取相对稳定的 CPU 使用率
  • 功能作用:实现系统性能监控的基础数据采集

3.psutil模块获取多核CPU使用率cpu_count()

""" psutil.cpu_count() --> 获取CPU核数 psutil.cpu_percent(interval=1, percpu=True) --> 获取CPU使用率,返回一个列表,列表中每个元素代表一个CPU核的使用率 """importpsutilforiinrange(psutil.cpu_count()):print(f'第{i+1}个CPU核心使用率:{psutil.cpu_percent(interval=1,percpu=True)[i]}')

📝 代码总结

  • 核心知识点psutil获取 CPU 核心数量及每个核心的使用率
  • 实现逻辑psutil.cpu_count()获取 CPU 核心总数;通过for循环遍历每个核心,调用psutil.cpu_percent(interval=1, percpu=True)返回的列表,取对应索引的值作为该核心使用率
  • 关键语法percpu=True参数返回每个核心的使用率列表、range(cpu_count())生成索引范围、通过索引访问列表元素
  • 注意事项psutil.cpu_percent()每次调用都会重新采集数据,建议将结果先存入变量再遍历使用,避免重复采集造成性能损耗
  • 功能作用:实现多核 CPU 系统的详细性能监控,输出各核心的独立负载情况

4.psutil模块获取物理内存virtual_memory()swap内存swap_memory()信息

importpsutil memory_info=psutil.virtual_memory()print(f'总物理内存:{memory_info.total/1024**3:.2f}G')print(f'已使用物理内存:{memory_info.used/1024**3:.2f}G')print(f'未使用物理内存:{memory_info.available/1024**3:.2f}G')print(f'物理内存使用率:{memory_info.percent}%')print('@'*20)swap_info=psutil.swap_memory()print(f'总交换内存:{swap_info.total/1024**3:.2f}G')print(f'已使用交换内存:{swap_info.used/1024**3:.2f}G')print(f'未使用交换内存:{swap_info.free/1024**3:.2f}G')print(f'交换内存使用率:{swap_info.percent}%')

📝 代码总结

  • 核心知识点psutil获取物理内存与交换内存信息
  • 实现逻辑:分别调用psutil.virtual_memory()psutil.swap_memory()获取内存统计对象,提取 total、used、available/free、percent 属性,转换为 GB 单位并格式化输出
  • 关键语法1024 ** 3字节转 GB、:.2f保留两位小数、字符串分隔线'@' * 20
  • 属性对比
    • 物理内存使用available表示可用内存
    • 交换内存使用free表示未使用内存
  • 功能作用:全面监控系统内存资源,同时查看物理内存和交换分区(虚拟内存)的使用情况

5.pstui模块获取磁盘信息

importpsutil# 获取所有磁盘分区forpartitionsinpsutil.disk_partitions(): print(f'磁盘设备:{partitions.device} 挂载点:{partitions.mountpoint} 文件类型:{partitions.fstype}')# 获取磁盘使用情况,disk_usage(磁盘路径)disk_usage=psutil.disk_usage('/')print(f'/根分区 -> 总磁盘大小:{disk_usage.total:.2f}G%')print(f'/根分区 -> 已使用磁盘大小:{disk_usage.used:.2f}G%')print(f'/根分区 -> 磁盘使用率:{disk_usage.percent}%')

6.psutil获取磁盘IO信息

importtimeimportpsutil# 获取磁盘 IO信息disk_io_1=psutil.disk_io_counters()# 休眠 10Stime.sleep(10)# 获取磁盘 IO信息disk_io_2=psutil.disk_io_counters()# 获取磁盘吞吐量read_bytes=disk_io_2.read_bytes - disk_io_1.read_bytes write_bytes=disk_io_2.write_bytes - disk_io_1.write_bytes print(f'磁盘读取吞吐量:{read_bytes / (1024 ** 2)}MB/s')print(f'磁盘写入吞吐量:{write_bytes / (1024 ** 2)}MB/s')

📝 代码总结

  • 核心知识点:使用psutil通过差值计算磁盘 I/O 吞吐量
  • 实现逻辑:首次调用psutil.disk_io_counters()获取初始读写字节数,休眠 10 秒后再次获取,计算两次差值除以时间间隔得到每秒吞吐量
  • 关键语法time.sleep(秒数)实现间隔采样、差值计算第二次 - 第一次1024 ** 2字节转 MB
  • 计算公式:吞吐量 = (后续字节数 - 初始字节数) / 间隔时间
  • 注意事项:计算结果单位为 MB/s,实际代码未除以时间间隔(10秒),输出值为 10 秒内的总读写量而非每秒速率
  • 功能作用:监控磁盘读写速率,评估系统磁盘 I/O 性能

7.psutil获取网络IO信息

importpsutil# 获取网络IO信息net_io=psutil.net_io_counters()print(f'发送字节数:{net_io.bytes_sent}')print(f'接收字节数:{net_io.bytes_recv}')

📝 代码总结

  • 核心知识点psutil.net_io_counters()获取网络 I/O 统计信息
  • 实现逻辑:调用psutil.net_io_counters()获取网络接口的累计收发数据量,分别输出发送和接收的字节数
  • 关键语法net_io.bytes_sent获取发送字节数、net_io.bytes_recv获取接收字节数
  • 数据特性:返回的是系统启动以来的累计值,非实时速率
  • 功能作用:实现网卡流量监控的基础数据采集,可用于计算网络带宽使用率或流量统计

8.psutil模块获取网络IO吞吐量

# 监听 9999 端口,将接收到的数据丢入 /dev/null(模拟接收)[root@node1 ~]# nc -l -p 9999 > /dev/null &[1]5330# 产生约 500MB 的数据流发送给本机 9999 端口,这里的 sleep 是为了让你有时间启动 Python 脚本观察数据[root@node1 ~]# dd if=/dev/zero bs=1M count=500 | nc 127.0.0.1 9999500+0 recordsin500+0 records out524288000bytes(524MB,500MiB)copied,0.710805s,738MB/s
importpsutilimporttime net_io_1=psutil.net_io_counters()time.sleep(1)net_io_2=psutil.net_io_counters()send_bytes=net_io_2.bytes_sent-net_io_1.bytes_sent recv_bytes=net_io_2.bytes_recv-net_io_1.bytes_recvprint(f'网络IO发送的吞吐量:{send_bytes/(1024**2)}MB/s')print(f'网络IO接收的吞吐量:{recv_bytes/(1024**2)}MB/s')

📝 代码总结

  • 核心知识点:通过差值计算网络 I/O 实时吞吐量
  • 实现逻辑:首次调用psutil.net_io_counters()获取初始收发字节数,间隔 1 秒后再次获取,计算两次差值得到每秒传输量,转换为 MB/s 输出
  • 关键语法time.sleep(1)固定采样间隔、差值计算第二次 - 第一次1024 ** 2字节转 MB
  • 计算公式:吞吐量(MB/s) = (后续字节数 - 初始字节数) / 间隔秒数 / 1024²
  • 注意事项:此代码输出的是 1 秒内的平均速率,采样间隔可根据需求调整
  • 功能作用:实时监控网卡上传/下载速率,评估网络带宽使用情况

9.psutil模块获取网卡信息

importpsutil net_if_addrs=psutil.net_if_addrs()# 获取网卡信息# print(net_if_addrs) #--> 可以自行查看信息forinterface_name,interface_addressinnet_if_addrs.items():print(f'网卡名称:{interface_name}')print(f'网卡地址:{interface_address[0].address}')print(f'-'*90)

10.psutil模块获取cpu使用率并结合邮件告警

importpsutilimportsmtplibfromemail.mime.textimportMIMETextfromemail.headerimportHeader from_addr='xxxxxxx@163.com'# 发件方to_addr='xxxxxxx@qq.com'# 收件方auth_code='xxxxxxxxxxx'# 授权码cpu_usage=psutil.cpu_percent(interval=1)# 获取 CPU 使用率ifcpu_usage>=80:subject='警告!CPU使用率过高,超过了阈值80%!'message=f'CPU使用率过高,超过了阈值80%,当前CPU使用率为{cpu_usage}%'msg=MIMEText(message,'plain','utf-8')msg['Subject']=Header(subject,'utf-8')msg['From']=from_addr msg['To']=to_addr smtp_server=smtplib.SMTP_SSL('smtp.163.com',465)smtp_server.login(from_addr,auth_code)smtp_server.sendmail(from_addr,to_addr,msg.as_string())smtp_server.quit()print('邮件发送成功!')
~]# yum install -y stress-ng~]# stress-ng --cpu 4 --timeout 60s

11.paramiko模块实现远程登录并执行命令

paramiko主要用于实现(远程登录)、(文件上传)与(下载功能)

~]# pip install paramiko -i https://pypi.tuna.tsinghua.edu.cn/simple

importparamiko# 创建SSHClient对象ssh=paramiko.SSHClient()# 首次连接,会进行指纹确认,提示输入yes,表示允许连接,我们可以忽略掉这个信息,不输入yesssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())# 连接远程服务器 172.25.254.12:22ssh.connect('172.25.254.12',username='root',password='root')# 执行命令,获取返回结果stdin,stdout,stderr=ssh.exec_command('touch /tmp/test.txt')# 返回最终结果print(stdout.read().decode())print(stderr.read().decode())# 关闭ssh连接ssh.close()

📝 代码总结

  • 核心知识点:使用paramiko库实现 SSH 远程连接并执行命令
  • 实现逻辑:创建 SSHClient 对象 → 设置自动添加主机密钥策略 → 连接远程服务器(IP、用户名、密码)→ 执行命令touch /tmp/test.txt→ 读取输出结果 → 关闭连接
  • 关键语法
    • set_missing_host_key_policy(paramiko.AutoAddPolicy())自动接受未知主机密钥
    • ssh.connect(ip, username, password)认证连接
    • exec_command(命令)执行远程命令,返回三管道对象
    • stdout.read().decode()读取标准输出并解码
    • stderr.read().decode()读取错误输出
  • 管道说明stdin用于输入、stdout接收正常输出、stderr接收错误信息
  • 注意事项:生产环境建议使用密钥认证替代明文密码
  • 功能作用:自动化远程运维,批量执行服务器命令

12.paramiko模块实现远程登录并执行命令(函数版)

importparamikodefssh_exec(hostname,password,cmd,port=22,username="root"):# 创建SSHClient对象ssh=paramiko.SSHClient()# 允许不在know_hosts文件中的主机ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())# 链接服务器ssh.connect(hostname=hostname,port=port,username=username,password=password)stdin,stdout,stderr=ssh.exec_command(cmd)# 返回最终结果print(stdout.read().decode())print(stderr.read().decode())ssh.close()# 单词调用调用函数# ssh_exec("172.25.254.12","root","ls -l /mnt",22)whileTrue:cmd=input('[root@node2 ~]# ')ssh_exec('172.25.254.12','root',cmd)

📝 代码总结

  • 核心知识点:将 SSH 远程执行逻辑封装为函数,配合循环实现交互式远程命令执行
  • 实现逻辑:定义ssh_exec()函数封装连接、执行、关闭流程;while True循环接收用户输入的命令,调用函数在远程服务器执行
  • 关键语法:函数默认参数(port=22,username="root")、函数调用传参、input()获取命令
  • 函数参数说明
    • hostname:服务器 IP
    • password:登录密码
    • cmd:待执行命令
    • port:SSH 端口(默认22)
    • username:用户名(默认 root)
  • 注意事项:循环中没有退出条件,需通过Ctrl+C或添加exit/quit判断来退出
  • 功能作用:模拟简易的远程 Shell 工具,实现持续的远程命令执行

13.paramiko模块实现免密登录

~]# ssh-keygen~]# ssk-copy-id xxx@xxx~]# ll /root/.ssh/id_ed25519-rw-------1root root399May723:32 /root/.ssh/id_ed25519

importparamiko ssh=paramiko.SSHClient()ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())# 老版openssh -> paramiko.RSAKey.from_private_key_file('/root/.ssh/id_RSA')private_key=paramiko.Ed25519Key.from_private_key_file('/root/.ssh/id_ed25519')ssh.connect('172.25.254.12',username='root',pkey=private_key)stdin,stdout,stderr=ssh.exec_command('ls -l /root/.ssh/')print(stdout.read().decode())print(stderr.read().decode())ssh.close()

📝 代码总结

  • 核心知识点:使用paramiko通过密钥认证方式登录 SSH
  • 实现逻辑:创建 SSHClient → 设置自动接受主机密钥 → 读取本地私钥文件 → 使用私钥对象连接服务器 → 执行命令 → 关闭连接
  • 关键语法
    • paramiko.Ed25519Key.from_private_key_file(密钥路径)读取 Ed25519 类型私钥
    • ssh.connect(pkey=私钥对象)使用密钥认证替代密码认证
  • 密钥类型
    • Ed25519Key:适用于新版 OpenSSH(Ed25519 算法)
    • RSAKey:适用于旧版 OpenSSH(RSA 算法),代码注释中展示了 RSA 用法
  • 安全优势:密钥认证比密码认证更安全,无需在网络中传输明文密码
  • 功能作用:实现无密码的自动化远程认证,适用于脚本和自动化运维场景

14.paramiko模块实现上传与下载

importparamiko# 创建传输连接trans=paramiko.Transport(('172.25.254.11',22))# 使用账号密码连接node1服务器trans.connect(username='root',password='root')# 创建sftp对象,实现上传与下载sftp=paramiko.SFTPClient.from_transport(trans)sftp.put('/etc/passwd','/tmp/passwd.bak')# 上传文件(本地文件路径,远程目标文件路径)sftp.get('/etc/shadow','/mnt/shadow.bak')# 下载文件(远程目标文件路径,本地文件路径)trans.close()

15.paramiko模块实现上传与下载(免密版)

importparamiko trans=paramiko.Transport(('172.25.254.12',22))private_key=paramiko.Ed25519Key.from_private_key_file('/root/.ssh/id_ed25519')trans.connect(username='root',pkey=private_key)sftp=paramiko.SFTPClient.from_transport(trans)sftp.put('/root/anaconda-ks.cfg','/mnt/anaconda-ks.cfg.bak')# 将172.25.254.11的上传到172.25.254.12下面sftp.get('/etc/at.deny','/root/xxx.txt')# 将172.25.254.12的下载到172.25.254.11下面trans.close()

📝 代码总结

  • 核心知识点:使用paramiko的 Transport 层实现 SFTP 文件传输
  • 实现逻辑:创建 Transport 对象指定目标主机和端口 → 使用 Ed25519 私钥认证连接 → 通过 Transport 创建 SFTP 客户端 → 执行put上传和get下载操作 → 关闭连接
  • 关键语法
    • paramiko.Transport((host, port))创建传输层对象
    • SFTPClient.from_transport(trans)从 Transport 对象构建 SFTP 客户端
    • sftp.put(本地路径, 远程路径)上传文件
    • sftp.get(远程路径, 本地路径)下载文件
  • 传输方向
    • put:从本地(执行脚本的机器)上传到远程服务器
    • get:从远程服务器下载到本地(执行脚本的机器)
  • 功能作用:实现远程服务器间的文件上传与下载,适用于自动化备份和文件分发场景
http://www.jsqmd.com/news/782747/

相关文章:

  • 开发者专属:用coding-plan打造高效技术学习与自律管理系统
  • 纳米工艺IC测试挑战与BIST技术创新
  • 子弹型制冰机实力厂家揭秘:核心技术强、产能稳定的生产商推荐 - 品牌推荐大师
  • 如何用500KB开源工具彻底替代AWCC:AlienFX Tools终极控制指南
  • CANN驱动获取设备板ID
  • 2026年十大AI音乐软件推荐:国际标杆领衔,蘑兔AI紧随其后
  • CANN/pyasc按位或运算API
  • Kubernetes网络模型深度解析与实践
  • CANN/ge函数处理点API
  • 如何用纯C语言将网易云NCM加密音乐转换为通用MP3格式:完整技术解析与操作指南
  • 2026年一千京东卡回收多少钱,最新折扣率表 - 猎卡回收公众号
  • 【官方首发】亨得利高端腕表服务最新公告:2026年全国售后服务网络优化升级官方解读(附统一服务标准全国网点预约通道防伪指南) - 亨得利腕表维修中心
  • Gemma-4模型在NPU上推理
  • CANN/metadef算子平铺构建
  • 如何用Sunshine搭建个人游戏串流服务器:跨设备畅玩3A大作的完整指南
  • 浅谈GaussDB (DWS)技术【玩转PB级数仓GaussDB(DWS)】
  • 2026年不干胶标签与办公用纸一站式采购完全指南 - 优质企业观察收录
  • PotPlayer字幕翻译插件深度解析:打破语言壁垒的专业解决方案
  • 根脉——溯源
  • B站视频转文字终极指南:如何用AI技术快速提取视频内容并生成文字稿
  • PotPlayer字幕翻译插件架构解析:百度翻译API集成与性能优化指南
  • InsMatrixAutomation 日志系统设计深度解析:从 Loguru 到企业级日志实践
  • CANN Alpamayo-R1智驾优化
  • 2026法治教育展厅怎么做?未成年法治教育展厅展馆设计 - 新闻快传
  • 微信立减金闲置率近五成,教你合规盘活你的支付权益 - 团团收购物卡回收
  • CANN算子库GeGluV3算子
  • Kubernetes存储深度解析与实践
  • nvm安装node的目录
  • 职场人的「深夜困境」:为什么我选择用AI社交平台倾诉
  • 湖州黄金回收怎么选?6 大品牌覆盖吴兴 / 南浔 / 德清 / 长兴 / 安吉,免费上门 + 实时金价 + 当场结款 - 金掌柜黄金回收