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

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

Заметки:

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

person einpoklum    schedule 20.07.2018    source источник
comment
какая пропускная способность вас интересует? ЦП ‹--› ОЗУ? Ввод/вывод ‹--› ОЗУ? и под оперативной памятью мы подразумеваем виртуальную память или прямой доступ к физической памяти? Как насчет кэша L3 (или последнего)? Вы смотрели superuser.com/questions/827207/ ?   -  person diginoise    schedule 20.07.2018
comment
@diginoise: я спросил об оперативной памяти, а не о кеше процессора. Я имел в виду, сколько вы можете прочитать из ОЗУ везде в системе; обычно это будет то, сколько вы можете прочитать из разных банков памяти в различные сокеты ЦП в системе.   -  person einpoklum    schedule 20.07.2018
comment
Вы хотите провести тестирование, например, с time dd if=/dev/zero of=/dev/null bs=1g count=200 или что-то в этом роде? Если нет, то тег [benchmarking] не имеет смысла.   -  person Peter Cordes    schedule 27.10.2018
comment
Вы говорите, что вам нужна теоретическая максимальная пропускная способность, что означает не контрольный показатель, а скорее чтение параметров DRAM и скорости шины и простое умножение полученной пропускной способности (вероятно, поиск количества каналов памяти на основе модели ЦП). Если вам нужен контрольный показатель, STREAM является фактическим стандартом. Различные пакеты тестов предлагают свои собственные тесты пропускной способности памяти. TinyMemBench — еще один.   -  person BeeOnRope    schedule 28.10.2018
comment
@BeeOnRope: я понимаю, что ты имеешь в виду. Я опускаю тег [benchmarking].   -  person einpoklum    schedule 28.10.2018
comment
@einpoklum - тогда, чтобы было ясно, вы хотите рассчитать это теоретическое значение на основе характеристик оборудования, таких как частота ОЗУ и количество каналов памяти, а не измерить его?   -  person BeeOnRope    schedule 03.11.2018
comment
@BeeOnRope: Да, извините за неясность.   -  person einpoklum    schedule 03.11.2018


Ответы (2)


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

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

person Bhanu Shankar    schedule 26.10.2018
comment
Хотя я ценю ссылку, я искал ответ, в котором используются двоичные файлы, уже доступные в большинстве систем, а не то, что мне нужно загрузить и собрать (что в некоторых случаях у меня нет возможности сделать). - person einpoklum; 26.10.2018

Я не знаю ни одного отдельного инструмента, который бы это делал, но только для чипов Intel, если вы знаете «URL-адрес ARK» для чипа, вы можете получить максимальную пропускную способность, используя комбинацию инструментов для запроса 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% или более.

person BeeOnRope    schedule 03.11.2018