Скорость записи tmpfs в Linux ниже скорости ОЗУ

902
atreyu

У меня есть сервер HPE ProLiant DL360 Gen9, технические характеристики:

  • Процессор: процессоры Intel Xeon 2 E5-2687 Вт v3 @ 3,10 ГГц, 25 МБ кэш-памяти L3, 10 ядер ea
  • Оперативная память: 8x 32 ГБ PC4-17000 DDR4 2133 МГц CAS-15 1,2 В SDRAM DIMM (всего 256 ГБ)

(полная спецификация сервера здесь )

Сервер работает CentOS 7.2с ядром 3.10.0-327.36.3.el7.x86_64.

Я смонтировал ramdisk tmpfs на сервере, используя следующую запись в /etc/fstab:

tmpfs /ramdisk tmpfs noauto,user 0 0 

Чтобы проверить запись на этот виртуальный диск, я запустил следующую команду:

time sh -c "dd if=/dev/zero of=/ramdisk/120GB_testfile bs=4k count=30000000 && sync" 

Он сообщает, что записал 122 880 000 000 байтов за 58 857 с, что составляет скорость записи 1991 МБ / с.

Учитывая, что скорость записи этой памяти составляет 17 ГБ / с (согласно этому описанию скоростей передачи данных в памяти), меня удивляет значительно более низкая скорость записи на мой ramdisk tmpfs. Может кто-нибудь объяснить несоответствие и предложить другой способ записи в файл в памяти, который быстрее?

Благодарю.

ОБНОВИТЬ

Я отключил vm.swappiness, но это не принесло пользы (1712 МБ / с).

Я также попытался увеличить размер блока ( bs=256k count=468750), но, опять же, не так много эффекта (2087 МБ / с).

1
Что, если вы увеличите размер блока (при уменьшении количества)? Tmpfs поддерживается подкачкой памяти, насколько вы уверены, что ваши данные не выгружаются и таким образом замедляются? Вы установили `vm.swappiness` в 0 или 1? Mokubai 6 лет назад 1
@Mokubai, swappiness было установлено по умолчанию (60). Я думал, что избегаю обмена, сделав файл достаточно маленьким, чтобы он полностью помещался в оперативной памяти. Я попытаюсь отключить swappiness и обновлю свой пост с этими результатами. Благодарю. atreyu 6 лет назад 0
Повторная запись в tmpfs (например, ваш тест) приводит к разным скоростям для меня, обычно увеличивающимся, но я использую меньшие размеры, поэтому не уверен, что в этом причина, я предполагаю, что это может быть из-за освобождения памяти для tmpfs. Есть ли какие-либо изменения при запуске одного и того же теста несколько раз подряд? Или используя ramfs? (К вашему сведению, ramfs должен * действительно * оставаться в памяти и быть более точным "ramdisk", но не имеет ограничения по размеру iirc, так что следите) Xen2050 6 лет назад 0

1 ответ на вопрос

3
Austin Hemmelgarn

Когда вы используете файловую систему в памяти, происходит нечто большее, чем просто помещать данные в ОЗУ. Вам по-прежнему приходится обрабатывать структуры данных, связанные с файлом, включая отслеживание того, где в памяти находятся все выделенные ему ресурсы. Запись этой информации также занимает много времени (в частности, для тестирования, которое вы проводите, размер файла обновляется при каждой записи, что сразу удваивает количество мест, в которых данные изменяются в памяти).

Кроме того, выделение памяти очень медленно. На самом деле, это одна из самых медленных вещей, которые вы можете сделать в большинстве систем, не требующих ввода-вывода, с единственной значительно более медленной вещью - созданием нового потока или процесса. Такие инструменты, как ramspeedпредварительное выделение всей памяти, которую они будут использовать при запуске, позволяют проверить фактическую производительность памяти. Для сравнения, tmpfs не имеет ни малейшего представления о том, насколько большой файл вы собираетесь создавать, поэтому он должен распределять все по требованию и делает это кусками не больше, чем ddразмер блока (я думаю, что он ограничен 64 КБ, но Я не уверен). Из-за этого у вас есть издержки в каждом блоке для выделения памяти для хранения этого блока.

Как вы думаете, копирование файла может быть быстрее, так как он знает, насколько большим будет файл, а dd - нет? Или как измерить скорость `cp`, или даже создать файл фиксированного размера из чего-то вроде / dev / zero, не имея уже другого файла в tmpfs / ramfs для копирования (замедляя тест, добавляя чтение)? Xen2050 6 лет назад 0
По своей сути `cp` и` dd` делают одно и то же: они читают данные из источника и затем записывают их в место назначения. `cp` обычно немного быстрее, но это потому, что он автоматически определяет оптимальные размеры блоков для работы. `cp` также может быть значительно быстрее в некоторых особых случаях, поскольку он может использовать различные механизмы копирования-выгрузки (например, ссылки на файловые системы, которые его поддерживают, или команду SCSI XCOPY на оборудовании, которое его поддерживает). Austin Hemmelgarn 6 лет назад 0

Похожие вопросы