Создание оперативного диска в Linux


70

У меня есть машина с 62 ГБ ОЗУ и транк, который составляет всего 7 ГБ, поэтому я решил создать RAM-диск и скомпилировать его. Я не эксперт по Linux. Я нашел в интернете инструкции по созданию RAM-диска:

mkfs -q /dev/ram1 8192

но я изменил 8192 на 16777216 в попытке выделить 16 ГБ оперативной памяти.

Я получил следующую ошибку:

mkfs.ext2: Filesystem larger than apparent device size.
Proceed anyway? (y,n) 

В этот момент меня напугали и отпустили.

sudo dmidecode --type 17 | grep Size

шоу

8x8192MB + 2048MB = 67584 MB

но duна /devдает 804K.

Это проблема? Могу ли я преодолеть этот /devразмер?


15
Ты пробовал tmpfs? Это файловая система в оперативной памяти, нет необходимости в ext2. mount -o size=16G -t tmpfs none /mnt/tmpfs
t-8ch

Это сработало! Спасибо! Но пока что не так много ускорения: я думаю, что инструменты, которые я использую для сборки, все еще используют обычный диск. Я положу больше материала на диск памяти.
Фрэнк

3
Размещение самих инструментов на виртуальном диске не должно иметь большого значения, так как ядро ​​все равно их кеширует в ram.
t-8ch

1
@goldilocks Это неподтвержденная информация, но при компиляции наших Java-проектов с помощью Maven при использовании виртуального диска происходит значительное ускорение. Я думаю, однако, что это больше из-за времени поиска, чем время чтения.
SpellingD

1
/ dev / shm, фактически / run / shm , можно использовать; это почти всегда там.
Камиль Гудесюн

Ответы:


78

Лучший способ создать RAM-диск в Linux - это tmpfs. Это файловая система, живущая в ram, поэтому нет необходимости в ext2. Вы можете создать tmpfs размером 16 Гб с помощью:

mount -o size=16G -t tmpfs none /mnt/tmpfs

2
в моей системе, где ничего нет в / mnt, он говорит: ls: не может получить доступ к / mnt / tmpfs: такого монтирования файла или каталога: точка монтирования / mnt / tmpfs не существует. Это то, что беспокоиться? Если я просто использую mkdir / mnt / tmpfs, то это побеждает цель (создавая tmpfs на обычном диске - пожалуйста, не пламя, я новичок здесь).
Фрэнк

9
Вам нужна точка монтирования (каталог) в качестве цели, поэтому после того, как вы создали этот каталог (вы можете использовать любой каталог, существующее содержимое будет затенено), вы можете смонтировать его с помощью команды из ответа.
t-8ch

1
tmpfsможет использовать своп, который вам, вероятно, не нужен на чистом RAM-диске.
Palswim

2
@RomanSusi tmpfs - это тип файла (передается после -t). «none» - это устройство поддержки («диск»), которое не существует для tmpfs
t-8ch

1
Возможно, стоит отметить, что указание размера не является обязательным. По умолчанию используется половина ОЗУ. Нет никаких дополнительных затрат на указание большего размера, все, что он делает, это устанавливает ограничение, чтобы защитить себя от случайного использования всей вашей оперативной памяти и уничтожения системы.
sourcejedi

20

Linux очень эффективно использует оперативную память. Нет ничего удивительного в том, что вы видите небольшое ускорение tmpfs. Самыми большими частями для чтения в память (и, следовательно, способными замедлить процесс) являются инструменты (компилятор, ассемблер, компоновщик), и если makeдолго они будут загружены в память при запуске и никогда не покинут ее. Осталось только чтение в источнике (запись результатов не замедлит вас, если только не будет сильно ограничена память). Опять же, заголовочные файлы comon останутся рядом, только источник пользователя потребует чтения. И это вряд ли будет больше, чем несколько мегабайт. Создание большого RAM-диска (или даже его интенсивное использование tmpfs) может очень сильно замедлить работу (из-за ограничения памяти сборки файлы на RAM-диске или tmpfs не могут этого сделать использоваться непосредственно оттуда).


1
Какая! Как их нельзя использовать прямо оттуда?
Казарк,

Они находятся в оперативной памяти, но не в формате, который можно использовать напрямую.
vonbrand

2
В самом деле! Как так? (Прошу прощения за мою медлительность.)
Казарк

8
@Kazark, для обработки исполняемых файлов в памяти используются специальные структуры данных. Поскольку RAM-диски tmpfsне используются для хранения исполняемых файлов (RAM-диски являются пережитком старых добрых времен мучительно медленных дискет и т. Д., tmpfsДля жестких временных данных), никто не посчитал достаточно важным добавить необходимые уродливые хаки.
vonbrand

