Как заставить два процесса работать на одном процессоре? - PullRequest
3 голосов
/ 12 января 2011

Контекст:

Я программирую систему программного обеспечения, которая состоит из нескольких процессов.Он запрограммирован на C ++ под Linux.и они общаются между собой, используя разделяемую память Linux.

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

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

Вопрос:

Теперь возникает вопрос, есть ли способ заставить пары процессов выполняться в одном и том же ЦП ?.Я не хочу заставлять их работать всегда в одном и том же процессоре, так как мне все равно, в каком из них они выполняются, хотя это будет хорошо работать.В идеале должен быть способ сообщить ядру: если вы планируете этот процесс в одном процессоре, вы должны также запланировать этот «братский» процесс (то есть процесс, с которым он связывается через общую память) в том же процессоре, чтобыпроизводительность не наказывается.

Ответы [ 3 ]

4 голосов
/ 12 января 2011

Я думаю, вы можете начать с этих страниц справочника:

$ apropos affinity
sched_getaffinity (2) - set and get a process's CPU affinity mask
sched_setaffinity (2) - set and get a process's CPU affinity mask
taskset (1)          - retrieve or set a process's CPU affinity
$

в зависимости от того, хотите ли вы сделать это из исходного кода или оболочки. Библиотека pthread также имеет некоторую функцию.

2 голосов
/ 12 января 2011

В C вы, скорее всего, ищете системный вызов sched_setaffinity().

Существует также утилита командной строки schedtool , если вы не хотите (или не можете) изменить свой код.

1 голос
/ 12 января 2011

Написание приложений с поддержкой NUMA - это нечто большее, чем просто «два процесса, запущенные на одном процессоре».Осведомленность NUMA пронизывает все: распределение памяти, завершение ввода-вывода, планирование потоков и т. Д.

Посмотрите на libnuma

...