LINUX.ORG.RU

Как поиметь FS в RAM без рута и свапа

 ,


0

2

Собственно дилемма:

  • tmpfs/ramfs требуют рута для монтирования раздела
  • /dev/shm не гарантирует что файл не попадёт в свап

Задачка пихать в рам большой файл (>2Гб) на железке с малым объемом ram (<4Гб).
Файл постоянно меняется и свапить его не надо от слова совсем ибо у железки тщедушный накопитель который может от этого скопытиться.
Можно как-нить маркирнуть папку в shm чтоб не свапилась?

п.с. вариант заранее забить раздел в фстаб понятен, но хотелось бы иметь возможность менять размер и кол-во разделов на лету, что без рута с тмпфс один фиг не получится но отлично работает с shm

★★★★

они требуют рута, но ты можешь установить маску mode=777 чтобы дать права на запись всем (или задать владельца uid/gid).

собственно, у /tmp по-умолчанию стоит mode=777, и сейчас /tmp по-умолчанию монтируют в tmpfs в дистрибутивах. за редким исключением.

используй /tmp, только перемонтируй mount -o remount,size=90% /tmp чтобы побольше места выделить под файлО.

Spoofing ★★★★★
()
Ответ на: комментарий от hakavlad

Получается ramfs единственный не свапящийся вариант?

rukez ★★★★
() автор топика

менять размер

ramfs же, как и tmpfs, не резервирует память, вроде, так что можно указать максимум. Путаешь с ramdisk, наверно.

количество

смысл?

boowai ★★★★
()
Последнее исправление: boowai (всего исправлений: 2)
Ответ на: комментарий от boowai

ramfs же, как и tmpfs, не резервирует память, вроде, так что можно указать максимум.

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

смысл?

была идея разделить ФСы для разных процессов, что-б если один упёрлся в свой лимит, то не рушились бы остальные, но если лимит не выставить то смысла нет

rukez ★★★★
() автор топика
Ответ на: комментарий от BityjPixel

Может проще свап вообще отключить?

нюанс в том что озу остаётся мало (около гига в целом из которых пол гига свободных) и любое нештатное поведение ОСи/других процессов, которые могут возжелать занять эти последние пол гига, тогда положит ОСь, а со свапом оно хотя-бы сможет запротоколировать печальку

rukez ★★★★
() автор топика

А можно для этого файла запретить свап через mlock()?

pathfinder ★★★★
()
Ответ на: комментарий от boowai

Устанавливай сколько хочешь, вроде.

Если я правильно понял, то ramfs игнорит указанный максимум и тупо растёт пока в неё кладут

Для ограничения квоты ФС или cgroups не задействовать?

Хотелось как проще :-)
По итогам Пришлось в процесс вкинуть контроль темпа роста файла - это правильней но на уровне фс было бы шустрее

rukez ★★★★
() автор топика
Ответ на: комментарий от rukez

Если я правильно понял, то ramfs игнорит указанный максимум и тупо растёт пока в неё кладут

Да, оказывается.

A ramfs derivative called tmpfs was created to add size limits, and the ability to write the data to swap space.

none on /tmp/ramfs type ramfs (rw,nosuid,nodev,noexec,relatime)
tmpfs on /tmp/tmpfs type tmpfs (rw,nosuid,nodev,noexec,relatime,size=1024k)

Остается zram с ФС и discard, или самописные на fuse.

boowai ★★★★
()
Ответ на: комментарий от anonymous

Владимир - гугла?

Почему? В моих постах нет: грязи, переходов на личности …

Владимир

anonymous
()

ну так если <4ГБ рамы, а файл >2Гб - то ramfs может быть всего (2..4) Гб, пускай 3, 1 системе.

от sudoers NOPASSWD, монтируем 3ГБ в ram

/usr/bin/sudo /bin/mount -t ramfs -o size=3G ramfs /mnt/ramfs

и забываем.

Сам так sqlite храню, на диск раз в час sqldiff-ом вожу –transaction … скорости космичные, никакой redis не впился.. и не nosql, кастрированный, с их get/put/ивсё, а полноценный sql, любые GROUP BY, любые SELECT… бомба, ноу-хау! бери, дарю.