7
Я попытался запустить мой код rails из файловой системы tmpfs (RAM), и я не увидел никакой разницы вообще. Я действительно надеялся на заметную разницу, но был разочарован тем, насколько классным является Linux.
Хаджа Минхаджуддин

6

Проблема заключается в том, что максимальный размер виртуального диска, в частности размер памяти, к которому можно получить доступ через драйвер виртуального диска, настраивается во время компиляции, может быть перезаписан во время загрузки, но остается фиксированным после загрузки ядра в память. Значение по умолчанию, вероятно, измеряется в мегабайтах. Если я правильно помню, память для RAM-диска зарезервирована прямо при загрузке драйвера, все RAM-диски имеют одинаковый размер, и по умолчанию существует около 16 RAM-дисков. Так что даже вы не хотите размер виртуального диска 16G :-)

Как указано в другом ответе, tmpfs - это то, что вы хотите использовать. Кроме того, вы не выиграете много, имея всю свою ОС в ramdisk / tmpfs. Просто скопируйте ваш builddir в tmpfs и выполните сборку. Возможно, вам придется убедиться, что все временные результаты также записаны в место, которое находится в tmpfs.


Они на самом деле не используют память, пока вы не напишите им. Ограничение времени загрузки - это только предел. Даже после заполнения вы можете освободить память с помощью blockdev --flushbufs.
psusi

@psusi: можете ли вы дать нам больше информации об этом? Я могу только найти утверждения, в которых упоминается, что однажды заявленная память RAM-диска никогда не восстанавливается, например, Documentation/blockdev/ramdisk.txtв исходных текстах ядра. И на мой ответ: в этом файле также говорится, что виртуальный диск увеличивается по мере использования памяти, поэтому он распределяется не все сразу.
Bananguin

Какого рода информация? Вы запускаете команду, и она освобождает оперативную память, если вы все равно не смонтировали ее.
psusi

Откуда вы знаете, что команда делает то, что вы говорите, она делает? Его man-страница не подтверждает это, и можно понять, что документация в дереве исходных текстов ядра противоречит вашей информации.
Bananguin

6
Я прочитал исходный код и проверил его, попробовав.
psusi

3

Чтобы создать большой RAM-диск после загрузки, без каких-либо проблем с параметрами ядра, это похоже на работу. Используйте tmpfs, создайте файл, смонтируйте его через цикл и смонтируйте его через файловую систему:

mount -t tmpfs -o size=200M tmpfs temp/
cd temp/
dd if=/dev/zero of=disk.img bs=1M count=199
losetup /dev/loop0 disk.img
mkfs.ext4 /dev/loop0
mount /dev/loop0 temp2/

Вероятно, небольшая потеря производительности проходит через несколько разных слоев ... но, по крайней мере, это работает.


3

Помимо tmpfsи ramfsеще один вариант является /dev/ram0блочным устройством. В последних версиях Ubuntu это устройство не существует по умолчанию, но его можно создать с помощью modprobe brd.

Этот подход более предсказуем, поскольку он создает настоящую ext4файловую систему и никогда не превышает заданный вами предел. Но это требует больше шагов для настройки и использует ОЗУ менее эффективно.

Использование модуля ядра brd (/ dev / ram0)

Чтобы создать и инициализировать 4 ГБ ОЗУ:

mkdir /ramdisk

modprobe brd rd_nr=1 rd_size=$((4 * 1048576))
mkfs.ext4 /dev/ram0
mount /dev/ram0 /ramdisk

rd_nrПараметр определяет , сколько дисков RAM для создания (по умолчанию он создает 16, т.е. /dev/ram0через /dev/ram15). rd_sizeПараметр размер в килобайтах . $(( ... ))Синтаксис позволяет выполнять арифметические действия в оболочке.

Чтобы освободить RAM-диск, размонтируйте его и удалите brdмодуль ядра:

umount /ramdisk
modprobe -r brd

Создание блочного устройства внутри ramfs

Кроме того, вы можете создать блочное устройство внутри ramfs:

mkdir /ramdisk-storage /ramdisk
mount -t ramfs ramfs /ramdisk-storage

truncate -s 4G /ramdisk-storage/ramdisk.img
mkfs.ext4 /ramdisk-storage/ramdisk.img
mount /ramdisk-storage/ramdisk.img /ramdisk

Команда truncateсоздает пустой файл заданного размера, так что он инициализируется (то есть потребляет память) по требованию.

Чтобы освободить RAM-диск, размонтируйте его и удалите образ диска:

umount /ramdisk
rm /ramdisk-storage/ramdisk.img

Сравнение с tmpfsиramfs

Хотя tmpfsи ramfsболее эффективны, чем использование блочных устройств, ниже приведены некоторые их недостатки.

