Как получить параметр ядра isolcpus, работающий с Precise 12.04 amd64?
Я тестировал этот материал, пытаясь зарезервировать несколько процессоров в хосте с двумя процессорами Intel E5645, но по какой-то причине не могу заставить его работать. Шаги, за которыми я следовал:
Отредактируйте / etc / default / grub и добавьте isolcpus=0,1 в GRUB_CMDLINE_LINUX_DEFAULT
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash isolcpus=0,1"Запустите update-grub
- перезагружать
После этого 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).
Это ошибка, которая, вероятно, будет исправлена, или функция?