GNU/Linux >> Linux の 問題 >  >> Linux

Linux –タスクセットとの実行中のプロセスアフィニティの設定が失敗しますか?

プロセスを特定の数のCPUコアに制限しようとしています。タスクセットのマニュアルページとこのドキュメントによると、次のように機能するはずです。

[[email protected] ~]$ taskset -pc 0 <PID>
pid 24395's current affinity list: 0-3
pid 24395's new affinity list: 0

簡単に言えば、これは機能しません。プロセスに負荷をかけ、 topを監視します 、CPU使用率は約350%です(タスクセットがない場合と同じ)。 100%で最大になるはずです。

taskset -c 0 を使用してアフィニティを適切に設定できます プロセスのスポーン時に。 cpulimit -p -l 99を使用する また、ちょっと動作します。どちらの場合も、プロセスに同じ負荷をかけると、CPU使用率が100%になります。

ここで何が問題になっていますか?

承認された回答:

更新:新しいバージョンのタスクセットには -aがあります /-すべてのタスク 「特定のpidのすべてのタスク(スレッド)を操作する」オプションであり、以下に示す動作を解決する必要があります。

いくつかのスレッドをスピンアップしてCPUサイクルを消費するPythonスクリプトを作成しました。非常に単純なので、タスクセットをテストするのが目的です。

#!/usr/bin/env python

import threading

def cycle_burner():
    while True:
        meh = 84908230489 % 323422

for i in range(3):
    thread = threading.Thread(target=cycle_burner)
    print "Starting a thread"
    thread.start()

Pythonスクリプトを実行するだけで、CPU使用率が約150%消費されます。

[~/cbench]$ ./burn_cycles.py
Starting a thread
Starting a thread
Starting a thread

タスクセットを使用してPythonスクリプトを起動すると、期待どおりに機能します。上を見ると、Pythonプロセスが100%の使用率で固定されていることがわかります。

[~/cbench]$ taskset -c 0 ./burn_cycles.py
Starting a thread
Starting a thread
Starting a thread

興味深いことに、Pythonスクリプトを起動し、すぐにタスクセットを使用して開始したばかりのプロセスのアフィニティを設定すると、プロセスの上限が100%になります。出力から、LinuxスケジューラーがPythonスレッドを生成する前にBashコマンドの実行を終了したことに注意してください。そのため、Pythonプロセスが開始され、CPU 0で実行されるように設定され、適切なアフィニティを継承したスレッドが生成されました。

[~/cbench]$ ./burn_cycles.py &; taskset -pc 0 `pgrep python`
[1] 8561
pid 8561's current affinity list: 0-3
pid 8561's new affinity list: 0
Starting a thread
[~/cbench]$ Starting a thread
Starting a thread

この結果は、まったく同じですが、Pythonプロセスのアフィニティを設定する前にPythonスレッドを生成できるこのメソッドとは対照的です。これは、上記で説明した「タスクセットは何もしない」結果を複製します。

[~/cbench]$ ./burn_cycles.py &
[1] 8996
[~/cbench]$ Starting a thread
Starting a thread
Starting a thread
[~/cbench]$ taskset -pc 0 `pgrep python`
pid 8996's current affinity list: 0-3
pid 8996's new affinity list: 0

ここで何が問題になっていますか?

親プロセスのアフィニティが変更される前に生成されたスレッドは、親のアフィニティを継承しないようです。誰かがこれを説明するドキュメントへのリンクを編集できれば、それは役に立ちます。

関連:拡張子の前にファイル名にテキストを追加しますか?
Linux
  1. Linuxで実行中のプロセスを再起動(またはリセット)する方法は?

  2. Linux の特定のポートで実行されているプロセスを強制終了するには?

  3. Linux での複数スレッドによるシグナル処理

  1. Linux – Linuxでプロセスのプロセッサ親和性を設定するにはどうすればよいですか?

  2. タスクセットで実行中のプロセス アフィニティを設定できない

  3. Linuxでバックグラウンドで実行されているプロセスが強制終了されました

  1. Linux で Apache を使用してサブドメインを設定する

  2. 「&」を使用して Linux シェル コマンドを実行するのはなぜですか?

  3. Linux でプロセスのプロセッサ アフィニティを設定するにはどうすればよいですか?