CPUがOSによって使用されないカーネルオプション構成があり、それはと呼ばれisolcpus
ます。
isolcpus — CPUをカーネルスケジューラから分離します。
構文isolcpus = cpu_number [、cpu_number、...]
説明cpu_number値で定義されているように、一般的なカーネルSMPバランシングおよびスケジューラアルゴリズムから指定されたCPUを削除します。プロセスを「分離された」CPUにオンまたはオフにする唯一の方法は、CPUアフィニティシステムコールを使用することです。cpu_numberは0から始まるため、最大値はシステム上のCPUの数よりも1少なくなります。
セットアップする方法を説明するこの構成は、テストよりもはるかに多くの用途があります。
たとえばMeruは、LinuxベースのAPコントローラーでこのテクノロジーを使用して、ネットワークトラフィックがOSの内部動作、つまりI / O操作を妨げないようにします。
私は非常に忙しいウェブフロントエンドでもそれを使用しますが、それはまったく同じ理由からです。私は人生経験から、そのサーバーの好みのためにあまりにも定期的にコントロールを失いました。フロントエンドデーモンを専用のCPUで分離するまで、強制的に再起動する必要がありました。
8つのCPUがあるため、コマンドの出力で確認できます。
$ grep -c proc /proc/cpuinfo
8
または
$ lscpu | grep '^CPU.s'
CPU(s): 8
ファイルのDebian / Ubuntuを/etc/default/grub
オプションに追加しますGRUB_CMDLINE_LINUX
。
GRUB_CMDLINE_LINUX="isolcpus=7"
(0から始まり、8つのコアがあるため、7です)
その後、実行し、
sudo update-grub
これは、コアにコアを使用しないようにカーネルに指示しています。
システムを再起動します。
次に、プロセスを開始します。
起動後すぐに、8番目のCPU(0が1番目であるため7)に変更でき、そのCPUを使用しているのは自分だけであることを確認してください。
そのためには、次のコマンドを使用します。
taskset -cp 7 PID_number
taskset-プロセスのCPUアフィニティを取得または設定します
あらすじ
taskset [options] [mask | list ] [pid | command [arg]...]
説明
tasksetは、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と比較すると、それらはより多くのことを実行しています(スライドの下のウィンドウ):
# 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: rui@pts/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
nice -19 process