1

У меня есть сервер 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 MiB/sec).

1 ответ1

3

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .