У меня есть один однопоточный процесс на сервере, который я хотел бы статически привязать к одному ядру ЦП и постоянно предоставлять ему всю доступную вычислительную мощность (это процесс реального времени, на который сильно влияет нехватка ресурсов). К сожалению, машина сильно перегружена, поэтому в среднем центральный процессор загружен на 60% или больше, и процесс обычно останавливается. Я уже назначил приоритет 99 циклическому перебору в реальном времени, но он все еще далек от совершенства.

Как я могу распределить все остальные процессы на оставшиеся 7 ядер ЦП при запуске и оставить одно ядро, выделенное для этого процесса? Я говорю о ситуации, когда все вновь порожденные процессы уже изначально привязаны к 7 ядрам.

answer

Удалите процессор, который вы хотите выделить для своего процесса реального времени, используя параметр загрузки ядра isolcpus:

Remove the specified CPUs, as defined by the cpu_number values, from the general kernel SMP balancing and scheduler algroithms. The only way to move a process onto or off an "isolated" CPU is via the CPU affinity syscalls

Если вы используете дистрибутив с systemd, вы можете использовать CPUAffinityв своем сервисном подразделении

Я никогда этого не делал, так что это всего лишь предложение.

Похоже, что tasksetконфигурация передается по наследству. Таким образом, вы можете как можно раньше в процессе загрузки сделать такую ​​настройку для PID 1, чтобы все, что SystemD запускалось после этого, использовало только эти ядра:

taskset -p 0x7F 1

Или вам все равно, в какой момент процесса загрузки это произойдет, и просто переберите все существующие процессы.

Не забудьте изменить настройки для вашего специального приложения ...