Я занимаюсь разработкой приложения реального времени на сервере с двумя узлами NUMA. Ниже приведена упрощенная версия системной диаграммы (ОС — Ubuntu14.04):
.-------------. .-------------.
| Device 0 | | Device 1 |
.-------------. .-------------.
|| ||
|| ||
.-------------. .-------------.
| PCIE slot 0 | | PCIE slot 1 |
.-------------. .-------------.
|| ||
|| ||
.-------------. QPI link .-------------.
| CPU 0 |<-------->| CPU 1 |
.-------------. .-------------.
|| ||
|| ||
.-------------. .-------------.
| Mem node 0 | | Mem node 1 |
.-------------. .-------------.
Эти два устройства делают одно и то же, но каждое из них потребляет всю мощность одного процессора, поэтому мне нужно создать два потока, чтобы управлять ими по отдельности. Также я должен использовать стороннюю библиотеку для управления двумя устройствами.
Хотя я могу использовать numa_alloc
выделить память на локальном узле в моем собственном потоке, который не меняет способ, которым сторонняя библиотека выделяет свою собственную память.
Первый: Если я запускаю программу только с одним устройством с numactl --membind
Я получаю очень хорошие результаты.
второй: Если я запускаю программу с двумя устройствами без numactl --membind
Я получаю относительно хорошую производительность для обоих устройств, но если я продолжаю работать в течение долгого времени, производительность не так стабильна.
Thrid: Если я запускаю программу с двумя устройствами вместе сnumactl --membind
, сказать numactl --membind=0
тогда устройство 0 работает довольно хорошо, но не устройство 1, и наоборот.
Основываясь на вышеупомянутых наблюдениях, я подозреваю, что локальность памяти является узким местом производительности здесь.
Мой вопрос: Могу ли я установить какие-то ограничения в моем потоке, чтобы все, что находится внутри этого потока, размещалось на определенном узле NUMA, в том числе сторонней библиотеки?
Задача ещё не решена.
Других решений пока нет …