[Armadillo:06958] Re: Unknown HZ value!

Takenoshita Koyo email@hidden
2011年 4月 5日 (火) 17:16:43 JST


竹之下です。

ざっとソースを眺めてみると、以下の部分で表示されているようです。

procps-3.2.7/proc/sysinfo.c

static void old_Hertz_hack(void){
  unsigned long long user_j, nice_j, sys_j, other_j;  /* jiffies (clock ticks) */
  double up_1, up_2, seconds;
  unsigned long long jiffies;
  unsigned h;
  char *restrict savelocale;

  savelocale = setlocale(LC_NUMERIC, NULL);
  setlocale(LC_NUMERIC, "C");
  do{
    FILE_TO_BUF(UPTIME_FILE,uptime_fd);  sscanf(buf, "%lf", &up_1);
    /* uptime(&up_1, NULL); */
    FILE_TO_BUF(STAT_FILE,stat_fd);
    sscanf(buf, "cpu %Lu %Lu %Lu %Lu", &user_j, &nice_j, &sys_j, &other_j);
    FILE_TO_BUF(UPTIME_FILE,uptime_fd);  sscanf(buf, "%lf", &up_2);
    /* uptime(&up_2, NULL); */
  } while((long long)( (up_2-up_1)*1000.0/up_1 )); /* want under 0.1% error */
  setlocale(LC_NUMERIC, savelocale);
  jiffies = user_j + nice_j + sys_j + other_j;
  seconds = (up_1 + up_2) / 2;
  h = (unsigned)( (double)jiffies/seconds/smp_num_cpus );
  /* actual values used by 2.4 kernels: 32 64 100 128 1000 1024 1200 */
  switch(h){
  case    9 ...   11 :  Hertz =   10; break; /* S/390 (sometimes) */
  case   18 ...   22 :  Hertz =   20; break; /* user-mode Linux */
  case   30 ...   34 :  Hertz =   32; break; /* ia64 emulator */
  case   48 ...   52 :  Hertz =   50; break;
  case   58 ...   61 :  Hertz =   60; break;
  case   62 ...   65 :  Hertz =   64; break; /* StrongARM /Shark */
  case   95 ...  105 :  Hertz =  100; break; /* normal Linux */
  case  124 ...  132 :  Hertz =  128; break; /* MIPS, ARM */
  case  195 ...  204 :  Hertz =  200; break; /* normal << 1 */
  case  253 ...  260 :  Hertz =  256; break;
  case  393 ...  408 :  Hertz =  400; break; /* normal << 2 */
  case  790 ...  808 :  Hertz =  800; break; /* normal << 3 */
  case  990 ... 1010 :  Hertz = 1000; break; /* ARM */
  case 1015 ... 1035 :  Hertz = 1024; break; /* Alpha, ia64 */
  case 1180 ... 1220 :  Hertz = 1200; break; /* Alpha */
  default:
#ifdef HZ
    Hertz = (unsigned long long)HZ;    /* <asm/param.h> */
#else
    /* If 32-bit or big-endian (not Alpha or ia64), assume HZ is 100. */
    Hertz = (sizeof(long)==sizeof(int) || htons(999)==999) ? 100UL : 1024UL;
#endif
    fprintf(stderr, "Unknown HZ value! (%d) Assume %Ld.\n", h, Hertz);
  }
}

UPTIME_FILE(/proc/uptime)を2回計測してその差から得た経過時間(秒単位)と
STAT_FILE(/proc/stat)で得たプロセスが消費した経過時間(jiffies単位)
から、Hertzを求めているような計算をしています[*1]。

計算結果が、95から105の間に収まっていれば、Hertz=100とみなすように
なっていますが、計算結果が93と、少しずれてしまっているので、
> Unknown HZ value! (93) Assume 100.
とのメッセージが表示されているようです。

Assume 100. と表示されていることから、Hertz=100に設定されているので、
問題ないといえば問題ないのですが、あまり気分の良いものではありませんね。

そもそも、なぜ、"old_Hertz_hack"が実行されているのでしょう。
"2.4+ kernel w/o ELF notes? -- report this\n"
というメッセージも一緒に表示されていませんでしょうか?

*1: そもそも、この計算方法では正確な値が得られないような気がするのですが。。

Masahiro Iino さんは書きました:
> 飯野と申します
> 
> 現在、Armadillo-420で開発を行っています。
> psで細かい情報が欲しい為、busyboxのpsではなく、
> Miscellaneous Applications->Procps tools->psを使っています。
> 問題なく使えているのですが、たまにps実行時に
> Unknown HZ value! (93) Assume 100.
> といったようなメッセージが出ます。
> これが出ても、それに続いてpsの結果が出てくるので使えない事はないのですが、
> なんだか気持ちが悪いです。
> ネットで調べてみましたが、初期値が入っていないせいだとか、procpsを
> 最新のものにするとか正解がわかりません。
> 試しに同じprocpsのfreeも使ってみましたが、症状が同じことからすると、
> procpsに依存しているエラーメッセージのような気がしています。
> 
> どなたか同じ様なメッセージが出た方、対処法をご存知の方がいらっしゃいまし
> たら、
> ご教授頂けませんでしょうか?
> 
> 
> 
> ------------------------------------------------------------------------
> 
> _______________________________________________
> armadillo mailing list
> email@hidden
> http://lists.atmark-techno.com/cgi-bin/mailman/listinfo/armadillo


-- 
Koyo Takenoshita




armadillo メーリングリストの案内