八月の日記/メモ |
▼
2003.08.21(木) 01:06:21
Linuxマシンの uptime がいきなり 2days とかになっているのを発見した。
496days までは正しく表示されていた記憶がある。
で、追っかけてみた。(どうでもいい詳細なので読み飛ばしてかまわない。)
# dpkg -S uptimeuptime はともかく、ps などでもプロセスの生成時刻が 2004 とかになってるのは使う上で問題ありそうである。ようやく再起動する理由が出来たということでもあり、耐久試験はとしては十分だったと言えるだろう。
# apt-get source procps
などしつつ uptime のソースを見ると /proc/uptime を参照していることが分かり、 今度はカーネルのソースを見る。
/proc/uptime の内容は、linux/fs/proc/array.c の get_uptime() で生成されていて、 時間情報は、linux/kernel/sched.c の unsigned long volatile jiffies という 32bit-カウンタから得ている。i386 ではこのカウンタが100Hzでカウントアップする ので 2^32 / 100 / 60 / 60 / 24 で 497日であふれて 0 に戻るというわけだった。
uptime が使えないので rdtsc 命令(Pentium以降) から起動時間を計算するツールも書いてみた。 書いている間に500日を超えた模様。
ちなみに gcc で rdtsc をインラインに書くには、こういうマクロを使う。
#define rdtsc() \ ({ \ register unsigned long long int x; \ __asm__ volatile ("rdtsc" : "=A" (x) ); \ x; \ })
▼
2003.08.21(木) 02:54:33
ついでなので調べてみた。
Windows95/98 が 49.7日というのは知っていたが、 XFree86 4.1.0 が 49.7日、そして、なんと Windows NT4.0/2000/XP が 497日という情報も見つかった。NT4.0 は、300日までは動かしたことがあり、安定して動くと感心したものなのだが。
NT4.0 → SP6a× SP6a + patch(JPNQ328310i.EXE パッチがSP6aを要求する) 2000 → SP4 又は、 SP2,SP3 + patch(Q328310_W2K_SP4_X86_JA.exe) XP → SP1 又は SP1a