Как рассчитать пропускную способность памяти в данной (Linux) системе из оболочки?

Я хочу написать скрипт / команду оболочки, которая использует общедоступные двоичные файлы, /sys файловая система или другие средства для расчета теоретической максимальной пропускной способности для оперативной памяти, доступной на данном компьютере.

Заметки:

  • Меня не волнует задержка, только пропускная способность.
  • Меня интересуют не эффекты кэширования (например, кэш последнего уровня процессора), а пропускная способность чтения из ОЗУ.
  • Если это поможет, вы можете предположить "ванильную" платформу Intel, и все модули памяти DIMM идентичны; но я бы предпочел, чтобы вы не делали это предположение.
  • Если это помогает, вы можете полагаться на привилегии root (например, используя sudo)

2 ответа

Я не знаю ни одного автономного инструмента, который бы это делал, но только для чипов Intel, если вы знаете "ARK URL" для чипа, вы могли бы получить максимальную пропускную способность, используя комбинацию инструментов для запроса ARK, например curlи что-то для разбора возвращаемого HTML, например xmllint --html --xpath,

Например, для моего i7-6700HQ работает следующее:

curl -s 'https://ark.intel.com/products/88967/Intel-Core-i7-6700HQ-Processor-6M-Cache-up-to-3_50-GHz' | \
xmllint --html --xpath '//li[@class="MaxMemoryBandwidth"]/span[@class="value"]/span/text()' - 2>/dev/null

Это возвращает 34.1 GB/s это максимальная теоретическая пропускная способность моего чипа.

Основная трудность заключается в определении URL ARK, который явно не соответствует строке бренда процессора. Одним из решений было бы найти модель процессора на индексной странице, подобной этой, и перейти по ссылке.

Это дает вам максимальную теоретическую пропускную способность, которая может быть рассчитана как (number of memory channels) x (trasfer width) x (data rate), data rate число передач в единицу времени, и обычно это число, указанное в названии типа памяти, например, DDR-2133 имеет скорость передачи данных 2133 миллионов передач в секунду. В качестве альтернативы вы можете рассчитать его как произведение скорости шины (в данном случае 1067 МГц) и множителя скорости передачи данных (2 для технологий DDR).

Для моего процессора этот расчет дает 2 memory channels * 8 bytes/transfer * 2133 million transfers/second = 34.128 GB/s, в соответствии с цифрой ARK.

Обратите внимание, что теоретический максимум, сообщаемый ARK, может быть ниже или выше теоретического максимума в вашей конкретной системе по различным причинам, включая:

  • Заполнено меньше каналов памяти, чем максимальное количество каналов. Например, если бы я заполнил только один канал в моей двухканальной системе, теоретическая пропускная способность была бы уменьшена вдвое.
  • Не используется максимальная скорость, поддерживаемая ОЗУ. Мой процессор поддерживает несколько типов оперативной памяти (DDR4-2133, LPDDR3-1866, DDR3L-1600) с различными скоростями. Показатель ARK предполагает, что вы используете максимально быструю поддерживаемую оперативную память, что верно в моем случае, но может не соответствовать действительности в других системах.
  • Превышение или снижение тактовой частоты шины памяти относительно номинальной скорости.

Как только вы получите правильную теоретическую цифру, вы фактически не достигнете этой цифры на практике из-за различных факторов, включая следующие:

  • Невозможность насыщать интерфейс памяти одним или несколькими ядрами из-за ограниченного параллелизма для невыполненных запросов, как описано в разделе "Платформы с задержкой" в этом ответе.
  • Скрытое удвоение пропускной способности, подразумеваемое операциями записи, которые должны прочитать строку перед ее записью.
  • Различные низкоуровневые факторы, относящиеся к интерфейсу DRAM, которые предотвращают 100% -ное использование, такие как стоимость открытия страниц, время выполнения операций чтения / записи, циклы обновления и так далее.

Тем не менее, используя достаточное количество ядер и нетрадиционных хранилищ, вы часто можете очень приблизиться к теоретической пропускной способности, часто к 90% или более.

@einpoklum, вам стоит взглянуть на Performance Counter Monitor, доступный по адресу https://github.com/opcm/pcm. Это даст вам измерения, которые вам нужны. Я не знаю, поддерживает ли оно ядро ​​2.6.32

В качестве альтернативы вы также должны проверить инструмент Intel EMON, который обещает поддержку ядер еще до 2.6.32. Руководство пользователя указано по адресу https://software.intel.com/en-us/download/emon-user-guide, что означает, что оно доступно для скачивания где-то на форумах Intel по программному обеспечению.

Другие вопросы по тегам