OS에서 CPU를 사용하지 않는 커널 옵션 구성이 있습니다 isolcpus
.
isolcpus — 커널 스케줄러에서 CPU를 분리합니다.
개요 isolcpus = cpu_number [, cpu_number, ...]
설명 cpu_number 값으로 정의 된대로 지정된 커널을 일반 커널 SMP 밸런싱 및 스케줄러 알고리즘에서 제거하십시오. "절연 된"CPU로 프로세스를 이동하거나 해제하는 유일한 방법은 CPU 선호도 syscall을 사용하는 것입니다. cpu_number는 0에서 시작하므로 최대 값은 시스템의 CPU 수보다 1이 작습니다.
설정 방법을 설명하려고하는이 구성은 테스트보다 훨씬 더 많이 사용할 수 있습니다.
예를 들어 Meru는 Linux 기반 AP 컨트롤러에서이 기술을 사용하여 네트워크 트래픽이 OS의 내부 작업, 즉 I / O 작업을 방해하지 않도록합니다.
나는 또한 매우 같은 이유로 매우 바쁜 웹 프론트 엔드에서 사용합니다. 자체 전용 CPU에서 프론트 엔드 데몬을 분리 할 때까지 강제로 재부팅해야했습니다.
CPU가 8 개이므로 다음 명령의 출력으로 확인할 수 있습니다.
$ grep -c proc /proc/cpuinfo
8
또는
$ lscpu | grep '^CPU.s'
CPU(s): 8
파일의 데비안 / 우분투에서 /etc/default/grub
옵션 에 추가하십시오 GRUB_CMDLINE_LINUX
:
GRUB_CMDLINE_LINUX="isolcpus=7"
(0에서 시작하고 코어가 8이므로 7입니다.)
그런 다음
sudo update-grub
이것은 커널에게 코어 중 하나를 사용하지 말라고 지시합니다.
시스템을 재부팅하십시오.
그런 다음 프로세스를 시작하십시오.
CPU를 시작한 직후에는 8 번째 CPU (0이 첫 번째이기 때문에 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