最初は、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