2

如何通过 ADB shell 知道 Android 内核的 HZ 值?(没有任何编码)

我检查了如何在终端中检查 HZ?,但这不适用于 Android ADB shell。

有什么建议吗?

4

2 回答 2

6

理论

您可以通过将经过的时间(以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的数量保存到变量中jiffies
  • END {
    • print nsec, jiffies;
      • 打印出由空格分隔的纳秒jiffies
    • system("sleep 1");
      • 当我们计算 HZ 值时,休眠一秒钟以防止被 0 除
  • ' /proc/timer_list | awk '
    • 处理/proc/timer_list文件
    • 管道输出到一个新的实例awk
  • NR==1 { nsec1=$1; jiffies1=$2; }
    • 将之前的和nsecjiffies分别设置为和awknsec1jiffies1
  • /^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);
      • 将 HZ 值打印为整数
  • ' - /proc/timer_list
    • 处理标准输入,后跟/proc/timer_list文件
于 2013-06-28T18:49:31.233 回答
2

前提是您已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))
于 2013-06-27T15:59:52.083 回答