Как получить параметр ядра isolcpus, работающий с Precise 12.04 amd64?

Я тестировал этот материал, пытаясь зарезервировать несколько процессоров в хосте с двумя процессорами Intel E5645, но по какой-то причине не могу заставить его работать. Шаги, за которыми я следовал:

  1. Отредактируйте / etc / default / grub и добавьте isolcpus=0,1 в GRUB_CMDLINE_LINUX_DEFAULT

    GRUB_CMDLINE_LINUX_DEFAULT="quiet splash isolcpus=0,1"

  2. Запустите update-grub

  3. перезагружать

После этого cat / proc / cmdline показывает:

BOOT_IMAGE=/boot/vmlinuz-3.2.0-26-generic root=UUID=52cfedad-40be-41b9-9f88-c282a7ae3f24 ro quiet splash isolcpus=0,1 vt.handoff=7

Протестировано с использованием стресса:

apt-get install stress && stress -c 24

Мониторинг осуществляется с помощью top и нажатия 1 для отображения отдельных характеристик процессора. До сих пор ни один ЦП не изолирован от планировщика, и все они перегружены стрессом.

Cpu0  : 99.7%us,  0.3%sy,  0.0%ni,  0.0%id,  0.0%wa
Cpu1  :100.0%us,  0.0%sy,  0.0%ni,  0.0%id,  0.0%wa
Cpu2  :100.0%us,  0.0%sy,  0.0%ni,  0.0%id,  0.0%wa
Cpu3  :100.0%us,  0.0%sy,  0.0%ni,  0.0%id,  0.0%wa
Cpu4  :100.0%us,  0.0%sy,  0.0%ni,  0.0%id,  0.0%wa
Cpu5  :100.0%us,  0.0%sy,  0.0%ni,  0.0%id,  0.0%wa
Cpu6  :100.0%us,  0.0%sy,  0.0%ni,  0.0%id,  0.0%wa
Cpu7  :100.0%us,  0.0%sy,  0.0%ni,  0.0%id,  0.0%wa
Cpu8  :100.0%us,  0.0%sy,  0.0%ni,  0.0%id,  0.0%wa
Cpu9  :100.0%us,  0.0%sy,  0.0%ni,  0.0%id,  0.0%wa
Cpu10 :100.0%us,  0.0%sy,  0.0%ni,  0.0%id,  0.0%wa
Cpu11 :100.0%us,  0.0%sy,  0.0%ni,  0.0%id,  0.0%wa
Cpu12 :100.0%us,  0.0%sy,  0.0%ni,  0.0%id,  0.0%wa
Cpu13 :100.0%us,  0.0%sy,  0.0%ni,  0.0%id,  0.0%wa
Cpu14 :100.0%us,  0.0%sy,  0.0%ni,  0.0%id,  0.0%wa
Cpu15 :100.0%us,  0.0%sy,  0.0%ni,  0.0%id,  0.0%wa
Cpu16 :100.0%us,  0.0%sy,  0.0%ni,  0.0%id,  0.0%wa
Cpu17 :100.0%us,  0.0%sy,  0.0%ni,  0.0%id,  0.0%wa
Cpu18 :100.0%us,  0.0%sy,  0.0%ni,  0.0%id,  0.0%wa
Cpu19 :100.0%us,  0.0%sy,  0.0%ni,  0.0%id,  0.0%wa
Cpu20 :100.0%us,  0.0%sy,  0.0%ni,  0.0%id,  0.0%wa
Cpu21 :100.0%us,  0.0%sy,  0.0%ni,  0.0%id,  0.0%wa
Cpu22 :100.0%us,  0.0%sy,  0.0%ni,  0.0%id,  0.0%wa
Cpu23 :100.0%us,  0.0%sy,  0.0%ni,  0.0%id,  0.0%wa

Протестировал то же самое в CentOS 6 x86_64, и он работает как положено.

Искал в панели запуска информацию об ошибках в Ubuntu и Linux, но пока ничего не нашел.

Это я тупой или я что-то упускаю? Советы?

Спасибо!

Refs:

http://www.kernel.org/doc/Documentation/kernel-parameters.txt

3 ответа

Отключенный SMT (Hyper-Threading) в BIOS, отключение питания, повторное тестирование с отключенным HT, и isolcpus работает, как и ожидалось.

Повторно включенный SMT в BIOS, циклическое включение, все еще работает как ожидалось.

Определенно, не самый лучший ответ, который вы могли ожидать, но, тем не менее, он сработал для меня.

isolcpus только изолирует от определенных действий в пользовательском пространстве и не изолирует ЦП от активности ядра (сторожевые таймеры, kworkers, стек linux...). Более того, вам не следует изолировать процессор 0 (который имеет множество выделенных действий, таких как обнаружение usb, настройка таймера acpi, диспетчеризация wrmsr/rdmsr.... которые обычно составляют 2% в стандартном дистрибутиве, где все драйверы включены по умолчанию)

Вы можете проверить, какие процессы выполняются на каких ядрах, отображая все потоки, отсортированные по номеру ядра.

ps -aFeL | cut -c 48- | sort -n

Вам также необходимо проверить и изменить сходства в /proc/irq/*, чтобы попытаться изменить сходство прерываний.

Вы можете динамически сэкономить процессор и удалить "большинство" задач ядра Linux, используя инструмент cpuset.

вместо

taskset -c 3-7,11-15 program args

попробуй это

sudo apt install cpuset
cset set --list
cset shield -c 3-7,11-15
cset set --list
cset shield -e program -- args  

И тогда вы сможете оценить разницу

ps -aFeL | cut -c 48- | sort -n

При запуске этих 2 команд

cset shield -e stress -- -c 16
stress -c 16

На самом деле, isolcpus похоже (по моим тестам) ведет себя по-разному на процессорах AMD и Intel.

Kernel: 4.10.0-38-generic x86_64 (64 bit) на обоих

/etc/default/grub добавленной isolcpus=2 к GRUB_CMDLINE_LINUX_DEFAULT= line, аналогично ОП. затем sudo update-grub и перезагрузите компьютер.

  • На Intel Core i7 двухъядерный с гиперпоточностью, ps -eF | grep " 2 " показывает только очень немногие корневые процессы, запускаемые в Hyperthread 2 (и все они, кажется, имеют /2 после CMD).

  • В четырехъядерном процессоре AMD без гиперпоточности многие корневые процессы запускаются на ядре 2 (и большинство не имеют /2 после CMD).

Это ошибка, которая, вероятно, будет исправлена, или функция?

Другие вопросы по тегам