як виявити, чи активована ізольпа?


15

Як визначити, чи активовано isolcpus і на якому cpus, коли, наприклад, ви вперше підключаєтесь до сервера. Умови:

не нерестуючи жоден процес, щоб побачити, куди він буде переміщений.

Прецедент є те , що isolcpus=1-7на а 6 ядер i7, здається, не активувати isolcpus при завантаженні, і я хотів би знати , якщо його можна з /proc/, /sysабо будь-якого ядра Нутрощі , які можуть бути прочитані в просторі користувача, щоб забезпечити чіткий статус активації isolcpus і який процесор стосується. Або навіть прочитати активну установку планувальника, який першим стосується ізольпус.

Вважайте, що тривалість роботи настільки велика, що dmesgбільше не відображається журнал завантаження для виявлення помилок при запуску. Основна відповідь на кшталт " подивіться на cmd рядок ядра " не буде прийнята :)


1
Чи можете ви використовувати pidstat -C isolcpus. pidstat від 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для for exampleple. Отже, що стосується того, що я прошу, здається, ваша відповідь поза темою. Все одно дякую за спробу відповісти мені
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 хороший улов.
коригуюча

1
Ізолькпус = 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

Я додав у відповідь.
Rui F Ribeiro

1
Що раніше хтось змінив спорідненість процесу з набором завдань? що робити, якщо хтось встановлює спорідненість init до CPU 0, чи дає мені яку-небудь інформацію про активацію чи не ізоля процесора?
netmonk

1

Ви можете перевірити Cpus_allowed та Cpus_allowed_list на поточний процес оболонки, щоб побачити, який cpus був зарезервований

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

напр

Cpus_allowed_list:      0-1, 3-5

означає, що cpu = 2 було зарезервовано isolcpusна сервері 6 cpus


2
Насправді ... ні. Це показує, які процесори є в масці спорідненості, успадкованої поточним процесом оболонки. Якби, скажімо, sshі хтось вручну обмежив спорідненість батьківського sshdпроцесора 1, ви завжди бачили б CPU 1, isolcpus"взяли" чи ні. $$Галузь дає вам процес успадкував цінності, а не оригінальні системні.
LSerni
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.