web-dev-qa-db-ja.com

pthreadでスレッドの優先度を上げる方法は?

Linuxでpthreadを使用しています。パラメーターsched_param.priorityを設定して、スレッドの優先順位を上げたいです。ただし、設定できるスレッドの優先順位の範囲、またはスレッドの優先順位の説明に関する情報は、ネットからあまり見つけることができませんでした。

また、スレッドの優先度を高く設定してOSを停止させたくないため、相対的なスレッドの優先度についても知りたいと思います。誰かがこれを手伝ってくれますか?

55
Steveng

デフォルトのLinuxスケジューリングポリシーは_SCHED_OTHER_であり、優先度の選択はありませんが、ポリシー内でTweakするNiceレベルです。

別のスケジューリングポリシー関数_pthread_setschedparam_を使用して変更する必要があります(_man sched_setscheduler_も参照)

「通常」のスケジューリングポリシー:(from sched_setscheduler(2)

_   SCHED_OTHER   the standard round-robin time-sharing policy;
   SCHED_BATCH   for "batch" style execution of processes; and
   SCHED_IDLE    for running very low priority background jobs.
_

リアルタイムスケジューリングポリシー:

_   SCHED_FIFO    a first-in, first-out policy; and
   SCHED_RR      a round-robin policy.
_

あなたの場合、多分あなたは_SCHED_BATCH_を使うことができます。これはルート権限を必要としないからです。

警告:リアルタイムスケジューリングポリシーの誤った使用は、システムをハングさせる可能性があります。そのため、この種の操作を行うにはルート権限が必要です。

マシンに何ができるのかを確認するために、_util-linux_パッケージのchrtツールを使用できます。
例として:

_$ chrt -m 
SCHED_OTHER min/max priority    : 0/0
SCHED_FIFO min/max priority     : 1/99
SCHED_RR min/max priority       : 1/99
SCHED_BATCH min/max priority    : 0/0
SCHED_IDLE min/max priority     : 0/0
_

waste時間を短縮する方法(私はよく使用します):

_alias batchmake='time chrt --batch 0 make --silent'
_

ユーザー特権のままで、これはmakeを15%推進します(私の場合)。

編集:Nice、_SCHED_BATCH_、_SCHED_IDLE_、およびchrtツールの導入。精度のために! :)

56
levif

Levifからの現在の回答(SCHED_BATCHを推奨)は、Linuxでの現在のNPTLスレッド実装に対して正しくありません(「getconf GNU_LIBPTHREAD_VERSION」を実行することにより、カーネルがどの実装を持っているかを確認できます)。

今日のカーネルでは、リアルタイムスケジューリングポリシーのみがsched_priorityの設定を許可します。非RTポリシー(SCHED_OTHER、SCHED_BATCH、およびSCHED_IDLE)の場合は常に0です。非RTポリシーの唯一の選択肢は、「いい」値を設定することです。 setpriority()によって。ただし、「Nice」を設定することで期待される正確な動作の適切な仕様はありません。少なくとも理論的には、カーネルのバージョンによって異なる場合があります。現在のLinuxカーネルでは、「ナイス」は優先度に似た非常に強力な効果があるため、ほぼ同じ意味で使用できます。スレッドがスケジュールされる頻度を増やすために、「良い」値をlowerしたいです。これにはCAP_SYS_Nice機能が必要です(通常はルートですが、必ずしもそうではありませんが、 http://man7.org/linux/man-pages/man7/capabilities.7.html および http:// man7.org/linux/man-pages/man3/cap_set_proc.3.html )。

実際、SCHED_BATCHは、質問者が要求したoppositeケース用に設計されています:と共存できるCPU集中型の長時間実行ジョブ用に設計されています優先度が低い。スケジューラーに、スレッドのウェイクアップ優先度をわずかにペナルティを科すように伝えます。

また、以前のコメントの1つに回答するために(私はまだ応答でコメントするのに十分な評判がありません-この回答に対するいくつかの賛成票が役立ちます:))。はい、悪いニュースは、POSIX.1仕様では、「ナイス」は個々のスレッドではなくプロセスに影響するということです。朗報は、Linuxスレッドの実装(NPTLと元のLinuxスレッドの両方)が仕様を破り、個々のスレッドに影響を与えることです。これは、manページの「バグ」セクションで頻繁に呼ばれているのは面白いと思います。バグはPOSIX.1仕様にあり、この動作を許可するはずでしたが、仕様にもかかわらずそれを提供せざるを得なかった実装ではなく、故意に意図的に行ったと思います。言い換えれば、バグではありません。

これの大部分はsched(7)のmanページ(何らかの理由で私のFedora 20システムでは配信されません)で詳しく説明されています: http://man7.org/linux/man-pages/man7/sched。 7.html

Sched_priorityに本当に影響を与えたい場合は、SCHED_RRなどのリアルタイムポリシーをご覧ください。

29
BobDoolittle

POSIXはクエリを定義するため、OSに有効な優先順位の範囲を尋ねることができます。

int sched_get_priority_max(int policy);

int sched_get_priority_min(int policy);

優先順位を上げてマシンを窒息させることを期待しないでください。実際、CPUサイクルの100%を既に使用している場合を除き、何も実行しないと考えてください。デフォルトよりも高い優先順位はないことをクエリが示しても驚かないでください。

25
Potatoswatter