環境

  • Ubuntu 18.04 ( 32 ビットと 64 ビット )
  • net-snmp
  • SNMP v2

前提

SNMP には hrSystemUptime RFC 2790 - Host Resources MIB が定義されていますが、hrSystemUptime は約 497 日で 0 に戻ってしまいます(1/100 秒 ごとに 1 カウントアップされる。4294967295 / 100 / 3600 / 24 => 497)

対策

そこで /proc/uptime から得られる値を使おうと考えています。以下のように出力される 2 つの値のうち左側を使います。

% cat /proc/uptime
24939.24 78721.83

なお uptime コマンドも /proc/uptime の値を使っているようです( https://gitlab.com/procps-ng/procps/blob/master/uptime.c#L47 https://gitlab.com/procps-ng/procps/blob/master/proc/sysinfo.c#L106 )。

そして、プライベート MIB を新規に追加し、MIB の SYNTAX は Counter64 として定義しようと考えています。

Linux の実装では /proc/uptime の左側の値は tv_sec で取得され、 unsigned long で出力されています( linux/uptime.c at master · torvalds/linux )。64 ビット CPU の場合 unsigned long は 64 ビットであり、SNMP を実装する場合 64 ビットの値を表現できるのは Counter64 のみです。

質問

  • /proc/uptime の値は 0 から繰り上がるとはいえ、時間を扱う目的のために Counter64 を使うのは適切なのでしょうか?(好きに実装すればよい?)
  • Counter64 は 32 ビット CPU の Linux 上でも 64 ビットとして扱われるのでしょうか?