12.3. 単一の CPU を分離して、使用率の高いタスクを実行
cpusets メカニズムを使用すると、SCHED_DEADLINE タスクに一連の CPU とメモリーノードを割り当てることができます。CPU 使用率の高いタスクと低いタスクが混在するタスクセットにおいて、使用率の高いタスクを実行する CPU を分離し、使用率の低いタスクを異なる CPU セットでスケジューリングすることで、すべてのタスクが与えられた runtime を満たすことが可能になります。`cpusets' の設定は手動で追加する必要があります。
前提条件
- システムの root 権限がある。
手順
cluster と partition という名前の 2 つのコントロールグループを作成します。
# cd /sys/fs/cgroup # echo +cpuset > cgroup.subtree_control # mkdir cluster # mkdir partition # echo +cpuset | tee cluster/cgroup.subtree_control partition/cgroup.subtree_controlcluster コントロールグループで、使用率の低いタスクが CPU 1 - 7 で実行されるようにスケジュールします。メモリーサイズを検証し、コントロールグループを排他的として指定します。
# cd cluster # echo 1-7 | tee cpuset.cpus cpuset.cpus.exclusive # echo root > cpuset.cpus.partition使用率の低いタスクをすべて cluster コントロールグループに移動します。
# ps -eLo lwp | while read thread; do echo $thread > cgroup.procs ; donepartitionコントロールグループで、使用率の高いタスクを割り当てます。# echo 0 | tee cpuset.cpus cpuset.cpus.exclusive # echo isolated > cpuset.cpus.partitionシェルを partition コントロールグループに追加して起動します。
# echo $$ > cgroup.procsこの設定により、
partitionコントロールグループで分離されたタスクが、clusterコントロールグループ内のタスクに干渉しなくなります。これにより、すべてのリアルタイムタスクがスケジューラーの期限に間に合うようになります。期限スケジューラーを使用している場合、通常はこの変更を行わなくても期限は満たされます。他のタスクには独自の期限があることに注意してください。
アプリケーションが適切なピニングを使用する準備ができている場合は、cgroups を調整して partition cgroup にさらに多くの CPU を割り当て、すべてのリアルタイムタスクをそれに割り当てることで、ノイズをさらに削減できます。
# cd ..
# echo 4-7 | tee cluster/{cpuset.cpus,cpuset.cpus.exclusive}
# echo 0-3 | tee partition/{cpuset.cpus,cpuset.cpus.exclusive}