실행 중인 프로세스에 대해 독점적인 CPU 가용성을 보장하는 방법은 무엇입니까?

실행 중인 프로세스에 대해 독점적인 CPU 가용성을 보장하는 방법은 무엇입니까?

처음에는 운영 체제가 프로세스 실행을 관리하기 때문에 이 질문이 다소 어리석고 혼란스러워 보입니다.

그러나 CPU/IO 바인딩된 일부 프로세스가 얼마나 되는지 측정하고 싶고 OS가 예약된 OS 프로세스와 같은 실험을 방해하고 있는 것 같습니다.

예를 들어 다음 상황을 생각해 보십시오. 프로세스 A를 두 번 실행하고 "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분 정도의 차이). 내 환경의 무언가가 일종의 논쟁을 일으키는 것처럼 느껴졌습니다.

실험 중 소음을 피하기 위해 가능한 모든 백그라운드 프로세스/서비스를 중지하고 싶습니다. 그러나 저는 제 자신을 초보/중급 유닉스 사용자라고 생각하며 이를 어떻게 보장할 수 있는지 모르겠습니다.

나는 그것을 사용하고 있다Linux 4.4.0-45-범용그리고우분투 14.04 LTS 64비트.

당신의 도움에 정말 감사드립니다. 누락된 정보가 필요하시면 즉시 게시물을 수정하겠습니다.

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

답변1

OS가 CPU를 사용하지 않는 커널 옵션 구성이 있습니다 isolcpus.

isolcpus — 커널 스케줄러에서 CPU를 분리합니다.

요약 isolcpus= cpu_number [, cpu_number ,...]

설명 공통 커널 SMP 균형 조정 및 스케줄러 알고리즘에서 cpu_number 값으로 정의된 지정된 CPU를 제거합니다. "격리된" CPU 안팎으로 프로세스를 이동하는 유일한 방법은 CPU 선호도 시스템 호출을 이용하는 것입니다. cpu_number는 0부터 시작하므로 최대값은 시스템의 CPU 수보다 1이 적습니다.

단순한 테스트 이상의 용도로 유용한 이 구성을 설정하는 방법을 설명하겠습니다.

예를 들어 Meru는 Linux 기반 AP 컨트롤러에서 이 기술을 사용하여 네트워크 트래픽이 I/O 작업으로 알려진 운영 체제의 내부 작업을 방해하는 것을 방지합니다.

나는 또한 같은 이유로 매우 바쁜 웹 프론트엔드에서 그것을 사용하고 있습니다. 나는 인생 경험을 통해 종종 서버에 대한 통제력을 잃어 프론트엔드 데몬을 분리할 때까지 강제로 다시 시작해야 한다는 것을 알았습니다. 자체 전용 CPU.

CPU가 8개이므로 다음 명령 출력을 사용하여 확인할 수 있습니다.

$ 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(7, 0이 첫 번째이므로)로 변경하고 해당 CPU를 사용하는 유일한 CPU인지 확인할 수 있습니다.

이렇게 하려면 다음 명령을 사용하십시오.

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 및 작업 세트

또한 ps -eFPSR 열에 사용 중인 프로세서가 표시되어야 합니다.

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

답변2

@Aaron D. Marasco가 언급했듯이 csetfrom 패키지를 사용하는 cpuset것도 가능합니다 . ( isolcpus실제로 더 이상 사용되지 않습니다.) 장점 중 하나 cset는 구성 간에 다시 시작할 필요가 없으며 여러 코어를 사용하는 경우 스케줄러 로드 밸런서가 활성 상태로 유지된다는 것입니다.

작업을 위해 프로세서 5와 11을 예약합니다.

cset shield --cpu 5,11 --kthread on # cpu 5 and 11, move kernel processes if possible

우리의 CPUSet에서 무엇이 실행되고 있는지 확인하세요.

cset shield -s -v

CPUset에서 작업 실행

cset shield -e bash

프로세스 연결

cset shield --shield --pid 22010

프로세스 분리

cset shield --unshield --pid 22010

모든 것을 복원하다

cset shield --reset

관련 정보