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


25

처음에는 OS가 프로세스 실행 관리 작업을 수행하므로 질문이 약간 어리 석고 혼란스러워 보입니다.

그러나 일부 프로세스가 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   |
+---+-------+---------+-----------+---------+

보시다시피, 사용자와 sys 시간은 비슷하지만 두 경과 시간이 크게 변경됩니다 (약 5 분의 차이). 내 환경에서 무언가가 일종의 경합을 일으킨 것처럼 느껴집니다.

실험 중에 어떤 종류의 소음도 피하기 위해 가능한 모든 백그라운드 프로세스 / 서비스를 중지하고 싶지만 초보자 / 중급 유닉스 사용자로 생각하며이를 보장하는 방법을 모르겠습니다.

내가 사용하고 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

최우선 순위를 사용하여 프로세스를 시작할 수 있습니다nice -19 process
Dababi

답변:


26

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 -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

나는 그것이 가능하다는 것을 몰랐다. ) 해결로 스레드 표시하는 기대
진 더슨 칸디

거의 잊어 버렸습니다 ...이 격리가 작동하는지 확인하기 위해 실행을 모니터링하는 방법이 있습니까?
Jeanderson Candido

천만에요. 두 번째 단락으로 작은 소개를 추가했습니다. 나는 그물에서 taskset에 관해 이야기하는 튜토리얼을 보았지만 종종 그것들과 함께 언급하지 않습니다.isolcpus
Rui F Ribeiro
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.