

# 環境

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

# 前提

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

# 対策

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

[code]

    % cat /proc/uptime
    24939.24 78721.83
    
[/code]

なお 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](https://github.com/torvalds/linux/blob/master/fs/proc/uptime.c)
)。64 ビット CPU の場合 unsigned long は 64 ビットであり、SNMP を実装する場合 64 ビットの値を表現できるのは
Counter64 のみです。

# 質問

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


CC BY-SA 4.0
2019-04-25T07:31:19.513
54471
2020-12-10T09:28:20.550
2021-10-07T07:34:52.683
-1
9592
question
linux snmp
/proc/uptime の値を使って SNMP プライベート MIB を実装するときの SYNTAX として Counter64 は適切か？


自己レス

# 時間を扱う目的のために Counter64 を使うのは適切か？

yes

RFC 2578 7.1.10. Counter64 <https://www.rfc-
editor.org/rfc/rfc2578#section-7.1.10> には

  * インクリメントされる値に使う
  * 0 にラップアラウンドされる

としか書かれていない。

# Counter64 は 32 ビット CPU の Linux 上でも 64 ビットとして扱われるのか？

yes

snmp_set_var_value() には ASN_COUNTER64 という値が使われている。

<https://sourceforge.net/p/net-
snmp/code/ci/master/tree/snmplib/snmp_client.c#l968>

value に struct counter64 を設定する実装となっているので、snmp_set_var_value() には struct
counter64 を渡す。

struct counter64 は asn1.h に定義されている。

<https://sourceforge.net/p/net-snmp/code/ci/master/tree/include/net-
snmp/library/asn1.h#l79>

[code]

    struct counter64 {
        u_long          high;
        u_long          low;
    };
    
[/code]

u_long は unsigned long

  * 32ビット環境なら 4 バイト(32ビット)
  * 64ビット環境なら 8 バイト(64ビット)


CC BY-SA 4.0
2019-04-26T00:57:54.367
54486
2019-04-26T00:57:54.367
2021-10-07T07:34:52.683
-1
9592
54471
answer