如何编写并运行程序测量系统启动后的CPU、磁盘及内存占用情况?
嘿,这个需求其实挺常见的,尤其是在排查启动慢或者资源占用异常的时候。我分Ubuntu 16.04和Windows 7两个场景给你详细说下怎么实现,都是无需额外装太多工具的方案,上手很快:
在Ubuntu 16.04下实现
方法1:用systemd+sar工具(最精准,从启动瞬间开始记录)
Ubuntu 16.04默认用systemd管理服务,sysstat包自带的sar工具可以后台自动记录系统启动后的所有资源数据,完全不需要手动干预,步骤如下:
- 先安装
sysstat包:sudo apt-get update && sudo apt-get install sysstat - 配置
sysstat开机自启:编辑/etc/default/sysstat文件,把里面的ENABLED="false"改成ENABLED="true" - 重启
sysstat服务让配置生效:sudo systemctl restart sysstat - 查看启动后的CPU使用率数据:直接输入
sar -u,默认会按每10分钟一次的采样频率展示数据;如果想要更细粒度的记录,去/var/log/sysstat/目录下找对应日期的日志文件(比如当天是15号,文件就是sa15),用命令sar -u -f /var/log/sysstat/sa15查看。
这个方法的好处是完全不影响启动过程,系统后台自动记录,你重启后直接查日志就行,非常省心。
方法2:自定义脚本记录(灵活可控,可同时监控CPU/内存/磁盘)
如果想要更灵活的采样频率,或者同时记录内存、磁盘IO数据,可以写个简单的bash脚本,让它开机自启:
- 先写脚本内容,保存为
/usr/local/bin/boot_resource_monitor.sh:#!/bin/bash LOG_FILE="/var/log/boot_resource_monitor.log" # 写入表头 echo "Timestamp,CPU_Usage(%),Mem_Usage(%),Disk_Read(KB/s),Disk_Write(KB/s)" > $LOG_FILE while true; do TIMESTAMP=$(date +"%Y-%m-%d %H:%M:%S") # 获取CPU使用率(计算非空闲占比) CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | awk '{print 100 - $1}') # 获取内存使用率 MEM_USAGE=$(free | grep Mem | awk '{print $3/$2 * 100.0}') # 获取磁盘IO数据(这里默认监控sda,根据你的磁盘名调整) DISK_IO=$(iostat -d -x 1 1 | grep sda | awk '{print $6","$7}') # 写入日志 echo "$TIMESTAMP,$CPU_USAGE,$MEM_USAGE,$DISK_IO" >> $LOG_FILE # 每1秒采样一次,可根据需求调整 sleep 1 done - 给脚本加执行权限:
sudo chmod +x /usr/local/bin/boot_resource_monitor.sh - 配置开机自启:创建
/etc/systemd/system/boot-monitor.service文件,内容如下:[Unit] Description=Boot Resource Monitor After=multi-user.target [Service] ExecStart=/usr/local/bin/boot_resource_monitor.sh Restart=always [Install] WantedBy=multi-user.target - 启用服务并重启:
sudo systemctl enable boot-monitor.service sudo reboot
重启后,你可以查看/var/log/boot_resource_monitor.log文件,里面就是从启动开始的所有资源采样数据了。
在Windows 7下实现
方法1:用系统自带的性能监视器(最靠谱,可视化展示)
Windows 7自带的性能监视器可以专门记录启动过程的资源数据,步骤非常简单:
- 按下
Win+R,输入perfmon打开性能监视器 - 左侧导航栏找到「数据收集器集」→「系统」→右键点击「系统启动」→选择「开始」
- 重启电脑,系统会在后台自动记录启动全程的CPU、内存、磁盘IO等数据
- 重启后回到性能监视器,左侧选「报告」→「系统」→「系统启动」,就能看到非常直观的资源占用曲线,甚至能看到每个启动阶段的资源变化细节。
这个方法是系统级别的记录,准确性拉满,而且不需要写任何代码。
方法2:用PowerShell脚本开机自启记录(自定义采样)
如果想要更灵活的采样频率,或者导出为CSV方便后续分析,可以用PowerShell脚本:
- 写脚本内容,保存为
C:\boot_resource_log.ps1:$LogPath = "C:\boot_resource_log.csv" # 写入表头 "Timestamp,CPU_Usage(%),Memory_Usage(%),Disk_Read(KB/s),Disk_Write(KB/s)" | Out-File $LogPath -Encoding UTF8 while ($true) { $Timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss" # 获取CPU总使用率 $CPU = Get-Counter "\Processor(_Total)\% Processor Time" | Select-Object -ExpandProperty CounterSamples | Select-Object -ExpandProperty CookedValue # 获取内存使用率 $Memory = Get-Counter "\Memory\% Committed Bytes In Use" | Select-Object -ExpandProperty CounterSamples | Select-Object -ExpandProperty CookedValue # 获取磁盘读写速度,转成KB/s $DiskReadBytes = Get-Counter "\PhysicalDisk(_Total)\Disk Read Bytes/sec" | Select-Object -ExpandProperty CounterSamples | Select-Object -ExpandProperty CookedValue $DiskWriteBytes = Get-Counter "\PhysicalDisk(_Total)\Disk Write Bytes/sec" | Select-Object -ExpandProperty CounterSamples | Select-Object -ExpandProperty CookedValue $DiskReadKB = [math]::Round($DiskReadBytes / 1024, 2) $DiskWriteKB = [math]::Round($DiskWriteBytes / 1024, 2) # 写入日志 "$Timestamp,$CPU,$Memory,$DiskReadKB,$DiskWriteKB" | Out-File $LogPath -Append -Encoding UTF8 # 每1秒采样一次,可调整 Start-Sleep -Seconds 1 } - 配置开机自启:按下
Win+R输入shell:startup,打开启动文件夹,右键新建「快捷方式」,目标填:powershell.exe -ExecutionPolicy Bypass -File "C:\boot_resource_log.ps1" - 重启电脑,脚本会自动后台运行,打开
C:\boot_resource_log.csv就能查看启动后的所有资源记录了。
内容的提问来源于stack exchange,提问作者nanomader




