예를 들어 처음으로 서버에 연결할 때 isolcpus가 활성화되었는지, 어떤 CPU에 있는지 감지하는 방법 등이 있습니다. 상황:
마이그레이션될 위치를 확인하기 위해 프로세스가 생성되지 않습니다.
사용 사례는 6코어 i7에서 부팅 시 isolcpus가 활성화되지 않는 것 같습니다. 커널 내 에서나 가능한 모든 것에서 isolcpus=1-7
isolcpus 활성화의 명확한 상태와 관련된 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
실행 중인 커널에 매개변수로 전달됩니다.
taskset
PID 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
보시다시피 lscpu
4개의 CPU/코어가 표시되고 taskset
0,1만 표시되므로 isolcpus
여기서는 모든 것이 제대로 작동하고 있음을 나타냅니다.
답변3
당신은 확인할 수 있습니다CPU_허용그리고CPU_allowed_list현재 셸 프로세스를 확인하여 어떤 CPU가 예약되어 있는지 확인하세요.
cat /proc/$$/status|tail -6
예를 들어
Cpus_allowed_list: 0-1, 3-5
CPU=2가 isolcpus
6개의 CPU 서버용으로 예약되어 있음을 의미합니다.