Потеряю ли я производительность при выполнении многоядерных задач, если средняя загрузка системы превысит количество ядер?

Потеряю ли я производительность при выполнении многоядерных задач, если средняя загрузка системы превысит количество ядер?

Я много занимаюсь статистическим анализом с помощью R и активно использую большие многоядерные экземпляры на AWS. В основном для поиска гиперпараметров, перекрестной проверки и бутстрапинга.

Допустим, у меня есть экземпляр с cядрами и задание с r >= cрепликами, которые отдаются cядрам за раз. Теперь из-за системного процесса (например, запущенного моего клиента ssh htop) есть задания, помимо cзапущенных моих реплик.

Это означает, насколько я понимаю работу операционной системы, что есть некий процесс, который отключает мои задания, чтобы htop(и что угодно еще) могло получить доступ к процессорам. После того, как я дал этим различным процессам некоторое время на солнце, мои задания возобновляются.

Когда я смотрю на htop, я вижу много красного, смешанного с зеленым. Правильно ли будет сказать, что зеленый — это моя работа, а красный — фон, сделанный для того, чтобы обеспечить мою работу?

Интуитивно кажется, что такого рода перетасовка будет неоптимальной. Так вот мой прямой вопрос: если у меня есть доступ к cядрам, должен ли я распределять свои задания по репликации по всем cиз них, или, может быть, c-1или что-то в этом роде?

Я также предполагаю, что есть много деталей о том, как вычислительные ресурсы назначаются заданиям, которые я не понимаю и умалчиваю. Что будет, если все мои задания будут идти в c-1ядра, а все системные процессы — в ядро cth? Это сделает весь мой htop зеленым, за исключением одной полоски? И будет ли это иметь какой-либо смысл?

Я полагаю, что я мог бы провести эксперименты по бенчмаркингу, но это было бы сложно с огромными экземплярами и наборами данных, и я не уверен, что я бы узнал, учитывая, как много вещей будет специфично для приложения. Поэтому я хочу лучше понять, как все работает.

решение1

Трудно узнать точный эффект на конкретное приложение без экспериментов, НО общее правило заключается в том, что небольшое превышение числа ядер полезно (например, большинство руководств по компиляции предлагают вызывать make с числом ядер/потоков + 1), но большое превышение, скорее всего, контрпродуктивно из-за дополнительных накладных расходов. Причина этого в том, что если одна (или несколько) задач спят, ожидая ввода-вывода или таймеров или чего-то еще, то другие потоки все еще могут продолжать работу.

Перестановка работы (планирование ОС) происходит во всех современных операционных системах, и это то, с чем мы должны работать, а не бороться с этим. Если кажется, что есть что-то не связанное с конкуренцией, вы можете снизить уровень nice вашего процесса, но на выделенном экземпляре AWS... Трудно представить, что это необходимо.

Связанный контент