如何通过 ADB shell 知道 Android 内核的 HZ 值?(没有任何编码)
我检查了如何在终端中检查 HZ?,但这不适用于 Android ADB shell。
有什么建议吗?
您可以通过将经过的时间(以jiffies为单位)除以经过的时间(以秒为单位)来得出内核空间 HZ 值。
您可以从/proc/timer_list文件中获取以jiffies和纳秒为单位的系统正常运行时间。
now at <nanoseconds> nsecs
线路<nanoseconds>
将以纳秒为单位的正常运行时间jiffies: <jiffies>
线(任何处理器都可以)<jiffies>
将是jiffies的正常运行时间
INITIAL_JIFFIES
在内核中向前偏移——所以它可能不会从0
. 尽管如此,这不应该影响我们的计算结果,因为我们关心的是经过的时间而不是过时的uptime。通过在一段时间内获取这两个值,您可以使用以下等式计算 HZ 值:
(jiffies_after - jiffies_before)
HZ = -----------------------------------------
((nsecs_after - nsecs_before)/1000000000)
如果您碰巧有awk
(可能通过 BusyBox),您可以自动执行此计算:
$ awk '/^now at/ { nsec=$3; } /^jiffies/ { jiffies=$2; } END { print nsec, jiffies; system("sleep 1"); }' /proc/timer_list | awk 'NR==1 { nsec1=$1; jiffies1=$2; } /^now at/ NR>1 { nsec2=$3; } /^jiffies/ NR>1 { jiffies2=$2; } END { dsec=(nsec2-nsec1)/1e9; djiff=(jiffies2-jiffies1); print int(djiff/dsec); }' - /proc/timer_list
由于舍入误差,HZ 值可能略有偏差;您可能需要多次执行此计算并取平均值。大多数现代内核都将内核空间HZ
设置为250
.
这是相同的命令,分布在几行中,以阐明其工作原理:
$ awk '
> /^now at/ { nsec=$3; }
> /^jiffies/ { jiffies=$2; }
> END {
> print nsec, jiffies;
> system("sleep 1");
> }
> ' /proc/timer_list | awk '
> NR==1 { nsec1=$1; jiffies1=$2; }
> /^now at/ NR>1 { nsec2=$3; }
> /^jiffies/ NR>1 { jiffies2=$2; }
> END {
> dsec=(nsec2-nsec1)/1e9;
> djiff=(jiffies2-jiffies1);
> print int(djiff/dsec);
> }
> ' - /proc/timer_list
/^now at/ { nsec=$3; }
nsec
/^jiffies/ { jiffies=$2; }
jiffies
END {
print nsec, jiffies;
system("sleep 1");
' /proc/timer_list | awk '
awk
NR==1 { nsec1=$1; jiffies1=$2; }
nsec
值jiffies
分别设置为和awk
nsec1
jiffies1
/^now at/ NR>1 { nsec2=$3; }
nsec2
/^jiffies/ NR>1 { jiffies2=$2; }
jiffies2
END {
dsec=(nsec2-nsec1)/1e9;
djiff=(jiffies2-jiffies1);
print int(djiff/dsec);
' - /proc/timer_list
前提是您已busybox
安装:
T1=`grep gp_timer /proc/interrupts| busybox awk '{print$2}'`;sleep 1;T2=`grep gp_timer /proc/interrupts| busybox awk '{print$2}'`;echo $((T2-T1))