Русские Блоги
/ Dev / shm / — очень полезный каталог в linux, потому что этот каталог находится не на жестком диске, а в памяти. Поэтому в Linux нет необходимости тратить много усилий на создание виртуального диска, непосредственное использование / dev / shm / может обеспечить очень хороший эффект оптимизации. / dev / shm / Следует обратить внимание на проблему с пропускной способностью: в Linux по умолчанию она составляет не более половины размера памяти, что можно увидеть с помощью команды df -h. Но он на самом деле не занимает эту память. Если в каталоге / dev / shm / нет файла, то занимаемая им память фактически равна 0 байтам, если это максимум 1 ГБ и в нем 100 МБ файлов, остальные 900 МБ. Он по-прежнему может использоваться другими приложениями, но занимаемая им память 100 МБ никогда не будет перераспределена системой. В противном случае, кто осмелится сохранить файлы?
По умолчанию система будет загружать / dev / shm, которая является так называемой tmpfs (система виртуальной памяти). Некоторые люди говорят, что она отличается от ramdisk (виртуальный диск). Как и виртуальный диск, tmpfs может использовать вашу оперативную память, но он также может использовать ваш раздел подкачки для хранения. А традиционный виртуальный диск — это блочное устройство, и для его использования требуется команда типа mkfs. Tmpfs — это файловая система, а не блочное устройство, вы просто устанавливаете его, и его можно использовать. Самая большая особенность tmpfs заключается в том, что его пространство хранения находится в виртуальной памяти (VM), которая управляется подсистемой vm внутри ядра linux , Размер виртуальной машины под Linux состоит из RM (реальной памяти) и подкачки. Размер RM — это размер физической памяти, а размер подкачки определяется вами. Swap — это пространство памяти, виртуализированное жестким диском, поэтому скорость чтения и записи намного ниже, чем RM (реальная память), Когда процесс запрашивает определенный объем памяти, например, когда подсистема vm ядра обнаруживает, что RM недостаточно, он будет обмениваться некоторыми редко используемыми данными в RM в Swap. Если вам нужно повторно использовать эти данные, перенесите их из Swap Обмен на РМ.
Виртуальная машина состоит из двух частей: RM + Swap, поэтому максимальное пространство хранения tmpfs не превышает (размер RM + размер Swap). Но для самой tmpfs он не знает, является ли используемое им пространство RM или Swap, и все они управляются подсистемой vm ядра. Размер tmpfs по умолчанию равен половине RM. Если ваша физическая память равна 1024M, то размер tmpfs по умолчанию составляет 512M. В нормальных условиях он настроен на размер меньше физической памяти. Размер конфигурации tmpfs на самом деле не занимает эту память.Если в каталоге / dev / shm / нет файла, то занимаемая им память фактически равна 0 байтам, если это максимум 1 ГБ, в нем содержится 100 МБ файлов, а остальные 900M все еще может использоваться другими приложениями, но занимаемая им память 100M не будет разделяться системой. При удалении файлов в tmpfs драйвер файловой системы tmpfs динамически сокращает файловую систему и освобождает ресурсы виртуальной машины.
У tmpfs есть следующие преимущества:
1. Размер динамической файловой системы.
2. Еще одним важным преимуществом tmpfs является его молниеносная скорость. Поскольку типичная файловая система tmpfs полностью находится в оперативной памяти, чтение и запись могут быть практически мгновенными.
3. Данные tmpfs не будут сохранены после перезапуска, поскольку виртуальная память по своей природе является энергозависимой. Поэтому необходимо сделать несколько сценариев для выполнения таких операций, как загрузка и привязка.
Во-вторых, измените размер / dev / shm
Максимальная половина размера памяти по умолчанию может быть недостаточной в некоторых случаях, и число inode по умолчанию, как правило, невелико. Как правило, вам нужно увеличить его. Вы можете использовать команду mount для управления им.
На машине 2G максимальная емкость устанавливается на 1,5 ГБ, а число инодов — на 1000000, что означает, что можно хранить до миллиона небольших файлов.
Если вам нужно постоянно изменять значение / dev / shm, вам нужно изменить / etc / fstab
Примечание. Используйте команду df -h для просмотра результатов.
Три, / dev / shm приложение
Сначала создайте папку tmp в / dev / shm, а затем свяжите ее с фактическим / tmp
После использования команды mount —bind olddir newerdir для монтирования каталога в другой каталог вся информация, такая как разрешения и владелец newerdir, изменится. Подключенный каталог наследует все атрибуты подключенного каталога, кроме имени. В режиме управления памятью amm в Oracle 11g используется / dev / shm, поэтому иногда изменение MEMORY_TARGET или MEMORY_MAX_TARGET приводит к ошибке ORA-00845.
Знакомство с межпроцессным взаимодействием на Linux
Межпроцессное взаимодействие (Inter-process communication (IPC)) — это набор методов для обмена данными между потоками процессов. Процессы могут быть запущены как на одном и том же компьютере, так и на разных, соединенных сетью. IPC бывают нескольких типов: «сигнал», «сокет», «семафор», «файл», «сообщение»…
Отступление: данная статья является учебной и расчитана на людей, только еще вступающих на путь системного программирования. Ее главный замысел — познакомиться с различными способами взаимодействия между процессами на POSIX-совместимой ОС.
Именованный канал
Для передачи сообщений можно использовать механизмы сокетов, каналов, D-bus и другие технологии. Про сокеты на каждом углу можно почитать, а про D-bus отдельную статью написать. Поэтому я решил остановиться на малоозвученных технологиях отвечающих стандартам POSIX и привести рабочие примеры.
Рассмотрим передачу сообщений по именованным каналам. Схематично передача выглядит так:
Для создания именованных каналов будем использовать функцию, mkfifo():
Примечание: mode используется в сочетании с текущим значением umask следующим образом: (mode &
umask). Результатом этой операции и будет новое значение umask для создаваемого нами файла. По этой причине мы используем 0777 (S_IRWXO | S_IRWXG | S_IRWXU), чтобы не затирать ни один бит текущей маски.
Как только файл создан, любой процесс может открыть этот файл для чтения или записи также, как открывает обычный файл. Однако, для корректного использования файла, необходимо открыть его одновременно двумя процессами/потоками, одним для получение данных (чтение файла), другим на передачу (запись в файл).
В случае успешного создания FIFO файла, mkfifo() возвращает 0 (нуль). В случае каких либо ошибок, функция возвращает -1 и выставляет код ошибки в переменную errno.
- EACCES — нет прав на запуск (execute) в одной из директорий в пути pathname
- EEXIST — файл pathname уже существует, даже если файл — символическая ссылка
- ENOENT — не существует какой-либо директории, упомянутой в pathname, либо является битой ссылкой
- ENOSPC — нет места для создания нового файла
- ENOTDIR — одна из директорий, упомянутых в pathname, на самом деле не является таковой
- EROFS — попытка создать FIFO файл на файловой системе «только-на-чтение»
Пример
mkfifo.c
Мы открываем файл только для чтения (O_RDONLY). И могли бы использовать O_NONBLOCK модификатор, предназначенный специально для FIFO файлов, чтобы не ждать когда с другой стороны файл откроют для записи. Но в приведенном коде такой способ неудобен.
Компилируем программу, затем запускаем ее:
В соседнем терминальном окне выполняем:
В результате мы увидим следующий вывод от программы:
Разделяемая память
Следующий тип межпроцессного взаимодействия — разделяемая память (shared memory). Схематично изобразим ее как некую именованную область в памяти, к которой обращаются одновременно два процесса:
Для выделения разделяемой памяти будем использовать POSIX функцию shm_open():
Функция возвращает файловый дескриптор, который связан с объектом памяти. Этот дескриптор в дальнейшем можно использовать другими функциями (к примеру, mmap() или mprotect()).
Целостность объекта памяти сохраняется, включая все данные связанные с ним, до тех пор пока объект не отсоединен/удален (shm_unlink()). Это означает, что любой процесс может получить доступ к нашему объекту памяти (если он знает его имя) до тех пор, пока явно в одном из процессов мы не вызовем shm_unlink().
- O_RDONLY — открыть только с правами на чтение
- O_RDWR — открыть с правами на чтение и запись
- O_CREAT — если объект уже существует, то от флага никакого эффекта. Иначе, объект создается и для него выставляются права доступа в соответствии с mode.
- O_EXCL — установка этого флага в сочетании с O_CREATE приведет к возврату функцией shm_open ошибки, если сегмент общей памяти уже существует.
После создания общего объекта памяти, мы задаем размер разделяемой памяти вызовом ftruncate(). На входе у функции файловый дескриптор нашего объекта и необходимый нам размер.
Пример
Следующий код демонстрирует создание, изменение и удаление разделяемой памяти. Так же показывается как после создания разделяемой памяти, программа выходит, но при следующем же запуске мы можем получить к ней доступ, пока не выполнен shm_unlink().
shm_open.c
После создания объекта памяти мы установили нужный нам размер shared memory вызовом ftruncate(). Затем мы получили доступ к разделяемой памяти при помощи mmap(). (Вообще говоря, даже с помощью самого вызова mmap() можно создать разделяемую память. Но отличие вызова shm_open() в том, что память будет оставаться выделенной до момента удаления или перезагрузки компьютера.)
Компилировать код на этот раз нужно с опцией -lrt:
Смотрим что получилось:
Аргумент «create» в нашей программе мы используем как для создания разделенной памяти, так и для изменения ее содержимого.
Зная имя объекта памяти, мы можем менять содержимое разделяемой памяти. Но стоит нам вызвать shm_unlink(), как память перестает быть нам доступна и shm_open() без параметра O_CREATE возвращает ошибку «No such file or directory».
Семафор
Семафор — самый часто употребляемый метод для синхронизации потоков и для контролирования одновременного доступа множеством потоков/процессов к общей памяти (к примеру, глобальной переменной). Взаимодействие между процессами в случае с семафорами заключается в том, что процессы работают с одним и тем же набором данных и корректируют свое поведение в зависимости от этих данных.
- семафор со счетчиком (counting semaphore), определяющий лимит ресурсов для процессов, получающих доступ к ним
- бинарный семафор (binary semaphore), имеющий два состояния «0» или «1» (чаще: «занят» или «не занят»)
Семафор со счетчиком
Смысл семафора со счетчиком в том, чтобы дать доступ к какому-то ресурсу только определенному количеству процессов. Остальные будут ждать в очереди, когда ресурс освободится.
Итак, для реализации семафоров будем использовать POSIX функцию sem_open():
В функцию для создания семафора мы передаем имя семафора, построенное по определенным правилам и управляющие флаги. Таким образом у нас получится именованный семафор.
Имя семафора строится следующим образом: в начале идет символ «/» (косая черта), а следом латинские символы. Символ «косая черта» при этом больше не должен применяться. Длина имени семафора может быть вплоть до 251 знака.
Если нам необходимо создать семафор, то передается управляющий флаг O_CREATE. Чтобы начать использовать уже существующий семафор, то oflag равняется нулю. Если вместе с флагом O_CREATE передать флаг O_EXCL, то функция sem_open() вернет ошибку, в случае если семафор с указанным именем уже существует.
Параметр mode задает права доступа таким же образом, как это объяснено в предыдущих главах. А переменной value инициализируется начальное значение семафора. Оба параметра mode и value игнорируются в случае, когда семафор с указанным именем уже существует, а sem_open() вызван вместе с флагом O_CREATE.
Для быстрого открытия существующего семафора используем конструкцию:
, где указываются только имя семафора и управляющий флаг.
Пример семафора со счетчиком
Рассмотрим пример использования семафора для синхронизации процессов. В нашем примере один процесс увеличивает значение семафора и ждет, когда второй сбросит его, чтобы продолжить дальнейшее выполнение.
sem_open.c
В одной консоли запускаем:
В соседней консоли запускаем:
Бинарный семафор
Вместо бинарного семафора, для которого так же используется функция sem_open, я рассмотрю гораздо чаще употребляемый семафор, называемый «мьютекс» (mutex).
Мьютекс по существу является тем же самым, чем является бинарный семафор (т.е. семафор с двумя состояниями: «занят» и «не занят»). Но термин «mutex» чаще используется чтобы описать схему, которая предохраняет два процесса от одновременного использования общих данных/переменных. В то время как термин «бинарный семафор» чаще употребляется для описания конструкции, которая ограничивает доступ к одному ресурсу. То есть бинарный семафор используют там, где один процесс «занимает» семафор, а другой его «освобождает». В то время как мьютекс освобождается тем же процессом/потоком, который занял его.
Без мьютекса не обойтись в написании, к примеру базы данных, к которой доступ могут иметь множество клиентов.
Для использования мьютекса необходимо вызвать функцию pthread_mutex_init():
Функция инициализирует мьютекс (перемнную mutex) аттрибутом mutexattr. Если mutexattr равен NULL, то мьютекс инициализируется значением по умолчанию. В случае успешного выполнения функции (код возрата 0), мьютекс считается инициализированным и «свободным».
- EAGAIN — недостаточно необходимых ресурсов (кроме памяти) для инициализации мьютекса
- ENOMEM — недостаточно памяти
- EPERM — нет прав для выполнения операции
- EBUSY — попытка инициализировать мьютекс, который уже был инициализирован, но не унечтожен
- EINVAL — значение mutexattr не валидно
Функция pthread_mutex_lock(), если mutex еще не занят, то занимает его, становится его обладателем и сразу же выходит. Если мьютекс занят, то блокирует дальнейшее выполнение процесса и ждет освобождения мьютекса.
Функция pthread_mutex_trylock() идентична по поведению функции pthread_mutex_lock(), с одним исключением — она не блокирует процесс, если mutex занят, а возвращает EBUSY код.
Фунция pthread_mutex_unlock() освобождает занятый мьютекс.
- EINVAL — mutex неправильно инициализирован
- EDEADLK — мьютекс уже занят текущим процессом
- EBUSY — мьютекс уже занят
- EINVAL — мьютекс неправильно инициализирован
- EINVAL — мьютекс неправильно инициализирован
- EPERM — вызывающий процесс не является обладателем мьютекса
Пример mutex
mutex.c
Данный пример демонстрирует совместный доступ двух потоков к общей переменной. Один поток (первый поток) в автоматическом режиме постоянно увеличивает переменную counter на единицу, при этом занимая эту переменную на целую секунду. Этот первый поток дает второму доступ к переменной count только на 10 миллисекунд, затем снова занимает ее на секунду. Во втором потоке предлагается ввести новое значение для переменной с терминала.
Если бы мы не использовали технологию «мьютекс», то какое значение было бы в глобальной переменной, при одновременном доступе двух потоков, нам не известно. Так же во время запуска становится очевидна разница между pthread_mutex_lock() и pthread_mutex_trylock().
Компилировать код нужно с дополнительным параметром -lpthread:
Запускаем и меняем значение переменной просто вводя новое значение в терминальном окне:
Вместо заключения
В следующих статьях я хочу рассмотреть технологии d-bus и RPC. Если есть интерес, дайте знать.
Спасибо.
UPD: Обновил 3-ю главу про семафоры. Добавил подглаву про мьютекс.
Как правильно пользоваться /dev/shm в современном линуксе?
Можно ли просто писать временные файлы в эту директорию не заморачиваясь с монтированием каких-либо ещё?
Re: Как правильно пользоваться /dev/shm в современном линуксе?
Забыл уточнить: ядро 2.6.28.
Re: Как правильно пользоваться /dev/shm в современном линуксе?
>эту директорию
В упор не вижу никаких директорий. Ты хочешь _временно_ хранить фалы в оперативке?
Re: Как правильно пользоваться /dev/shm в современном линуксе?
Вот это для ознакомления можно почитать.
Re: Как правильно пользоваться /dev/shm в современном линуксе?
> Ты хочешь _временно_ хранить фалы в оперативке?
/dev/shm это классический tmpfs
Re: Как правильно пользоваться /dev/shm в современном линуксе?
>/dev/shm это классический tmpfs
в который монтируется корневая фс при работе initramfs
Re: Как правильно пользоваться /dev/shm в современном линуксе?
я правильно её использую так:
scyld-debian:/# cat /etc/initramfs-tools/scripts/init-bottom/scyld
#!/bin/sh
PREREQ="udev"
prereqs()
echo "$PREREQ"
>
case $1 in
prereqs)
prereqs
exit 0
;;
esac
modprobe aufs
modprobe squashfs
modprobe loop
mount -o move /root/dev/ /dev/
touch /etc/mtab
mkdir /boot.scyld
mount -w -t tmpfs none /boot.scyld
mkdir /boot.scyld/mount
mount —move /root/ /boot.scyld/mount
mount -o rw,remount /boot.scyld/mount
#
#mkdir /boot.scyld/rw
#mount -t tmpfs none /boot.scyld/rw
#
mkdir /boot.scyld/ro
mknod /dev/loop0 b 7 0
mount -t squashfs -o loop /boot.scyld/mount/root.sfs /boot.scyld/ro
mount -t aufs -o br:/boot.scyld/mount/rw=rw:/boot.scyld/ro=ro none /root
mount -o move /dev /root/dev/
mkdir /root/dev/shm
mount -t tmpfs devshm /root/dev/shm
mount -o move /boot.scyld /root/dev/shm
Re: Как правильно пользоваться /dev/shm в современном линуксе?
> В упор не вижу никаких директорий.
К этой директории на достаточно новых ядрах по умолчанию подмонтирована файловая система tmpfs размером 0,5 объёма физической памяти.
> Ты хочешь _временно_ хранить фалы в оперативке?
Спасибо, но там рассказывают о ramfs по состоянию на 2001 год. Разве от неё не отказались несколько лет назад в пользу tmpfs?
Re: Как правильно пользоваться /dev/shm в современном линуксе?
>>/dev/shm это классический tmpfs
> в который монтируется корневая фс при работе initramfs
Я спрашиваю уже про нормальное функционирование системы, когда загрузка закончилась.
Re: Как правильно пользоваться /dev/shm в современном линуксе?
> Можно ли просто писать временные файлы в эту директорию не заморачиваясь
Можно, но она не для этого предназначена.
Re: Как правильно пользоваться /dev/shm в современном линуксе?
> я правильно её использую так:
Спасибо, но я спрашиваю не про загрузку, а про работу от имени непривилегированного пользователя. Который может даже не иметь права на команду mount.
Скажем, программе надо создать временный файл. Который будет нужен всего в течении нескольких секунд или минуты. И который должен быть доступен нескольким другим программам. Потом его можно со спокойной совестью удалить. Писать на жёсткий диск? Файлов таких много. Объём невелик (от десятков килобайт до нескольких мегабайт), хранить их в памяти позволяет. Желательно, чтобы программа "просто работала" на как можно большем числе компьютеров и не требовала прав рута для установки.
Имеется директория /dev/shm/ с правами drwxrwxrwt. Можно ли туда писать файлы с уникальными именами, или какие-то программы строятся из рассчёта, что /dev/shm/ пуста, и никто кроме них ею не пользуется? Можно ли ожидать, что она будет доступна на большинстве машин? Что о ней говорят основополагающие документы наподобие LSB?
Re: Как правильно пользоваться /dev/shm в современном линуксе?
> Можно, но она не для этого предназначена.
> man shm_open
Спасибо. Как осуществлять доступ к этому объекту из других программ? Просто вызывать shm_open с тем же именем? Останется ли объект существовать, после завершения породившего его процесса? Существует ли способ перенаправить ввод-вывод программы, использующей просто open() в такой объект, или для этого надо переписать программу?
Re: Как правильно пользоваться /dev/shm в современном линуксе?
Не вижу ничего, мешающего работать с shm. Я, например, при перекодировании звуковых файлов храню временные файлы там. Если оперативки гигов 8, можно вообще выделить под shm 6гигов, копировать туда образ DVD и заниматься перекодированием в avi, расположенном там же 🙂
(давно о таком мечтаю, но денег на реализацию нет 🙁 )
Re: Как правильно пользоваться /dev/shm в современном линуксе?
>> man shm_open
> Спасибо. Как осуществлять доступ к этому объекту из других программ? Просто вызывать shm_open с тем же именем? Останется ли объект существовать, после завершения породившего его процесса?
Для Линукса, ответы на все вопросы "да", но сами вопросы говорят о том, что тебе не нужен /dev/shm. Если очень хочешь tmpfs, смонтируй ее на /tmp
Re: Как правильно пользоваться /dev/shm в современном линуксе?
> сами вопросы говорят о том, что тебе не нужен /dev/shm
Тогда что мне нужно?
Re: Как правильно пользоваться /dev/shm в современном линуксе?
> Для Линукса, ответы на все вопросы "да"
Спасибо. Я правильно понял, что подмена open() невозможна?
Re: Как правильно пользоваться /dev/shm в современном линуксе?
>> сами вопросы говорят о том, что тебе не нужен /dev/shm
> Тогда что мне нужно?
По-моему, тебе нужен обычный временный файл. Типа man mktemp. Если тебе нужна семантика delete-on-close, то в Си это реализуется элементарно — открываешь файл, удаляешь его, и пользуешься полученным дескриптором. При закрытии файл будет удален.
Re: Как правильно пользоваться /dev/shm в современном линуксе?
> По-моему, тебе нужен обычный временный файл.
Насколько будет различаться время чтения из временного файла в памяти и временного файла на диске?
Re: Как правильно пользоваться /dev/shm в современном линуксе?
>Спасибо, но я спрашиваю не про загрузку, а про работу от имени непривилегированного пользователя. Который может даже не иметь права на команду mount.
если б ты читал не по диагонали, ты бы всё понял и не тупил.
Re: Как правильно пользоваться /dev/shm в современном линуксе?
> Насколько будет различаться время чтения
Померял. На полутора гигабайтах временных файлов разница в полтора-два раза.
Re: Как правильно пользоваться /dev/shm в современном линуксе?
> если б ты читал не по диагонали
Что из этого скрипта может повторить пользователь, не имеющий прав на mount и sudo? По-моему, ничего.
Что из создаваемого этим скриптом может быть полезно пользователю, не имеющему прав на sudo и mount?
Создаётся директория /boot.scyld, к ней монтируется tmpfs. Создаётся директория /root/dev/shm, к ней тоже монтируется tmpfs, затем в эту директорию перемещается то, что было смонтировано в /boot.scyld. И? Что из них останется после загрузки?
/root/dev/shm, надо думать, в итоге станет /dev/shm, но что там будет? Как в дальнейшем система испольует /dev/shm/ помимо вешанья на неё временных директорий? Для такого использования команда «mount -t tmpfs devshm /root/dev/shm» не нужна, достаточно создать какую-нибудь /root/tmp/1/, скомандовать, скажем, «mount -t tmpfs devshm /root/tmp/1/», а потом при желании перевешивать эту tmpfs из /root/tmp/1/ куда в голову взбредёт. Или не так?
При чём тут squashfs и aufs? Похоже, к использованию tmpfs они не относятся, здесь они решают задачи с ней напрямую несвязанные.
Как это соотносится с конфигурацией компьютера без initramfs? Тоже не ясно.
Итого ценного в скрипте: примеры запуска mount с -t tmpfs и -o move. Полезная информация, но ничего нового.
Смысл /dev/shm. Что это такое, и вообще, какое отношение имеет к RAM?
Динамические изменения на странице (Это вообще к асп.нет имеет отношение?)
На странице имеются поля созданные таким вот образом <input type="text" name="Text" /><input.
Django: Что это такое вообще? Что я пропустил в изучении Python?
Какой язык используется в фигурных скобках? Это разве python? Если кто знает то дайте мне ссылку.
Как работает оператор **, что это вообще такое?
Где то на майлах нашел возведение в корень при помощи **.5 так..что это вообще за херь и что она.
apache веб сервер что это такое вообще?
почитал что apache это веб сервер, однако читал но всё равно не понятно что делает этот самый.
xlxndr, /dev/shm — это tmpfs, она всегда занимает 50% ОЗУ, но "занимает" не в привычном смысле слова, т. е. там ничего не хранится. Там можно без лишних телодвижений хранить файлы, для которых временно (до перезагрузки!) нужна очень быстрая память (например, если видео редактировать будете).
Сообщение от xlxndr
Вы имеете в виду ОЗУ? Они используют её всю.
Сообщение от xlxndr
Т.е., ОЗУ используется совместно приложениями и хранилищем файлов /dev/shm/tmp, так? При этом определение размера для /dev/shm/temp в таблице монтирования /etc/fstab не отрезает кусок памяти от ОЗУ и не запрещает использовать его же программам?
/dev/shm может быть увеличина, например до 80% озу в таблице /etc/fstab. Я привильно понимаю, что это никак не отразится на работе программ, если папка /dev/shm/tmp будет пуста, и это отрежет ровно 80% от ОЗУ, доступной программам, если папка /dev/shm/tmp будет занята на 100%? Не понятен принцип, который отрезает 50%, т.к. должен не в % отрезать, а просто отрезать кусок количестве Гб, минимально необходимый для системы, а остальное — разрешать к монтированию в /dev/shm.
Тогда, если такая ситуация: предполагается использовать сервер баз данных, и имеется 32Гб ОЗУ, а отведенная под /dev/shm/tmp папка будет занята именно на 99%, там будут храниться temp tablespace и поисковые индексы, то сколько в таком случае рационально отдавать на такую папу % от ОЗУ. Явно ведь не 50%, т.к. системе будет жирновато 16Гб, если сервак больше не используется ни для каких целей. Я так понимаю, оставлять системе около 1-2Гб, т.е. в % это 4-5% ОЗУ?