isolcpus가 활성화되어 있는지 확인하는 방법?


15

예를 들어 서버에서 처음 연결할 때 isolcpus가 활성화되어 있는지, 어떤 CPU에 있는지 감지하는 방법 정황:

프로세스가 생성되는 위치를 확인하기 위해 프로세스를 생성하지 않습니다.

유스 케이스는 점이다 isolcpus=1-76 개 코어 i7 용 베어 본에 보인다 부팅시 isolcpus을 활성화하지, 내가이 가능한 경우 알고 싶다 /proc/, /sys또는 사용자 공간에서 읽을 수있는 커널 내부는, isolcpus의 활성화의 명확한 상태를 제공하기 위해 그리고 어떤 CPU가 관련되어 있습니다. 또는 isolcpus가 가장 먼저 다루는 스케줄러의 활성 설정을 읽으십시오.

가동 시간이 너무 커서 dmesg시작시 오류를 감지하기 위해 더 이상 부팅 로그가 표시되지 않습니다. " 커널 cmd 줄보기 "와 같은 기본 답변은 허용되지 않습니다. :)


1
사용할 수 있습니다 pidstat -C isolcpus. pidstat는 sysstat패키지에 있습니다.
Timothy Pulliam

2
바보 메신저가 될 수 있습니다,하지만 난 사이의 링크가 표시되지 pidstatisolcpus. 좀 더 자세히 설명해 주시겠습니까?
netmonk

명령이 실행중인 CPU를 알아야한다고 말합니다. 나는 무엇인지 isolcpus모르지만 플래그 pidstat를 전달하면 프로세스가 실행중인 CPU를 알려줄 수 있습니다 -C process_name. 예를 들어 pidstat -C top다음을 생성합니다. 10:56:52 AM PID %usr %system %guest %CPU CPU Command 10:56:52 AM 3457 0.00 0.00 0.00 0.00 6 top
Timothy Pulliam

2
답장을 보내 주셔서 감사합니다. isolcpus커널 매개 변수는 스케줄러가 프로세스를 분리 한 경우 자체적으로 프로세스를 마이그레이션하지 않도록합니다. 8 CPU 서버의 isolcpus=1-7경우 커널 명령 행에서 init 및 쉘의 모든 명령이 포크로 생성 한 모든 프로세스를 CPU0에서만 실행하도록합니다. 격리 된 CPU에서 작업을 실행하려면 taskset예 를 들어 해당 CPU를 시작해야합니다 . 그래서 내가 요구하는 것에 관해서는, 당신의 대답이 주제가 아닌 것 같습니다. 어쨌든 대답 해 주셔서 감사합니다
netmonk

1
이와 같은 것이 실제로 어렵지 않아야합니다 ....
user997112

답변:


17

당신이 찾는 것은이 가상 파일 안에 있습니다 :

/sys/devices/system/cpu/isolated

그리고 그 반대

/sys/devices/system/cpu/present    // Thanks to John Zwinck

에서 drivers/base/cpu.c우리는 소스가 표시되는 것을 볼 것은 커널 변수입니다 cpu_isolated_map:

