如何通过adb shell知道android内核的hz值?(无任何编码)
我检查了How to check HZ in the terminal?,但这不适用于android adb shell。
有什么建议吗?
最佳答案
理论
可以通过以jiffies为单位获取经过的时间并除以经过的时间(以秒为单位)来导出内核空间hz值。
您可以从/proc/timer_列表文件中以jiffies和纳秒为单位获得系统正常运行时间。
系统正常运行时间(纳秒)
搜索now at <nanoseconds> nsecs
行<nanoseconds>
将是纳秒内的正常运行时间
jiffies中的系统正常运行时间
搜索jiffies: <jiffies>
行(任何处理器都可以)<jiffies>
将是jiffies的正常运行时间
注意:这个值通常在内核中向前偏移INITIAL_JIFFIES
,所以它可能不会在0
开始计数。尽管如此,这不应该影响我们计算的结果,因为我们关心的是经过的时间,而不是迟钝的正常运行时间。
通过在经过的一段时间内获取这两个值,可以使用以下公式计算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值可能稍有偏差;您可能需要多次执行此计算并将其平均。大多数现代内核都将kernel space
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的数目保存到变量
jiffies
END {
print nsec, jiffies;
打印由空格分隔的纳秒和jiffies
system("sleep 1");
在计算hz值时,睡眠一秒钟以防止除以0
' /proc/timer_list | awk '
处理/proc/timer\u列表文件
管道输出到
awk
的新实例NR==1 { nsec1=$1; jiffies1=$2; }
将先前
nsec
的jiffies
和awk
值分别设置为nsec1
和jiffies1
。/^now at/ NR>1 { nsec2=$3; }
将纳秒数保存到变量
nsec2
/^jiffies/ NR>1 { jiffies2=$2; }
将jiffies的数目保存到变量
jiffies2
END {
dsec=(nsec2-nsec1)/1e9;
以秒计算变化
djiff=(jiffies2-jiffies1);
计算jiffies的变化
print int(djiff/dsec);
将赫兹值打印为整数
' - /proc/timer_list
处理标准输入,后跟/proc/timer\u列表文件