12.3. 単一の CPU を分離して、使用率の高いタスクを実行
cpusets メカニズムを使用すると、SCHED_DEADLINE タスクに一連の CPU とメモリーノードを割り当てることができます。CPU 使用率の高いタスクと低いタスクが混在するタスクセットでは、CPU 使用率の高いタスクを実行するために CPU を分離し、CPU 使用率の低いタスクを別の CPU セットにスケジューリングすることで、すべてのタスクが割り当てられた 実行時間 を満たすことができます。`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 を調整して
パーティションcgroup により多くの CPU を割り当て、すべてのリアルタイムタスクをそれに割り当てることで、ノイズをさらに低減できます。# cd .. # echo 4-7 | tee cluster/{cpuset.cpus,cpuset.cpus.exclusive} # echo 0-3 | tee partition/{cpuset.cpus,cpuset.cpus.exclusive}