static ssize_t print_cpus_isolated(struct device *dev,
    n = scnprintf(buf, len, "%*pbl\n", cpumask_pr_args(cpu_isolated_map));
...
static DEVICE_ATTR(isolated, 0444, print_cpus_isolated, NULL);

부팅시 cpu_isolated_map설정되는 내용은 다음 과 kernel/sched/core.c같습니다.

/* Setup the mask of cpus configured for isolated domains */
static int __init isolated_cpu_setup(char *str)
{
    int ret;

    alloc_bootmem_cpumask_var(&cpu_isolated_map);
    ret = cpulist_parse(str, cpu_isolated_map);
    if (ret) {
            pr_err("sched: Error, all isolcpus= values must be between 0 and %d\n", nr_cpu_ids);
            return 0;
    }
    return 1;
}

당신이 관찰하지만, 누군가가 데몬 스폰 것을 포함하여, 프로세스의 친화력을 수정 한 수 cron, systemd등등합니다. 이 경우에 의해 설정된 것이 아니라 수정 된 선호도 마스크를 상속하여 새 프로세스가 생성됩니다 isolcpus.

따라서 위의 내용은 isolcpus요청에 따라 제공되지만 여전히 도움이되지 않을 수 있습니다.

isolcpus발행되었지만 "취득되지 않은" 것을 발견했다고 가정하면 ,이 원치 않는 동작 단지 프로세스가 바인딩되어 있음을 인식하고 CPU=0실수로 단일 프로세서 모드에 있다고 믿으며 "사물을 설정"하려고 시도함으로써 도출 될 수 있습니다. 선호도 마스크를 재설정하여 이 경우 1-6 대신 CPUS 0-5를 분리하여 시도하여 이것이 작동하는지 확인할 수 있습니다.


1
Centos 7.x에서 테스트 한 /sys/devices/system/cpu/possible결과 '역방향'을 해석하는 방법에 따라 '역방향'으로 보이지 않습니다. 예 :이 경우 .../cpu/isolated반환 2,4그들은 고립되어 있었기 때문에, .../cpu/possible반환합니다 0-191.
bgura

1
나는 대부분의 사람들이 /sys/devices/system/cpu/present어떤 CPU가 존재할 /sys/devices/system/cpu/possible수 있는지를 보여 주기보다는 어떤 CPU가 있는지 보여주기를 원한다고 생각 한다. 일부 시스템에서는 동일하지만 필자가 확인한 기본 데스크톱에서도 동일하지 않습니다.
John Zwinck

@JohnZwinck 좋은 캐치. 수정 답변
LSerni

1
isolcpus = 0 및 4 코어로 / isolated = 0 및 / present = 0-3을 얻습니다.
Stefan Reich

10

런타임시 커널에 전달 된 매개 변수를 확인하는 isolcpus것이 가장 쉬운 방법인지 감지하는 방법 중 하나입니다 proc.

이를 위해 다음을 사용합니다.

$cat /proc/cmdline 
BOOT_IMAGE=/boot/vmlinuz-4.8.0-1-amd64 root=/dev/sda1 ro isolcpus=2,3 quiet

보다시피,이 특정 예제 isolcpus=2,3에서는 실행중인 커널에 인수로 전달되었습니다.

tasksetPID 1을 가리킬 수도 있습니다 . PID 1은 커널이 시작한 첫 번째 작업의 표준 PID이므로 isolcpus작업 여부를 반영 할 수 있습니다 . 에서처럼 :

$taskset -cp 1
pid 1's current affinity list: 0,1

lscpu동일한 서버에서 명령 과 비교 :

$lscpu | grep CPU.s
CPU(s):                4
On-line CPU(s) list:   0-3
NUMA node0 CPU(s):     0-3

보시다시피, lscpu4 개의 CPU / 코어를 표시하는 반면 taskset0.1 만 표시 하므로이 쇼 isolcpus가 작동합니다.

:시에 봐 가지고 어떻게 실행중인 프로세스에 대한 전용 CPU 가용성을 보장 할 수 있습니까?


대답 해 주셔서 감사 합니다만, 받아들이지 않습니다. 커널 명령 줄에 대한 답변을 수락하지 않도록 지정했습니다. 파일 /proc/cmdline내용의 정확한 사본이 무엇인지 분명히 알고 grub.conf있습니다. 이것은 내가 요구 한 것이 아닙니다! 어쨌든 감사합니다!
netmonk 2012 년

나는 대답에 덧붙였다.
Rui F Ribeiro

1
누군가 이전에 작업 세트와 프로세스의 선호도를 수정 한 것은 무엇입니까? 누군가 cpu 0에만 init affinity를 설정하면 isol cpu의 활성화 여부에 대한 정보를 제공합니까?
netmonk 2012 년

1

현재 쉘 프로세스에 대해 Cpus_allowedCpus_allowed_list 를 확인 하여 어떤 CPU가 예약 되었는지 확인할 수 있습니다.

cat /proc/$$/status|tail -6

예를 들어

Cpus_allowed_list:      0-1, 3-5

cpu = 2는 isolcpus6 CPU 서버에서 예약되었음을 의미 합니다.


2
실은 ... 아니 현재 쉘 프로세스에 의해 상속 된 선호도 마스크에있는 CPU를 보여줍니다 . 예를 들어, ssh부모의 선호도 sshd를 CPU 1로 수동으로 제한 한 경우 isolcpus"취득" 여부에 관계없이 항상 CPU 1이 표시 됩니다. $$지사는 당신에게 과정 상속 값이 아닌 원래의 시스템들 수 있습니다.
LSerni
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.