
次のコマンドを実行するとき
systemctl show --all tomcat
「ActiveEnterTimestampMonotonic」などのプロパティを含む多くのプロパティを取得します。この属性の値は、「14786979371795」のように非常に大きいです。これは、サービスが有効になってからのエポック以降のミリ秒数を示すには大きすぎるようです。また、サービスがアクティブになってからナノ秒ほど小さいようです。だからそれは何ですか? 「タイムスタンプ鍛造性」とは何ですか?
答え1
ㅏfreedesktop.orgのsystemd D-Bus ABIの説明タイムスタンプは次のように説明されています。
InactiveExitTimestamp,InactiveExitTimestampMonotonic,ActiveEnterTimestamp,ActiveEnterTimestampMonotonic,ActiveExitTimestamp,ActiveExitTimestampMonotonic,InactiveEnterTimestamp,InactiveEnterTimestampMonotonicデバイスが最後に非アクティブ状態に保たれ、アクティブ状態に切り替えられるか、アクティブ状態に切り替えられたか、非アクティブ状態に入った時間のCLOCK_REALTIMEおよびCLOCK_MONOTONIC 64ビットusecタイムスタンプが含まれます。単位変換の時点は次のとおりです。無効/失敗→アクティブ化、アクティブ化→アクティブ、アクティブ→非アクティブ化、ついに無効→無効/失敗。これらの変換が今回のブートに記録されていない場合、そのフィールドはゼロです。
少し隠されていますが、中央にはマイクロ秒(μs)を意味する「usec timestamp」と書かれています。
clock_gettime()
systemdは、いくつかの代替「時計」の1つから時間を取得するためのシステムAPI機能を提供するLinuxでタイムスタンプを取得します。文書に示すように、aCLOCK_REALTIME
とという項目が必要ですCLOCK_MONOTONIC
。
この機能に関するマニュアル言った(強調):
CLOCK_MONOTONIC
単調な時間を示す設定不可能な時計不特定開始点のため。この時計はシステム時間の不連続ジャンプ(システム管理者が手動で時計を変更した場合など)の影響を受けませんが、adjtime(3)とNTPによって実行される増分調整の影響を受けます。
私のシステムでは、これらの値はシステムの起動時間の始点に対応しているように見えますが、それに依存してはいけません。 (LinuxのマニュアルにはCLOCK_BOOTTIME
.と.の違いも記載されていますCLOCK_MONOTONIC
。)
この*TimestampMonotonic
値を使用して間隔を計算したり、日時が必要な場合はリアルタイムタイムスタンプを計算できます。タイマー単位がある場合、相対時間設定は単調な時間単位です。
実証的な実験で特定のサービスを再起動し、タイムスタンプを更新しました。私が得る価値は次のとおりです。
ActiveEnterTimestamp=Tue 2018-07-03 18:37:31 EEST
ActiveEnterTimestampMonotonic=14341647533587
そして
ActiveEnterTimestamp=Tue 2018-07-03 19:03:04 EEST
ActiveEnterTimestampMonotonic=14343180833503
差は14343180833503 - 14341647533587
約1533299916
25.5分(マイクロ秒)間隔です。
答え2
Solarisは28年間機能しており、gethrtime()
発売以来単調なナノ秒を返してきました。
あなたの数字は4時間の稼働時間と一致し、systemdの作成者がSolarisを調べたため、起動後にナノ秒がかかる可能性があります。
確認する:
14786979371795〜で分ける10億明らかにする14786.979371795第二
14786.979371795秒で割った60数秒で結果246.4496561965分
246.4496561965分4.1074942699時間
フィードバックの結果、172日の稼働時間が発生するため、この数字は次の鍛造クロックに基づいている場合、最後の起動以降のマイクロ秒数であることが明らかです。clock_gettime()
注:符号付き64ビット数を使用してナノ秒を計算する鍛造カウンタは、最大1696年の稼働時間を達成できます。