本文详细介绍了如何在python中利用subprocess、resource和psutil库精确监控unix子进程的cpu时间(用户态和系统态)及实时内存使用情况。重点阐述了resource.getrusage调用时机对cpu时间测量的关键影响,并提供了结合实时内存采样与正确cpu时间捕获的完整代码示例,旨在帮助开发者准确评估外部工具的性能表现。
在许多场景下,例如运行生物信息学工具、批处理脚本或任何需要调用外部程序的Python应用中,准确监控这些子进程的性能至关重要。这不仅有助于评估不同工具或参数配置的效率,还能帮助识别性能瓶颈和优化资源使用。本教程将深入探讨如何使用Python标准库subprocess、resource以及第三方库psutil来精确测量子进程的CPU时间消耗和内存占用。
在开始实践之前,我们首先了解一下将要使用的关键Python库:
测量子进程的CPU时间是评估其计算效率的核心指标。resource.getrusage()函数能够返回一个包含多种资源使用情况的对象,其中ru_utime(用户态CPU时间)和ru_stime(系统态CPU时间)是我们需要关注的。
关键点:resource.getrusage(resource.RUSAGE_CHILDREN)的调用时机
resource.getrusage(resource.RUSAGE_CHILDREN)用于获取当前进程所有已终止子进程的资源使用情况。这意味着,要准确测量子进程的CPU时间,必须在子进程完成执行并终止后才能调用此函数来获取其累计的CPU时间。如果在子进程仍在运行时或尚未终止时调用,它将不会包含该子进程的完整CPU时间。
错误示例分析: 原始代码中,usage_end = resource.getrusage(resource.RUSAGE_CHILDREN)被放置在subprocess.Popen调用之后,但在r.poll()循环之前。这意味着当usage_end被调用时,子进程可能刚刚启动或尚未开始消耗显著的CPU时间,导致usage_end.ru_utime - usage_start.ru_utime计算结果为0。
正确做法: 将第二次resource.getrusage(resource.RUSAGE_CHILDREN)的调用移到确认子进程已终止的循环之后。
虽然resource模块可以提供峰值内存使用(ru_maxrss),但psutil库提供了更灵活和实时的内存监控能力。我们可以通过周期性地采样系统或特定进程的内存信息,来了解子进程运行期间的内存占用趋势。
两种内存监控策略:
系统级内存监控(psutil.virtual_memory()): 这种方法获取的是整个系统的内存使用情况。当只有一个主要子进程在运行时,这种方法可以间接反映子进程对系统内存的影响。它提供了总内存、可用内存、已用内存和内存百分比等信息。
进程级内存监控(psutil.Process(pid).memory_info()): 如果需要更精确地了解特定子进程的内存使用,可以通过psutil.Process(pid)来获取该子进程的详细内存信息,例如常驻内存集大小(RSS)、虚拟内存大小(VMS)等。这通常是更推荐的做法,因为它排除了其他系统进程的影响。
本教程将主要演示系统级内存监控,并简要提及进程级监控的优势。
下面是一个结合了CPU时间测量和实时内存监控的Python脚本示例。
import sys
import os
import subprocess
import resource
import psutil
import time
def get_system_memory_info():
"""
获取当前系统的内存使用信息(GB为单位)。
"""
mem = psutil.virtual_memory()
return {
"total_memory": mem.total / (1024.0 ** 3),
"available_memory": mem.available / (1024.0 ** 3),
"used_memory": mem.used / (1024.0 ** 3),
"memory_percentage": mem.percent
}
def get_process_memory_info(pid):
"""
获取指定PID进程的内存使用信息(MB为单位)。
"""
try:
process = psutil.Process(pid)
mem_info = process.memory_info()
return {
"rss_mb": mem_info.rss / (1024.0 ** 2), # 常驻内存集大小
"vms_mb": mem_info.vms / (1024.0 ** 2) # 虚拟内存大小
}
except psutil.NoSuchProcess:
return None # 进程可能已终止
def monitor_subprocess_performance(bioinformatics_tool, setups, resultdir, inputs, tbl_rep_file):
"""
监控子进程的CPU时间与内存使用。
"""
# 示例变量,实际应用中请替换为您的具体值
# bioinformatics_tool = "your_bio_tool"
# setups = "--some-setup-args"
# resultdir = "/path/to/results"
# inputs = "/path/to/input.fasta"
# tbl_rep_file = "report_file.txt"
print(f"开始监控工具: {bioinformatics_tool}")
# 打开报告文件
try:
outrepfp = open(tbl_rep_file, "w")
except IOError as e:
sys.
exit(f"错误: 无法打开报告文件 {tbl_rep_file}: {e}")
SLICE_IN_SECONDS = 1 # 内存采样间隔
# 1. 在子进程启动前记录资源使用
usage_start = resource.getrusage(resource.RUSAGE_CHILDREN)
# 2. 构建并执行子进程命令
cmd = '{0} {1} --tblout {2} {3}'.format(bioinformatics_tool, setups, resultdir, inputs)
print(f"执行命令: {cmd}")
# 使用subprocess.Popen执行命令
# 注意: stdout=subprocess.DEVNULL 将标准输出重定向到空设备
# stderr=subprocess.PIPE 将标准错误捕获到管道中,以便后续检查
try:
r = subprocess.Popen(cmd.split(), stdout=subprocess.DEVNULL, stderr=subprocess.PIPE, encoding='utf-8')
except FileNotFoundError:
sys.exit(f"错误: 命令 '{bioinformatics_tool}' 未找到。请检查路径或环境变量。")
except Exception as e:
sys.exit(f"错误: 执行子进程失败: {e}")
# 3. 实时监控内存使用,直到子进程结束
system_memory_snapshots = []
process_memory_snapshots = []
# 获取子进程的PID,用于进程级内存监控
child_pid = r.pid
print(f"子进程PID: {child_pid}")
while r.poll() is None: # 检查子进程是否仍在运行
system_memory_snapshots.append(get_system_memory_info())
# 也可以同时监控子进程自身的内存
proc_mem = get_process_memory_info(child_pid)
if proc_mem:
process_memory_snapshots.append(proc_mem)
time.sleep(SLICE_IN_SECONDS)
# 确保在子进程终止后,再进行一次资源使用记录
# 4. 子进程终止后记录资源使用,以获取准确的CPU时间
usage_end = resource.getrusage(resource.RUSAGE_CHILDREN)
# 5. 检查子进程返回码,处理潜在错误
if r.returncode != 0:
error_output = r.stderr.strip()
sys.exit(f'FAILED: 命令 "{cmd}" 失败,返回码 {r.returncode}\n错误输出:\n{error_output}')
# 6. 提取并计算性能指标
# 提取系统已用内存的最大值(从采样数据中)
max_system_used_memory_gb = 0
if system_memory_snapshots:
max_system_used_memory_gb = max(m['used_memory'] for m in system_memory_snapshots)
# 提取子进程峰值RSS内存(如果进行了进程级监控)
max_process_rss_mb = 0
if process_memory_snapshots:
max_process_rss_mb = max(m['rss_mb'] for m in process_memory_snapshots)
# 计算CPU时间
cpu_time_user = usage_end.ru_utime - usage_start.ru_utime
cpu_time_system = usage_end.ru_stime - usage_start.ru_stime
total_cpu_time = cpu_time_user + cpu_time_system
# 7. 将测量结果写入报告文件
report_line = (
f"{bioinformatics_tool} "
f"用户CPU时间: {cpu_time_user:.4f}s "
f"系统CPU时间: {cpu_time_system:.4f}s "
f"总CPU时间: {total_cpu_time:.4f}s "
f"峰值系统已用内存: {max_system_used_memory_gb:.2f}GB "
f"峰值进程RSS内存: {max_process_rss_mb:.2f}MB\n"
)
outrepfp.write(report_line)
outrepfp.close()
print(f"性能报告已写入: {tbl_rep_file}")
print(report_line.strip())
# 示例调用 (请根据您的实际情况修改参数)
if __name__ == "__main__":
# 假设的参数
tool_name = "example_tool"
tool_setups = "-i input.txt -o output.txt"
results_dir = "./results"
input_data = "data.csv"
report_file_name = "performance_report.txt"
# 创建一个模拟的外部工具脚本
# 在实际环境中,这会是您的真实生物信息学工具
with open("example_tool", "w") as f:
f.write("#!/bin/bash\n")
f.write("echo 'Running example tool...' >&2\n")
f.write("sleep 3 # 模拟工作3秒\n")
f.write("echo 'Example tool finished.' >&2\n")
f.write("exit 0\n")
os.chmod("example_tool", 0o755) # 赋予执行权限
# 创建模拟的results目录
os.makedirs(results_dir, exist_ok=True)
monitor_subprocess_performance(
tool_name,
tool_setups,
results_dir,
input_data,
report_file_name
)
# 清理模拟文件
os.remove("example_tool")
os.rmdir(results_dir)通过结合subprocess、resource和psutil库,我们可以构建一个强大而灵活的性能监控系统,用于评估Python中Unix子进程的CPU时间和内存使用。理解resource.getrusage的正确调用时机是获取准确CPU时间的关键,而psutil则提供了实时、细粒度的内存监控能力。遵循本教程中的方法和最佳实践,您将能够更有效地分析和优化您的外部工具和脚本的性能。
# python
# app
# 工具
# 虚拟内存
# csv
# ai
# unix
# 环境变量
# 性能瓶颈
# 内存占用
# python脚本
# 标准库
相关文章:
交易网站制作流程,我想开通一个网站,注册一个交易网址,需要那些手续?
广州建站公司哪家好?十大优质服务商推荐
东莞专业网站制作公司有哪些,东莞招聘网站哪个好?
建站主机系统SEO优化与智能配置核心关键词操作指南
西安专业网站制作公司有哪些,陕西省建行官方网站?
整蛊网站制作软件,手机不停的收到各种网站的验证码短信,是手机病毒还是人为恶搞?有这种手机病毒吗?
建站之星后台密码遗忘或太弱?如何重置与强化?
宝塔建站助手安装配置与建站模板使用全流程解析
css网站制作参考文献有哪些,易聊怎么注册?
香港服务器建站指南:免备案优势与SEO优化技巧全解析
哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?
广州美橙建站如何快速搭建多端合一网站?
官网自助建站系统:SEO优化+多语言支持,快速搭建专业网站
网站制作知乎推荐,想做自己的网站用什么工具比较好?
韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南
广州营销型建站服务商推荐:技术优势与SEO优化解析
网站建设制作、微信公众号,公明人民医院怎么在网上预约?
如何用搬瓦工VPS快速搭建个人网站?
网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?
常州自助建站工具推荐:低成本搭建与模板选择技巧
如何在阿里云服务器自主搭建网站?
南宁网站建设制作定制,南宁网站建设可以定制吗?
建站主机核心功能解析:服务器选择与网站搭建流程指南
南平网站制作公司,2025年南平市事业单位报名时间?
如何在建站之星网店版论坛获取技术支持?
如何用VPS主机快速搭建个人网站?
金*站制作公司有哪些,金华教育集团官网?
建站之星免费版是否永久可用?
如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南
如何通过VPS搭建网站快速盈利?
佛山网站制作系统,佛山企业变更地址网上办理步骤?
定制建站是什么?如何实现个性化需求?
一键制作网站软件下载安装,一键自动采集网页文档制作步骤?
建站之星安装后界面空白如何解决?
山东云建站价格为何差异显著?
寿县云建站:智能SEO优化与多行业模板快速上线指南
如何选择香港主机高效搭建外贸独立站?
已有域名如何免费搭建网站?
专业的网站制作设计是什么,如何制作一个企业网站,建设网站的基本步骤有哪些?
建站之星安全性能如何?防护体系能否抵御黑客入侵?
已有域名和空间,如何快速搭建网站?
如何在IIS中新建站点并配置端口与IP地址?
如何通过西部建站助手安装IIS服务器?
我的世界制作壁纸网站下载,手机怎么换我的世界壁纸?
手机怎么制作网站教程步骤,手机怎么做自己的网页链接?
如何在宝塔面板创建新站点?
如何用y主机助手快速搭建网站?
常州自助建站:操作简便模板丰富,企业个人快速搭建网站
手机网站制作与建设方案,手机网站如何建设?
网站制作壁纸教程视频,电脑壁纸网站?
*请认真填写需求信息,我们会在24小时内与您取得联系。