リアルタイム、SCHED_FIFO、CPU_SET()

リアルタイム、SCHED_FIFO、CPU_SET()

2つのCPU(各CPU)に2つのリアルタイムプロセスを割り当てようとしています。 SCHED_FIFOスケジューリングポリシーを使用しています。私は次のことをしています:

  • CPUを分離するには、/etc/default/grubのGRUB_CMDLINE_LINUX_DEFAULTに「quiet Splash isolcpus = 6,7」を追加します。システムを再起動しましたが、6および7 CPUで実行されているいくつかのカーネルスレッドを除いて動作しているようです(これを行うにはtopコマンドを使用します)。
  • それからこれ:

    retval = sched_getattr(0、&attr、sizeof(struct sched_attr)、0);

    if(retval < 0){perror("Error in get attr:");return0;}
    

    attr.sched_policy = SCHED_FIFO;

    attr.sched_priority = 1;

    retval = sched_setattr(0,&attr,0);

    if(retval<0) { perror("スケジュールパラメータの設定中にエラーが発生しました:") return 0;

    CPU_ZERO(&set);
    
    CPU_SET(7,&set);
    
    retval = sched_setaffinity(0,sizeof(cpu_set_t),&set);
        if(retval<0){perror("Affinity Error ");return 0;}
    

    私はこのプロセスをCPU7で実行する予定です。しかし、私はこれを行うことはできません。なぜ失敗したのですか?このアプローチがうまくいかない場合は、他のアプローチを提案できますか?

編集:追加のCPUグループを作成していません。 /sys/fs/cgroup には cpuset ディレクトリが 1 つしかありません。

ベストアンサー1

どのエラーが返されたかを調べてください。バラより

man 2 sched_setaffinity 

それ以外にも、好みを変更するには「CAP_SYS_NICE」機能が必要です。だからあなたはする必要があります

  • プログラムをrootとして実行するか
  • この機能をバイナリファイルに設定します(注:NFSマウントファイルシステムには適用されません)。

バイナリに必要な機能設定は、次のコマンドで行います。

sudo setcap CAP_SYS_NICE+e <file>

おすすめ記事