anonymous
()
Ответ на: комментарий от anonymous

Сам так sqlite храню

Но ведь sqlite уже встроена в Питон …

Владимир

anonymous
()
Ответ на: комментарий от anonymous

монтируем 3ГБ в ram и забываем.

а теперь попробуй закинуть туда 5Гб файл и удивись что он влезет не поперхнувшись :-)

бомба, ноу-хау! бери, дарю.

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

rukez ★★★★
() автор топика
Ответ на: комментарий от boowai

Остается zram с ФС и discard, или самописные на fuse.

приручил в итоге ramfs, в целом хорошо, один раз правда самопроизвольно оно как-то выпихнуло основной процесс из озу где-то на 20ом часу работы, при условии что ничто никуда не росло и было свободное место и в озу и в свопе … как расследовать не очевидно акромя разве что держать под отладкой сутки-другие

rukez ★★★★
() автор топика
Ответ на: комментарий от rukez

выпихнуло основной процесс из озу

memory.swap.max=0, cgroup2

anonymous
()
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <unistd.h>

#define SIZE (1 << 10)

int main() {
  int fd;
  void *ptr;

  fd = memfd_create("foo", 0);
  if (fd == -1) {
    perror("memfd_create");
    abort();
  }
  ftruncate(fd, SIZE);
  ptr = mmap(NULL, 1 << 30, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
  if (ptr == (void *) -1) {
    perror("mmap");
    abort();
  }
  if (mlock(ptr, SIZE) == -1) {
    perror("mlock");
    abort();
  }
  printf("/proc/%d/fd/%d\n", getpid(), fd);
  sleep(86400); /* в это время можно использовать файл по тому пути, что мы напечатали */
  return 0;
}
kmeaw ★★★
()
Ответ на: комментарий от rukez

если лимит не выставить

Ну, так выставь лимит на память.

man ulimit

LamerOk ★★★★★
()
Ответ на: комментарий от rukez

берешь свою базу в 3Гб, один раз вычитываешь её целиком но не файлом в озу а сразу в объекты

а теперь ты свой объект - раздай ка ещё 2-ум демоман: парсеру и кравлеру какому-нибудь, а сверху, что б апач без скуля строил тебе 100500 таблиц без GROUP BY по всем clients/customers/users, что бы хоть что то видеть, что в базе творится.

И графички, куда ж без них!

  • ой, а как ты будешь highchart цеплять? - опять все 3Гб вычитывать в ОЗУ, что б с-агрегировать с них high/low по timestamp-у? удачи, йопт!

так програмно и следи за размером базы, нахрена ты лъёшь туда 5Гб, ты ж знаешь что всего 3.

os.stat( ‘/path/to/ram_fs/sqlite.db’ ).st_size

если сайз - больше 3 * 1024 * 1024 * 1024 - то наверно break; и logger.critical( "ahtung, no enough memory" )

anonymous
()
Ответ на: комментарий от anonymous

а теперь ты свой объект - раздай ка ещё 2-ум демоман: парсеру и кравлеру какому-нибудь

а зачем всем полный объект? клиенты просят либо нужный сегмент времени либо дельту с последнего опроса, по хорошему сервер должен дельту сам им кидать но у меня есть не самые умелые интеграторы, которые в такое не осилят

так програмно и следи за размером базы, нахрена ты лъёшь туда 5Гб, ты ж знаешь что всего 3.

в данном случае файл создаёт сторонний сервис в не шибко управляемом потоке, если бы была возможность сгребать эти данные самому, то проблем бы не было :-)

rukez ★★★★
() автор топика
Ответ на: комментарий от rukez

а зачем всем полный объект? клиенты просят либо нужный сегмент времени либо дельту с последнего опроса,

Либо это 100500 разных таблиц по групингу, вокруг всех подряд параметров.

И ты - либо сам будешь все эти агрегаторы внутри своей демонюки рисовать, 3-тыщщи раз упав с велосипеда, либо на каждую таблицу - выделяешь одну строчку sql-запроса…

Поверь мне, быстрее и короче чем sql, ни какой python, ни какой c++ тебе дату не сгребёт с 3Гб… это как бы, промышленный стандарт, если ты не вкурсах…

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.