ALSA/JACK
Linux システムが組み込まれた別のコアで、単一の低レイテンシ タスク (オーディオ用) を実行したいと考えています。ここでは、スケジューラやその他の割り込みを削除することが重要になる場合があります。
これまでに見つけたいくつかのアプローチがありました。たとえばcpusets
、2009 年のオフライン スケジューラ (残念ながらユーザー空間タスクをサポートしていません) などです。
これを達成するためのより新しい/より便利な方法はありますか?
ALSA/JACK
Linux システムが組み込まれた別のコアで、単一の低レイテンシ タスク (オーディオ用) を実行したいと考えています。ここでは、スケジューラやその他の割り込みを削除することが重要になる場合があります。
これまでに見つけたいくつかのアプローチがありました。たとえばcpusets
、2009 年のオフライン スケジューラ (残念ながらユーザー空間タスクをサポートしていません) などです。
これを達成するためのより新しい/より便利な方法はありますか?
あなたが探しているトピックは、「CPU アフィニティ」と呼ばれます。CPU アフィニティには、プロセスのアフィニティと割り込みのアフィニティという 2 つの主な側面があります。
私の(確かに限られた)知識には:
プロセスは、コマンドを使用して CPU に割り当てられますtaskset
。(アフィニティは子プロセスに継承されます。)
Linux での CPU 割り当てへの割り込みは、 を使用して操作できます/proc/irq/<n>/smp_affinity
。割り当ての有効性を確認するには、 をチェックして、/proc/interrupts
どの CPU がどの割り込みを処理しているかを確認します。こちらをご覧ください。
特定のケースでは、CPU0 などの重要なアプリケーション用に単一の CPU (別名コア) を予約したいとします。つまり、ビット 0 (== CPU0) がクリアされたアフィニティ マスク (0xfffffffe など) を使用して、すべてのプロセスと割り込みを CPU0 以外のすべてに割り当てる必要があります。また、重要なアプリケーションには 0x1 のアフィニティ マスクがあり、CPU0 でのみ実行できることを意味します。
sched_setscheduler
さらに、アプリケーションで syscall を使用して、スケジューリングをリアルタイム ポリシーの 1 つに設定する必要がある場合もあります。これにより、アプリケーションのレイテンシーが改善される可能性があります (ただし、悪化する可能性もあります)。
CPU アフィニティの調整は簡単な作業ではなく、明確な解決策はまれであることに注意してください。構成が必要なパフォーマンスを維持できることを確認するには、テストと実験を行う必要があります。たとえば、アプリケーションが他のプロセスと通信する可能性があります。通信が同期的で、他のプロセスの反応が遅い場合 (CPU リソースが限られているため)、重要なアプリケーションのパフォーマンスに悪影響を及ぼします。同じことがサウンドカードの割り込みにも当てはまります。
それが役立つことを願っています。