2.6. システムタイムスタンプでのハードウェアクロックの使用
/sys/devices/system/clocksource/clocksource0/available_clocksource
ファイルを表示します。
~]# cat /sys/devices/system/clocksource/clocksource0/available_clocksource
tsc hpet acpi_pm
/sys/devices/system/clocksource/clocksource0/current_clocksource
ファイルを読み取りて検査できます。
~]# cat /sys/devices/system/clocksource/clocksource0/current_clocksource
tsc
システムメインアプリケーションの最適なクロックは、クロックの既知の問題により使用されないことがあります。すべての問題のあるクロックを実行した後、システムはリアルタイムシステムの最低要件を満たすことができないハードウェアクロックで残すことができます。
/sys/devices/system/clocksource/clocksource0/available_clocksource
ファイルに表示された一覧からクロックソースを選択し、クロック名を /sys/devices/system/clocksource/clocksource0/current_clocksource
ファイルに書き込みます。たとえば、以下のコマンドは、使用中のクロックソースとして HPET を設定します。
~]# echo hpet > /sys/devices/system/clocksource/clocksource0/current_clocksource
注記
すべてのシステムに理想的なシングルクロックはありませんが、一般的に TSC が優先されるクロックソースです。TSC クロックの信頼性を最適化するには、カーネルのブート時に追加のパラメーターを設定します。以下に例を示します。
idle=poll
: アイドル状態にならないようにクロックを強制します。processor.max_cstate=1
: クロックがより深い C 状態 (バックグラウンド保存モード) に入るのを防ぎ、同期が停止しないようにします。
最新のプロセッサーは、低からの省電力状態 (C-state) にアクティブに移行します。ただし、高い省電力状態から稼働状態に戻ると、リアルタイムアプリケーションで最適よりも多くの時間を消費できます。これらの移行を防ぐために、アプリケーションは Power Management Quality of Service (PM QoS) インターフェースを使用できます。
idle=poll
および processor.max_cstate=1
パラメーターの動作をエミュレートできますが、省電力状態のより詳細な制御が可能です。
/dev/cpu_dma_latency
ファイルを開くと、PM QoS インターフェースはプロセッサーが深いスリープ状態に入るのを防ぎ、終了すると予期せぬ遅延が生じます。ファイルが閉じられると、システムは省電力状態に戻ります。
/dev/cpu_dma_latency
ファイルを開きます。ファイル記述子を低レイテンシー操作の期間中開いたままにします。- 32 ビットの数字を書き込みます。この数は、最大応答時間 (マイクロ秒単位) を表します。可能な限り早く応答時間を設定するには、
0
を使用します。/dev/cpu_dma_latency
ファイルの例を以下に示します。static int pm_qos_fd = -1; void start_low_latency(void) { s32_t target = 0; if (pm_qos_fd >= 0) return; pm_qos_fd = open("/dev/cpu_dma_latency", O_RDWR); if (pm_qos_fd < 0) { fprintf(stderr, "Failed to open PM QOS file: %s", strerror(errno)); exit(errno); } write(pm_qos_fd, &target, sizeof(target)); } void stop_low_latency(void) { if (pm_qos_fd >= 0) close(pm_qos_fd); }
アプリケーションは、まずstart_low_latency()
の呼び出しを行い、必要なレイテンシーを区別し、次にstop_low_latency()
を呼び出します。
詳細情報や参照文書は、以下の文書が、このセクションの情報に関連しています。
- 『Linux System Programming』 by Robert Love