Контекст:
Я программирую систему программного обеспечения, которая состоит из нескольких процессов.Он запрограммирован на C ++ под Linux.и они общаются между собой, используя разделяемую память Linux.
Обычно в разработке программного обеспечения находится на заключительной стадии, когда производится оптимизация производительности.Здесь я пришел к большой проблеме.Программное обеспечение предъявляет высокие требования к производительности, но на машинах с 4 или 8 ядрами ЦП (обычно с более чем одним ЦП) оно могло использовать только 3 ядра, тратя впустую 25% мощности ЦП в первых и более60% во вторых.После многих исследований и отбросив конфликты мьютексов и блокировок, я обнаружил, что время было потрачено впустую на вызовы shmdt / shmat (отсоединение и присоединение к сегментам общей памяти).После еще одного исследования я обнаружил, что эти процессоры, которые обычно являются AMD Opteron и Intel Xeon, используют систему памяти под названием NUMA, что в основном означает, что у каждого процессора есть своя быстрая «локальная память», и доступ к памяти из других процессоровдорого.
После выполнения некоторых тестов проблема, похоже, заключается в том, что программное обеспечение разработано так, что, по сути, любой процесс может передавать сегменты разделяемой памяти любому другому процессу и любому потоку в них.Кажется, это снижает производительность, поскольку процессы постоянно обращаются к памяти из других процессов.
Вопрос:
Теперь возникает вопрос, есть ли способ заставить пары процессов выполняться в одном и том же ЦП ?.Я не хочу заставлять их работать всегда в одном и том же процессоре, так как мне все равно, в каком из них они выполняются, хотя это будет хорошо работать.В идеале должен быть способ сообщить ядру: если вы планируете этот процесс в одном процессоре, вы должны также запланировать этот «братский» процесс (то есть процесс, с которым он связывается через общую память) в том же процессоре, чтобыпроизводительность не наказывается.