как определить, активирован ли isolcpus?


15

Как определить, активирован ли isolcpus и на каком процессоре, например, когда вы впервые подключаетесь к серверу. условия:

не порождает процесс, чтобы увидеть, куда он будет перенесен.

Прецедент является то , что isolcpus=1-7на а 6 ядер i7, кажется, не активировать isolcpus при загрузке, и я хотел бы знать , если его можно из /proc/, /sysили любого ядра Внутренности , которые могут быть прочитаны в пользовательском пространстве, чтобы обеспечить четкий статус активации isolcpus и какой процессор касается. Или даже прочитайте активную настройку планировщика, который первым относится к isolcpus.

Учтите, что время работы настолько велико, что dmesgбольше не отображается журнал загрузки, чтобы обнаружить любую ошибку при запуске. Базовый ответ типа " посмотрите на строку cmd ядра " не будет принят :)


1
Можете ли вы использовать pidstat -C isolcpus. пидстат из sysstatпакета.
Тимоти Пуллиам

2
Может быть, я тупой, но я не вижу никакой связи между pidstatи isolcpus. Можете ли вы уточнить немного больше?
netmonk

Вы говорите, что должны знать, на каких процессорах работает команда. Я не знаю что isolcpus, но pidstatмогу сказать вам, на каком процессоре запущен процесс, если вы передадите -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
Тимоти Пуллиам

2
Хорошо, спасибо за ваш ответ. isolcpusявляется параметром ядра, который заставляет планировщик не мигрировать сам процесс, если они изолированы. Например, на 8-процессорных серверах isolcpus=1-7в командной строке ядра принудительно запускается весь порожденный процесс, инициированный init и любой командой в оболочке, только на CPU0. Чтобы запустить задачу на изолированном процессоре, вам нужно запустить его tasksetдля примера. Так что в отношении того, что я спрашиваю, кажется, ваш ответ не по теме. В любом случае спасибо за попытку ответить мне
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, полагая, что он находится в режиме монопроцессора по ошибке, и старательно пытающимся «установить вещи» вправо "путем сброса маски сходства. Если бы это было так, вы можете попробовать изолировать CPUS 0-5 вместо 1-6 и посмотреть, работает ли это.


1
Протестировано на Centos 7.x, обратите внимание, что /sys/devices/system/cpu/possibleне кажется «обратным» в зависимости от того, как вы интерпретируете «обратный». Например, если .../cpu/isolatedвернется, 2,4потому что они были изолированы, .../cpu/possibleвернется 0-191.
bgura

1
Я думаю, что большинство людей хотели бы /sys/devices/system/cpu/presentузнать, какие процессоры существуют, а не /sys/devices/system/cpu/possibleкакие процессоры могут существовать (но могут и не существовать). На некоторых системах они одинаковы, но даже на довольно простом рабочем столе, который я проверял, это не так.
Джон Цвинк

@JohnZwinck хороший улов. поправка ответа
LSerni

1
С isolcpus = 0 и 4 ядрами, я получаю / изолированы = 0 и / присутствует = 0-3.
Стефан Рейх

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в качестве аргумента было передано работающее ядро.

Вы также можете использовать 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 процессора / ядра, в то время tasksetкак показывает только 0,1, так что это шоу isolcpusработает здесь.

Посмотрите на: Как обеспечить исключительную доступность процессора для запущенного процесса?


Спасибо, сэр, за ваш ответ, но я не приму это. Я указал, что ответ, говорящий о командной строке ядра, не будет принят. Я, очевидно, знаю, /proc/cmdlineкакая точная копия содержимого grub.confфайла. Это не то, что я спросил! Все равно спасибо !
netmonk

Я добавил к ответу.
Руи Ф Рибейро

1
Что кто-то ранее модифицировал сродством процессуса с набором задач? Что делать, если кто-то устанавливает сродство init только к процессору 0, дает ли он какую-либо информацию об активации или нет изолированного процессора?
netmonk

1

Вы можете проверить Cpus_allowed и Cpus_allowed_list для текущего процесса оболочки, чтобы увидеть, какие процессоры были зарезервированы.

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

например

Cpus_allowed_list:      0-1, 3-5

означает, что процессор = 2 был зарезервирован isolcpusна сервере 6 процессоров


2
Вообще-то, нет. Он показывает, какие процессоры находятся в маске сходства, унаследованной текущим процессом оболочки. Если бы это было, скажем, sshи кто-то вручную ограничил сродство родителя sshdк ЦП 1, вы бы всегда видели ЦП 1, независимо от isolcpusтого, «взяли» или нет. $$Отрасль дает вам процесс унаследовал ценности, а не оригинальный системные.
LSerni
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.