You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何编写并运行程序测量系统启动后的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脚本,让它开机自启:

  1. 先写脚本内容,保存为/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
    
  2. 给脚本加执行权限:
    sudo chmod +x /usr/local/bin/boot_resource_monitor.sh
    
  3. 配置开机自启:创建/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
    
  4. 启用服务并重启:
    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脚本:

  1. 写脚本内容,保存为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
    }
    
  2. 配置开机自启:按下Win+R输入shell:startup,打开启动文件夹,右键新建「快捷方式」,目标填:
    powershell.exe -ExecutionPolicy Bypass -File "C:\boot_resource_log.ps1"
    
  3. 重启电脑,脚本会自动后台运行,打开C:\boot_resource_log.csv就能查看启动后的所有资源记录了。

内容的提问来源于stack exchange,提问作者nanomader

火山引擎 最新活动