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

Debian –実行中のプロセスに対して排他的なCPUの可用性を確保する方法は?

最初は、OSがプロセスの実行を管理する役割を果たしているため、質問は少しばかげている/混乱しているようです。

ただし、一部のプロセスがCPU / IOバウンドであるかどうかを測定したいので、OSがスケジュールされたOSプロセスなどの実験に干渉しているように感じます。

例として、次の状況を取り上げます。
プロセスAを2回実行し、ツール「time」(秒単位の時間列)から次の出力を取得しました:

+---+-------+---------+-----------+---------+
|Run|Process|User Time|System Time|Wall time|
+---+-------+---------+-----------+---------+
|1  |A      |196.3    |5.12       |148.86   |
|2  |A      |190.79   |4.93       |475.46   |
+---+-------+---------+-----------+---------+

ご覧のとおり、ユーザー時間とシステム時間は似ていますが、両方の経過時間は大幅に変化します(約5分の差)。私の環境で何かが何らかの競合を引き起こしたように感じます。

実験中のノイズを避けるために、考えられるすべてのバックグラウンドプロセス/サービスを停止したいのですが、自分は初心者/中級のUNIXユーザーであり、これを保証する方法がわかりません。

Linux 4.4.0-45-genericを使用しています Ubuntu 14.04LTS64ビットを使用。

本当にありがとうございました。不足している情報が必要な場合は、すぐに投稿を編集します。

CPU情報

$ grep proc /proc/cpuinfo | wc -l
8
$ lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                8
On-line CPU(s) list:   0-7
Thread(s) per core:    2
Core(s) per socket:    4
Socket(s):             1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 60
Stepping:              3
CPU MHz:               4002.609
BogoMIPS:              7183.60
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              8192K
NUMA node0 CPU(s):     0-7

承認された回答:

OSがCPUを使用しないカーネルオプション構成があります。これはisolcpusと呼ばれます。 。

isolcpus —CPUをカーネルスケジューラから分離します。

概要isolcpus=cpu_number [、cpu_number、…]

説明cpu_number
値で定義されているように、指定されたCPUを一般的なカーネルSMPバランシングおよびスケジューラ
アルゴリズムから削除します。プロセスを「分離された」CPUに移動したり、CPUから移動したりする唯一の方法は、CPUアフィニティシステムコールを使用することです。 cpu_numberは0から始まるため、
最大値はシステム上のCPUの数より1少なくなります。

セットアップ方法を説明しようとしているこの構成は、テストよりもはるかに多くの用途があります。

たとえば、MeruはLinuxベースのAPコントローラーでこのテクノロジーを使用して、ネットワークトラフィックがOSの内部動作、つまりI/O操作に干渉しないようにします。

まったく同じ理由で、非常に忙しいWebフロントエンドでも使用しています。人生の経験から、そのサーバーの好みに対して定期的に制御を失っていることを発見しました。フロントエンドデーモンを専用のCPUで分離するまで、強制的に再起動する必要がありました。

8つのCPUがあるので、コマンドの出力で確認できます:

$ grep -c proc /proc/cpuinfo
8

または

$ lscpu | grep '^CPU.s'
CPU(s):                8

ファイル/etc/default/grubにDebian/Ubuntuを追加します オプションGRUB_CMDLINE_LINUX

GRUB_CMDLINE_LINUX="isolcpus=7"

(0から始まり、8コアあるため、7です)

次に実行します

sudo update-grub

これは、カーネルにコアの1つを使用しないように指示しています。

システムを再起動します。

次に、プロセスを開始します。

起動後すぐに、8番目のCPU(0が1番目であるため7)に変更でき、そのCPUを使用しているのは自分だけであることを確認してください。

関連:Htop CPU%は約100%ですが、棒グラフはすべてのコアがはるかに低いことを示していますか?

そのためには、次のコマンドを使用します:

taskset -cp 7 PID_number

タスクセット–プロセスのCPUアフィニティを取得または設定します

概要

   taskset [options] [mask | list ] [pid | command [arg]...]

説明

タスクセットは、PIDを指定して実行中のプロセスのCPUアフィニティを設定または取得するため、または指定されたCPUアフィニティを使用して新しいコマンドを起動するために使用されます。 CPUアフィニティは、システム上の特定のCPUセットにプロセスを
「結合」するスケジューラプロパティです。 Linuxスケジューラーは
与えられたCPUアフィニティーを尊重し、プロセスは他のCPUでは実行されません。
Linuxスケジューラーは自然なCPUアフィニティーもサポートしていることに注意してください:
スケジューラーはプロセスを維持しようとしますパフォーマンス上の理由から実用的である限り、同じCPU。したがって、特定のCPUアフィニティを強制することは、特定のアプリケーションでのみ役立ちます。

