如何使用ADB shell获取HZ

Won*_*nil 2 android linux-kernel adb

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

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

有什么建议吗?

Vil*_*ray 6

理论

您可以通过在jiffies中经过一段时间并将其除以经过时间(以秒为单位)来推导出内核空间HZ值.

您可以从/ proc/timer_list文件获得jiffies纳秒级的系统正常运行时间.

  • 系统正常运行时间以纳秒为单位
    • 搜索该now at <nanoseconds> nsecs
    • <nanoseconds>将是以纳秒为单位的正常运行时间
  • jiffies中的系统正常运行时间
    • 搜索jiffies: <jiffies>线(任何处理器都会这样做)
    • <jiffies>将是jiffies的正常运行时间
      • 注意:此值通常INITIAL_JIFFIES在内核中向前偏移- 因此它可能无法开始计数0.然而,由于我们关心的是这应该不会影响我们的计算结果经过的时间,而不是obsolute的正常运行时间.

通过在经过的时间段内获取这两个值,您可以使用以下等式计算HZ值:

         (jiffies_after - jiffies_before)
HZ = -----------------------------------------
     ((nsecs_after - nsecs_before)/1000000000)
Run Code Online (Sandbox Code Playgroud)

如果您碰巧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
Run Code Online (Sandbox Code Playgroud)

由于舍入误差,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
Run Code Online (Sandbox Code Playgroud)
  • /^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从以前的值awk,以nsec1jiffies1分别
  • /^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文件