Архитектура мышления

Код жизни

Previous Entry Add to Memories Share Next Entry
Как настроить RAM Disk на Linux (RAM-диск) или как я выполнил 4 часовой запрос за 3 минуты.
kto? ja???
w32blaster
RAM


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



Такое выделение оперативной памити называется РАМ-диск (RAM Disk). Смысл в том, что нужно создать папку и замаунтить её на РАМ c типом tmpfs. Таким образом, у нас в системе будет обычная папка и для вашей программы или скрипта она ничем не будет отличаться от всех остальных директорий. Но на самом деле, она находится в РАМ, а не на жёстком диске, поэтому все операции доступа к данным происходят в разы быстрее. Делается это просто:

Создаём временную папку, даём ей необходимые права
# mkdir /tmp/ramdisk
# chmod 777 /tmp/ramdisk


Ну и делаем маунт этой директории с типом tmpfs:
# mount -t tmpfs -o size=256M tmpfs /tmp/ramdisk/


Всё. Теперь наш скрипт должен писать всё именно в эту папку, после чего не забываем скопировать полученный результат в какое-то другое место (после перезагрузки компьютера содержимое этой папки подчистится). Потом не забыть удалить:
# umount -v /tmp/ramdisk
# rm -r -f /tmp/ramdisk


Но нужно ещё помнить, что если ваша программа заберёт больше памяти, чем вы выделили для РАМ-диска, то ось полезет в Свап за свободным местом, а тогда производительность упадёт в разы и толку от РАМ-диска не будет никакого. Так что перед запуском стоит очистить память и проверить, сколько доступно место на данный момент:
# free -m


Практика.
А теперь немного циферок из моего личного примера. Вобщем, был у меня один скриптик, который строил базу данных. Данных было много и я боролся за каждый мегабайт. Чтобы избежать дублирования данных, мне приходилось делать многго запросов и проверок перед каждым добавлением новой строчки. Итого, работа этого скрипта выполнялась очень долго - 5 дней. Не гоже так долго скрипту работать, поэтому я долгое время трудился над оптимизацией. Введение в код транзакций заметно улучшило ситуацию - скрипт стал выполняться 4 часа. Гораздо лучше. Перед запуском я удалял из системы все ненужные сервисы, в том числе графический интерфейс Гнома, давал демону самый высокий приоритет, но 4 часа был мой самый лучший результат. Пока один хороший друг Женя не рассказал мне про РАМ-диск. Я полез в маны чтобы почитать, что за зверь такой. Потом внедрил этот вирутальный диск к себе в скрипт, снова запустил систему и мой скрипт сделал всю работу за.... за 3 минуты! Просто каждый запрос к базе сопровождался обращением к жёсткому диску, что означало повышенную нагрузку на него. Как только этот файл оказывался в РАМе, то все те же операции стали выполняться гораздо быстрее.

Спасибо Жеке и манам.

Пыс-пыс: забыл сказать, что всё вышеописанное относится к Линуксу ))))

очень странно что у вас база в кеше не оказывалась.
может просто нужно дать побольше памяти mysql?

Не, я просто не MySQL испольную :) Мне по некоторым причинам необходимо использовать SQlite.

а sqlite сама ось должна была в кеш запихать. чтото странно с системой

You are viewing w32blaster