今天遇到要驗證Process的Kernel Mode Time與User Mode Time,詢問Kay之後得知運算方式如下:
- Kernel Mode Time: stime + cstime (/proc/$pid/stat中的field 15與17)
- User Mode Time: utime + cutime (/proc/$pid/stat中的field 14與16)
從/proc/$pid/stat中取得的time是以jiffies為單位,將jiffies * CLK_TCK就會得到以秒為單位的時間,而最終希望以100 nanosecond呈現。為了方便我驗證,我寫了一段shellscript去做計算並顯示出來:
pid=$1 utime_f=14 cutime_f=16 stime_f=15 cstime_f=17 utime=`cat /proc/$pid/stat | cut -d " " -f $utime_f` cutime=`cat /proc/$pid/stat | cut -d " " -f $cutime_f` u_mode_time=`expr $utime + $cutime` stime=`cat /proc/$pid/stat | cut -d " " -f $stime_f` cstime=`cat /proc/$pid/stat | cut -d " " -f $cstime_f` k_mode_time=`expr $stime + $cstime` clock=`getconf CLK_TCK` ns_100=10000000 nsc=`expr $ns_100 / $clock` # unit: 100 nanosecond echo User Mode Time `expr $u_mode_time \* $nsc` echo Kernel Mode Time `expr $k_mode_time \* $nsc`
Reference
time command
如果你的對象是一個command或execution file,只要直接使用time就可達成:
time ./test.sh > /dev/null
output:
real 0m0.020s user 0m0.009s sys 0m0.020s
$SECONDS variable
如果你的對象是script內的一組動作,且不需要精確到毫秒,可以透過SECONDS變數:
START=${SECONDS} # some operations sleep 5 END=$(($SECONDS - $START)) echo $END
date command
與$SECONDS方法類似,但可以精確到nano second(10^-9)的差距:
START=`date +%s%N` echo $START # some operations sleep 1 END=`date +%s%N` echo $END END=$(($END - $START)) echo $END # 換算為millisecond END=$(($END / 1000000)) echo $END
output:
1467450293336690574 1467450294338625297 1001934723 1001
留言
張貼留言