詳細については、isolcpus、numactl、tasksetを参照してください

ps -eFも使用 PSR列に、使用されているプロセッサが表示されます。

CPU 2と3が分離されたサーバーがありますが、実際、ps -eで確認できます。 ユーザーランドで唯一のプロセス 意図したとおり、pound

# ps -eo psr,command | tr -s " " | grep "^ [2|3]"
 2 [cpuhp/2]
 2 [watchdog/2]
 2 [migration/2]
 2 [ksoftirqd/2]
 2 [kworker/2:0]
 2 [kworker/2:0H]
 3 [cpuhp/3]
 3 [watchdog/3]
 3 [migration/3]
 3 [ksoftirqd/3]
 3 [kworker/3:0]
 3 [kworker/3:0H]
 2 [kworker/2:1]
 3 [kworker/3:1]
 3 [kworker/3:1H]
 3 /usr/sbin/pound

分離されていないCPUと比較すると、CPUはさらに多くのことを実行しています(スライドの下のウィンドウ ):

# ps -eo psr,command | tr -s " " | grep "^ [0|1]"
 0 init [2]
 0 [kthreadd]
 0 [ksoftirqd/0]
 0 [kworker/0:0H]
 0 [rcu_sched]
 0 [rcu_bh]
 0 [migration/0]
 0 [lru-add-drain]
 0 [watchdog/0]
 0 [cpuhp/0]
 1 [cpuhp/1]
 1 [watchdog/1]
 1 [migration/1]
 1 [ksoftirqd/1]
 1 [kworker/1:0]
 1 [kworker/1:0H]
 1 [kdevtmpfs]
 0 [netns]
 0 [khungtaskd]
 0 [oom_reaper]
 1 [writeback]
 0 [kcompactd0]
 0 [ksmd]
 1 [khugepaged]
 0 [crypto]
 1 [kintegrityd]
 0 [bioset]
 1 [kblockd]
 1 [devfreq_wq]
 0 [watchdogd]
 0 [kswapd0]
 0 [vmstat]
 1 [kthrotld]
 0 [kworker/0:1]
 0 [deferwq]
 0 [scsi_eh_0]
 0 [scsi_tmf_0]
 1 [vmw_pvscsi_wq_0]
 0 [bioset]
 1 [jbd2/sda1-8]
 1 [ext4-rsv-conver]
 0 [kworker/0:1H]
 1 [kworker/1:1H]
 1 [bioset]
 0 [bioset]
 1 [bioset]
 1 [bioset]
 1 [bioset]
 1 [bioset]
 1 [bioset]
 1 [bioset]
 0 [jbd2/sda3-8]
 1 [ext4-rsv-conver]
 1 /usr/sbin/rsyslogd
 0 /usr/sbin/irqbalance --pid=/var/run/irqbalance.pid
 1 /usr/sbin/cron
 0 /usr/sbin/sshd
 1 /usr/sbin/snmpd -Lf /dev/null -u snmp -g snmp -I -smux -p /var/run/snmpd.pid
 1 /sbin/getty 38400 tty1
 1 /lib/systemd/systemd-udevd --daemon
 0 /usr/sbin/xinetd -pidfile /run/xinetd.pid -stayalive
 1 [kworker/1:2]
 0 [kworker/u128:1]
 0 [kworker/0:2]
 0 [bioset]
 1 [xfsalloc]
 1 [xfs_mru_cache]
 1 [jfsIO]
 1 [jfsCommit]
 0 [jfsCommit]
 0 [jfsCommit]
 0 [jfsCommit]
 0 [jfsSync]
 1 [bioset]
 0 /usr/bin/monit -c /etc/monit/monitrc
 1 /usr/sbin/pound
 0 sshd: rui [priv]
 0 sshd: [email protected]/0,pts/1
 1 -bash
 1 -bash
 1 -bash
 1 [kworker/u128:0]
 1 -bash
 0 sudo su
 1 su
 1 bash
 0 bash
 0 logger -t cmdline root[/home/rui] 
 1 ps -eo psr,command
 0 tr -s 
 0 grep ^ [0|1]
 0 /usr/bin/vmtoolsd

Debian
  1. Debian –特定のプロセスを隠す方法は?

  2. Linux で C または C++ からプロセスの CPU アフィニティを設定する方法は?

  3. debian の gui をインストールする方法

  1. Debian 6のLTSアップデートを入手する方法(Squeeze)

  2. LinuxでプロセスのCPU使用率を制限する方法

  3. Debianでsudoのパスワードをリセットする方法

  1. プロセスが常に実行されていることを確認しますか?

  2. 同じが実行されている場合はプロセスを確認しますか?

  3. CentOS/RHEL 7 で SYSTEMD プロセスの CPU アフィニティを設定する方法