tmpfsможет поменяться на диск. Это более эффективно, но могут быть случаи, когда вам нужен чистый RAM-диск:

  • Файлы, с которыми вы работаете, являются конфиденциальными (например, файлы из зашифрованного раздела).
  • Вы проводите тестирование производительности и не хотите, чтобы дисковый ввод-вывод был фактором (время записи SSD может сильно различаться).
  • Вы распаковываете большой файл и не хотите изнашивать свой SSD.

ramfsпрост в настройке, освобождает пространство после удаления файлов и более эффективно использует оперативную память (система не буферизует файлы, потому что она знает, что они находятся в оперативной памяти). Но у него есть свои недостатки и сюрпризы:

  • dfУтилита не сообщает использование пространства:

    root@cello-linux:~# df -h /ramdisk
    Filesystem      Size  Used Avail Use% Mounted on
    ramfs              0     0     0    - /ramdisk
    
  • Параметр ограничения размера отсутствует. Если вы добавите слишком много в виртуальный диск, ваша система будет зависать.

  • Разреженные файлы могут стать разрозненными, когда вы меньше всего этого ожидаете. Этим утром я скопировал образ виртуальной машины ( ramfs150 ГБ, но 49 ГБ на диске) в (у меня 128 ГБ ОЗУ). Это сработало. Но когда я скопировал из пункта ramfsназначения, моя система перестала отвечать на запросы. cpУтилита , по- видимому заполнены отверстия на чтение , но не писать.

И то, tmpfsи другое ramfsможет вести себя иначе, чем настоящая ext4файловая система. Создание блочного устройства в ОЗУ и его инициализация ext4позволяют избежать этого.

Для более глубокого сравнения: https://www.kernel.org/doc/Documentation/filesystems/ramfs-rootfs-initramfs.txt


1

ОП объем оперативной памяти выражается в МБ. Так что все, что вам нужно для этого - это 16384. И тогда, вуаля, вы будете в бизнесе.


1
Нет. «Если fs-size не имеет суффикса, он интерпретируется как степень двух килобайт». - мужчинаmkfs.ext2
sourcejedi

1

Вы можете смонтировать ramfsфайловую систему, скопировать в нее свой проект и работать оттуда. Это гарантирует, что ваши входные файлы загружены в ОЗУ, и они не будут перечитываться с гораздо более медленного диска. Однако, как вы обнаружили, это, как правило, не полезная стратегия. Вы уже получаете точно такую ​​же выгоду.

Ramfs - это очень простая файловая система, которая экспортирует механизмы кэширования диска Linux (кеш страниц и кэш-память) в виде динамически изменяемой файловой системы на основе ОЗУ.

- https://github.com/torvalds/linux/blob/v4.18/Documentation/filesystems/ramfs-rootfs-initramfs.txt

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

Не существует искусственного ограничения на объем кеширования, продолжительность его кеширования и т. Д. Кэши начинают сбрасываться только после заполнения ОЗУ. Какой кеш удаляется первым, выбирают ужасно разработанные алгоритмы. Первое приближение, мы описываем это как Наименее недавно использованный. См. Какие алгоритмы замены страниц используются в ядре Linux для кеширования файлов ОС?

Обратите внимание, что ваш текстовый редактор будет явно fsync()сохранять файлы на диск.

Если вы запускаете тесты программы, которая включает в себя fsync(), их запуск в файловой системе ramfsможет ускорить их. Другая стратегия - попытаться отключить fsync()с помощью eatmydata/ nosync.so.

Некоторые другие операционные системы могут иметь определенные ограничения, которые можно обойти с помощью виртуального диска. С одной стороны, отсутствие какого- либо кэширования файлов является причиной того, что ram-диски были популярны в DOS .

TMPFS

tmpfsработает так же, как ramfs, за исключением того, что он может использовать пространство подкачки, если у вас есть. Т.е., если вам нужна оперативная память для чего-то другого, алгоритмы наименьшего числа недавно использовавшихся ресурсов могут выбирать блоки данных из tmpfs и выгружать их на диск.

Большинство людей придерживаются tmpfs, потому что это также позволяет вам ограничить общий размер, и показывает пространство, используемое правильно, например, в dfкоманде. Я не уверен, почему эта разница существует. Ограничение размера tmpfsзащищает вас от случайного заполнения всей оперативной памяти и, в основном, от гибели вашей системы. По умолчанию используется половина вашей оперативной памяти.

Другие причины, почему записи могут замедляться

Выше приведено упрощение с учетом вашего случая. Записи в файлы в вашем случае не должны ждать диска. Однако есть несколько случаев, когда это делается. См. Отличный пост в блоге. Почему буферизованные записи иногда замирают . Самым удивительным случаем является недавнее изменение Linux под названием «стабильная запись страницы».

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.