isolcpus가 활성화되었는지 어떻게 감지하나요?

isolcpus가 활성화되었는지 어떻게 감지하나요?

예를 들어 처음으로 서버에 연결할 때 isolcpus가 활성화되었는지, 어떤 CPU에 있는지 감지하는 방법 등이 있습니다. 상황:

마이그레이션될 위치를 확인하기 위해 프로세스가 생성되지 않습니다.

사용 사례는 6코어 i7에서 부팅 시 isolcpus가 활성화되지 않는 것 같습니다. 커널 내 에서나 가능한 모든 것에서 isolcpus=1-7isolcpus 활성화의 명확한 상태와 관련된 CPU를 제공할 수 있는지 궁금합니다. 사용자 공간에서 읽을 수 있습니다. 아니면 isolcpus가 먼저 중점을 두는 스케줄러의 활동 설정을 읽어보세요./proc//sys

가동 시간이 너무 높아 dmesg부팅 시 오류를 감지하기 위해 부팅 로그가 더 이상 표시되지 않는다는 점을 고려하세요. 기본적인 대답은 "커널 명령줄 보기"받아들일 수 없습니다 :)

답변1

당신이 찾고 있는 것은 이 더미 파일에서 찾을 수 있습니다:

/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단일 프로세서 모드에 있다고 잘못 믿고 선호도 마스크를 재설정하여 "오류 수정"을 시도하는 일부 프로세스에 의해 포크됩니다. 이 경우 CPUS 1-6 대신 0-5를 격리하여 작동하는지 확인할 수 있습니다.

답변2

이러한 경우를 감지하는 가장 쉬운 방법 중 하나는 런타임에 어떤 매개변수가 커널에 전달되는지 확인하는 것 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 가용성을 보장하는 방법은 무엇입니까?

답변3

당신은 확인할 수 있습니다CPU_허용그리고CPU_allowed_list현재 셸 프로세스를 확인하여 어떤 CPU가 예약되어 있는지 확인하세요.

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

예를 들어

Cpus_allowed_list:      0-1, 3-5

CPU=2가 isolcpus6개의 CPU 서버용으로 예약되어 있음을 의미합니다.

관련 정보