Я верю, что это подходящее место для этого вопроса. Это не связано с программированием, или я мог бы спросить о Stackoverflow вместо этого. Тем не менее, вот в чем вопрос. Я делаю некоторые тесты пропускной способности сети. В настоящее время у меня есть две сетевые карты 40GbE, напрямую проверяющие пропускную способность. (Для этого я использую iperf3).
Мои тестовые системы - двойной Xeon E5 2667 (из /proc /cpuinfo model name : Intel(R) Xeon(R) CPU E5-2667 0 @ 2.90GHz
) с 24 логическими процессорами. Существует гиперкуб NUMA из двух узлов с половиной процессоров, прикрепленных к каждому. Имеется 32 ГБ оперативной памяти в виде не-ECC DDR3. В каждом случае 40GbE NIC подключается к слоту PCIe Gen 3 x8, который связан с узлом NUMA 0.
Когда я выполняю тест с iperf3 с минимальным количеством опций (в основном, с использованием значений по умолчанию, которых достаточно для моих целей), я не могу видеть пропускную способность для теста TCP, превышающую 21.x Гбит / с (хорошо, поэтому иногда она становится выше 21 но обычно это 21.x). Однако, если я использую опцию iperf3 -A n
которая ограничивает iperf3
процессором <n>
, я вижу ~ 36 Гбит / с, что намного больше, чем я ожидал. Я хотел бы понять почему.
Я экспериментировал с numactl
для привязки выделения памяти, процессорных узлов и физического процессора для iperf3
. Как ни странно, я не могу достичь той же пропускной способности с помощью numactl
что и при использовании опции iperf3
-A
. Работа с различными вещами / опциями (см. Man-страницу numactl для более подробной информации), главным образом --physcpubind=<n>
, --cpunodebind=<n>
и --membind=<n>
я не могу достичь скорости больше чем ~ 31 Гбит / с тестовое задание. Я хотел бы понять почему.
С этой целью я начал использовать пакет perf
, предоставляемый linux. Однако я не нахожу в гору документации, доступной ни Linux, ни Intel, о доступных вещах PMU. О, это объясняет, как запустить его, но мало что сказано о том, что на самом деле означает. В качестве примера, bus-cycles
появляются как в "Аппаратных событиях", так и в "Событиях ядра PMU". Какая разница? perf list
описывает "события", которые можно отслеживать; это долго. Документация, которую я нашел от Intel для Xeon E5 2667 (которую я считаю установкой Haswell), показывает, что поддерживаются различные вещи, связанные с NUMA, и perf list
перфектов показывает uncore_imc_0/cas_count_read/
и uncore_qpi_0/drs_data/
(среди многих других), которые должны быть связано с этим. Тем не менее, когда я запускаю iperf3
пытаясь контролировать это, я понимаю, что это не поддерживается. Например:
$ perf stat -e uncore_qpi_0/drs_data/ -- iperf3 -c 192.168.0.244 -A 0
.... program output ....
Performance counter stats for 'iperf3 -c 192.168.0.244 -A 0':
<not supported> uncore_qpi_0/drs_data/
Тем не менее, документы показывают, что это должно быть. Есть ли какой-нибудь способ узнать, что поддерживается моим процессором, без запуска программы, только чтобы узнать послесловие, что это не так? Есть ли у кого-нибудь предложения для метрик, которые важны для понимания несоответствия? (Тег с RHEL, потому что это целевая платформа для решения.)