一个循环采集CPU的etl日志的脚本
一个循环采集CPU的etl日志的脚本,wpr和xperf都可以完成功能,但是实测xperf采集的数据更少,对于只需要获取进程的时间片来估算cpu占用率的目的来讲,xperf的方式占用更少磁盘空间,解析也会更快。
%1 mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c %~s0 ::","","runas",1)(window.close)&&exit
md D:\\temp
del /s /q D:\temp
set TargetDriveEtl=D:\\temp
@echo off
SET /A "index=1"
SET /A "count=12"
:while
if %index% leq %count% (
echo The value of index is %index%
cd
wmic process where name="wprui.exe" terminate
xperf -d tmp.etl
rem "C:\\Program Files (x86)\\Windows Kits\\10\\Windows Performance Toolkit\\wpr.exe" -cancel
xperf -on PROC_THREAD+LOADER+CSWITCH -stackWalk CSwitch -buffersize 2048 -maxFile 2048 -filemode circular
rem "C:\\Program Files (x86)\\Windows Kits\\10\\Windows Performance Toolkit\\wpr.exe" -start CPU
timeout /T 600 /NOBREAK
xperf -d %TargetDriveEtl%\temp%index%.etl
rem "C:\\Program Files (x86)\\Windows Kits\\10\\Windows Performance Toolkit\\wpr.exe" -stop %TargetDriveEtl%\temp%index%.etl
SET /A "index=index + 1"
goto :while
)
解析脚本,执行通过命令行获取某个进程消耗的cpu时间片:
初次可能不允许执行ps1脚本,打开powershell管理员,输入set-executionpolicy remotesigned
后即可运行。
param(
[string] $ProcName = $(throw "Parameter missing: -ProcName ProcName"))#,
#[string] $Dir = $(throw "Parameter missing: -Dir Dir"))
$Dir = "D:\\temp"
Get-ChildItem $Dir *.etl| ForEach-Object -Process{
if($_ -is [System.IO.FileInfo])
{
Write-Host($_.name);
echo "xperf -i $Dir\$_ -a cswitch -process | select-string -Pattern "$ProcName""
xperf -i $Dir\$_ -a cswitch -process | select-string -Pattern $ProcName >>$Dir\CpuResult_$ProcName.txt
}
}
(gc $Dir\CpuResult_$ProcName.txt) | ? {$_.trim() -ne "" } | set-content $Dir\CpuResult_$ProcName.txt
如果powershell脚本没有达到预期效果,可以打开powershell的调试开关,这样就能看到实际执行的powershell命令, 或者在PowerShell ISE中进行调试:
# 开启调试开关
Set-PSDebug -Trace 2
# 关闭调试开关
Set-PSDebug -Off
补充另一种解析脚本,将所有的etl Merge到一起,然后再解析某个进程消耗的时间片,这样就能得到该进程在整个测试期间的时间片消耗,不需要再用额外的脚本做累加处理:
$Dir="D:\\temp"
cd $Dir
$num = 0
rm summary.etl
rm summary_temp.etl
Get-ChildItem $Dir *.etl| ForEach-Object -Process{
if($_ -is [System.IO.FileInfo])
{
$num++
}
}
Write-Host($num)
#$index=1
xperf -merge .\temp1.etl summary.etl
for($index =2;$index -le $num;$index++){
Write-Host($index)
xperf -merge summary.etl temp$index.etl summary_temp.etl
rm .\summary.etl
mv summary_temp.etl summary.etl
}