第25章 アプリケーションのタイムスタンプ
アプリケーションがタイムスタンプを頻繁に実行する場合には、CPU によるクロック読み取りが原因でパフォーマンスに影響があります。クロックの読み取りに使用するコストや時間がかさむと、アプリケーションのパフォーマンスに悪影響を及ぼす可能性があります。
読み出しメカニズムが備わっているハードウェアクロックを選択すると、デフォルトのクロックよりも速くなり、クロック読み取りのコストが軽減されます。
RHEL for Real Time では、POSIX クロックを clock_gettime()
関数とともに使用して、CPU のコストを可能な限り低く抑えて、クロックの読み取り値を生成し、パフォーマンスをさらに向上させることができます。
読み取りコストの高いハードウェアクロックを使用するシステムで、このような利点がより明確になります。
25.1. POSIX クロック
POSIX は、タイムソースを実装して表すための標準です。システム内のその他のアプリケーションに影響を及ぼさずに、POSIX クロックをアプリケーションに割り当てることができます。これは、カーネルによって選択され、システム全体に実装されるハードウェアクロックとは対照的です。
指定の POSIX クロックを読み取るために使用される関数は <time.h>
で定義される clock_gettime()
です。clock_gettime()
に相当するカーネルはシステムコールです。ユーザープロセスが clock_gettime()
を呼び出すと、以下が行われます。
-
対応する C ライブラリー (
glibc
) は、sys_clock_gettime()
システムコールを呼び出します。 -
sys_clock_gettime()
は、要求されたオペレーションを実行します。 -
sys_clock_gettime()
は、結果をユーザープログラムプログラムに戻します。
ただし、このコンテキストはユーザーアプリケーションからカーネルへの切り替えには CPU コストがかかります。このコストは非常に低くなりますが、操作が数千回繰り返し行われると、累積されたコストはアプリケーション全体のパフォーマンスに影響を及ぼす可能性があります。カーネルへのコンテキストの切り替えを回避し、クロックの読み出しを速くするために、VDSO (Virtual Dynamic Shared Object) ライブラリー機能の形式で CLOCK_MONOTONIC_COARSE
クロックおよび CLOCK_REALTIME_COARSE
POSIX クロックのサポートが追加されました。
_COARSE
クロックバリアントのいずれかを使用して clock_gettime()
が実行する時間測定は、カーネルの介入を必要とせず、ユーザー空間全体で実行されます。これにより、パフォーマンスが大幅に向上します。_COARSE
クロックの時間読み取りの分解能はミリ秒 (ms) です。つまり、1ms 未満の時間間隔は記録されません。POSIX クロックの _COARSE
バリアントは、ミリ秒のクロック分解能に対応できるアプリケーションに適しています。
_COARSE
接頭辞の有無にかかわらず、POSIX クロックの読み出しコストと分解能を比較するには、RHEL for Real Time Reference ガイド を参照してください。