Допустим, у меня есть 2 четырехъядерных процессора (8x 2,13 ГГц). На сервере работает несколько программ, которые могут использовать только 1 ядро + Nginx и Apache одновременно.
Вопрос в том, эффективно ли Linux распределяет однопоточные программы для каждого ядра, чтобы каждая программа могла использовать всю мощность одного ядра и не мешала загрузке Apache и Nginx. Так что в основном нужно убедиться, что используются все ядра, а не куча, чтобы программы могли отставать?
Хороший ответ на ваш вопрос слишком сложен для SF. Короткий ответ - «да», Linux и большинство современных операционных систем очень эффективно уравновешивают процессы, которые готовы к работе на доступных процессорах.
Существуют методы для изменения того, как процессы распределяются по ресурсам, включая изменение планировщиков, назначающих процессы конкретным процессорам, но я бы не рекомендовал использовать какие-либо из них, не понимая, что они делают, или не используя их для решения конкретной проблемы.
Кроме того, по умолчанию и nginx, и Apache httpd multithread / multiprocess. Было бы очень странно, если бы они работали как единый процесс. Они не опрашивают сетевые соединения / потоки, они используют вызов ядра для остановки работы, когда нечего делать, и автоматически просыпаются, когда есть что-то сделать.
Linux в первую очередь заботится о максимальном использовании ЦП за счет балансировки нагрузки потоков по всем доступным ядрам. Это не означает, что Linux произвольно решает разместить определенные потоки на определенных ядрах, но он использует алгоритм планирования процессов, чтобы решить, какой способ распределения потоков по всем ядрам является наиболее эффективным. Так что ответ на ваш вопрос - да. Если вы хотите узнать больше, я бы предложил "Понимание ядра Linux" от Bovet & Cesati.
Если под «несколькими программами, которые могут использовать только 1 ядро» вы имеете в виду программы, для которых вы можете изменить источник, рассмотрите возможность добавления вызова sched_setscheduler () во время инициализации потока, чтобы дать планировщику подсказку относительно того, как вы хотите запланировать каждый поток. Планировщик linux чертовски потрясающий IMHO, но чем больше в нем информации, тем лучше он может выполнять свою работу! sched_setscheduler () - это привилегированный системный вызов, вызывающий его поток должен, по крайней мере, иметь возможность CAP_SYS_NICE и, возможно, другие.