497日
読み:よんひゃくきゅうじゅうななにち
外語:497days
起動直後から経過時間を計測しているタイマーが
オーバーフロー
する日数の一つ。
目次
概要
特徴
現象
想定される問題
再現環境
主な再現環境
Windows
Linux
概要
unsigned
で32ビットの場合、最大で0xffffffff(10進数で4294967295)までの数値を扱うことができる。
これを10ミリ秒単位でカウントアップすると、42949672950ミリ秒、つまり497日2時間27分52秒950ミリ秒までしか数えることができない。
従って、この問題のあるシステムでは、497日を超えた連続稼動が出来ない。
特徴
現象
起動後に0からカウントを始めたとすると、起動から497日2時間27分52秒950ミリ秒で0xffffffffに達し、さらに次は0に戻ってしまう(
オーバーフロー
)。
「このカウンターの現在値からx増えたときに動作する」という処理で、一般に定期的な動作が実現されているが、その期待する先が0xffffffffより上であったなら、その「時」が来ることは永遠にない。
システムを問わず、様々な環境で、このカウンターを「
uptime
」と称して利用しており、そのサイズは32ビットであることが多い。497日しか連続稼動できないというのは、計算すれば誰でもわかるので、これはバグというよりは最初から分かっている機能的な制約であるとも言える。
想定される問題
OSのカウンターで生じた場合、次のような問題が顕著に見られる。
タイマーのメッセージやシグナル(WM_TIMER(Windows)、
SIGALRM
(UNIX))が正常に発行されなくなる
タイマーのメッセージやシグナルを受信して画面を更新する時計機能などは動作しなくなる
カーソルの点滅などがなくなる
TIME-WAIT
状態にある全てのTCP/IPポートが閉じられなくなり、TCPポートが枯渇する
これ以外にも、uptimeを使っているものは全て、目に見えない処理も含めて誤動作する。
再現環境
主な再現環境
オペレーティングシステムとして発生するもの。
Microsoft Windows
(NTカーネルであるもの)
Linux
(古いバージョン)
なお、サーバー用OSである
FreeBSD
は、長期間の運用の実績があり、この問題が無いことが既に分かっている。
実装として発生するもの。
SNMP
(MIBのsysUpTime(OID 1.3.6.1.2.1.1.3)の上限で、仕様上の制約)
sysUpTimeが10ミリ秒単位でカウントアップする実装の場合に発生する。1ミリ秒単位の場合は、
49.7日
で再現することになる。
Windows
NTカーネルを採用したWindowsで発生する。
次のWindowsに、この問題があることが知られている。NT 3.xも再現すると思われるが、Microsoftがサポートとして情報を提供しないため不明である。
Windows NT 4.0
Windows 2000
Windows XP
(SP1以降は修正対応)
Windows Vista
/
Windows Server 2008
なお、Windows 95/98などの元16ビットのWindowsは、
49.7日
という、10倍速で同様の問題が生じる。
Linux
Linuxの場合、
jiffies
が32ビットであることに問題があったので、現在では64ビット化された。
もって、変数を伸ばすという技術革新の恩恵により、497日問題は解決を見たのである。
再検索