На устройстве нет свободного места. Почему не удается загрузить большой файл на сервер 1С (Linux)?
Итак, если вы читаете это - значит столкнулись с нехваткой места в каталоге временных файлов /tmp. Дело в том, что при установке Arch (возможно и другого дистибутива) скорее всего применились настройки tmpfs по умолчанию. Перечислю для новичков особенности каталога /tmp при настройках по умолчанию, и его отличия от Windows:
- Каталог временных файлов /tmp располагается целиком в оперативной памяти, и его содержимое не сохраняется при перезагрузке сервера, в отличие от Windows;
- В Arch при настройке по умолчанию размер каталога /tmp равен половине оперативной памяти компьютера (RAM/2). При нехватке памяти для приложений содержимое каталога /tmp сбрасывается в подкачку (swap), если он есть. При нехватке размера /tmp, например при загрузке среза базы 1С в файле DT, вы получаете ошибку "На устройстве нет свободного места /tmp/...";
- В общем случае в системах Linux без настроек, в отличие от Windows, каталог временных файлов будет один общий для всех пользователей. Но разграничение прав на файлы присутствует и проблем с безопасностью нет;
- Кроме того, скрипт установки archinstall скорее всего вместо файла или дискового раздела подкачки установил ZRAM. Не совсем про /tmp, но эта технология косвенно его задевает. ZRAM дополнительно отъедает кусок оперативной памяти, но хуже всего то, что файл DT и так является сжатым файлом и никакого увеличения объема виртуальной оперативной памяти в этом случае не происходит.
Для устранения проблемы нужно увеличить размер /tmp до размера, превышающего размер файла DT, не забывая просуммировать размер также и других временных файлов, создаваемых при работе системы и сервера 1С.
Диагностика проблемы
Для начала стоит вообще проверить все предположения. 1) Узнаем размер папки /tmp и насколько она заполнена:
$ df -h /tmp
Файловая система Размер Использовано Дост Использовано% Cмонтировано в
tmpfs 16G 43M 16G 1% /tmp
2) Узнаем, есть ли подкачка (swap) и какого она вида. Их может быть несколько! В примере ниже обычный своп в файл:
$ swapon --show
NAME TYPE SIZE USED PRIO
/swapfile file 8G 7M -2
В этом примере подкачка настроена в ZRAM:
$ swapon --show
NAME TYPE SIZE USED PRIO
/dev/zram0 partition 4G 0B 100
3) Узнаем, не отключен ли zswap: (y = да). Данная технология также позволяет держать небольшой фрагмент подкачки в сжатом виде в оперативной памяти, но всё что не влезает или не сжимается сбрасывается в настоящий физический своп:
$ zgrep CONFIG_ZSWAP_DEFAULT_ON /proc/config.gz
CONFIG_ZSWAP_DEFAULT_ON=y
Начало: небольшое увеличение размера /tmp в памяти
Если размер файла DT находится в промежутке между {RAM/2 ... (RAM - 2ГБ системы - размер ZRAM - память rphost)}, т.е. незначительно превышает половину оперативной памяти, то можно немного увеличить его размер. Предполагается, что система установлена по умолчанию без подкачки или с подкачкой в ZRAM. Для увеличения размера /tmp нужно внести следующую строку в файл /etc/fstab, (размер в гигабайтах указывайте свой, в примере значение для сервера с RAM 32 ГБ):
tmpfs /tmp tmpfs rw,nodev,nosuid,size=20G
Данное решение позволит быстро решить проблему, но потенциально может отобрать память у служб 1С и может являться в общем-то плохим решением (в зависимости от характера нагрузки).
Середина пути: существенное увеличение размера /tmp в памяти
На самом деле, вполне можно установить размер /tmp больше, чем у вас оперативной памяти. Но для этого нужно настроить нормальную подкачку. Первым делом я рекомендовал бы снести реликт из прошлого - блочное устройство ZRAM, т.к. в ядре и так уже есть более современное решение ZSWAP, который включен по умолчанию и выполняет аналогичную функцию, но намного лучше:
$ sudo pacman -R zram-generator
Если вы хотите также отключить и функцию ZSWAP, то для этого нужно настроить параметр запуска ядра zswap.enabled=0. Как именно это сделать заисит от вашего загрузчика.
Далее нужно добавить физическую подкачку. Тут вариантов несколько, приводить их смысла нет, просто следуйте указаниям из вики: Swap. Уместно только здесь уточнить, что на файловой системе BTRFS есть свой особой путь:
$ sudo btrfs subvolume create /swap
$ sudo btrfs filesystem mkswapfile --size 40g --uuid clear /swap/swapfile
$ sudo swapon /swap/swapfile
В настройках /etc/fstab добавьте строку, чтобы подкачка включалась при перезагрузке:
/swap/swapfile none swap defaults 0 0
Я думаю компьютеры и серверы на HDD уже уходят в прошлое, поэтому меняем дефолтный параметр подкачки /etc/sysctl.d/99-swappiness.conf:
vm.swappiness = 100
В сети часто ошибочно пишут что этот параметр может быть от 0 до 100, в том числе и в русской Arch Wiki, но эти сведения устарели вместе с ядром 5.8, и сейчас он может быть от 0 до 200. Если swap расположен на быстром диске SSD и NVME то можно порекомендовать значение 100 и далее при тюнинге сервера плясать от него. Внимание: ошибочно добиваться настройками swappiness такого состояния, когда swap совсем пустой и не используется! Объяснять это долго и сложно, рекомендую почитать статьи от разработчиков ядра на эту тему (к сожалению, на английском языке). Главное запомнить: наличие некоторого количества данных в подкачке вовсе не плохой знак.
После настройки подкачки можно безопасно увеличить размер /tmp в /etc/fstab:
tmpfs /tmp tmpfs rw,nodev,nosuid,size=50G
/swap/swapfile none swap defaults,discard 0 0
Данный способ на службы сервера 1С может ударить ещё сильнее, но зато позволит загрузить ещё больший файл. Все перечисленные выше способы относятся к категории "вредных советов" и польза описанных выше манипуляций только в том, что мы настроили нормальную подкачку.
Финал: сделать всё правильно, как в Windows
После выполнения нижеследующей команды и перезагрузки каталог /tmp превратится в обычную папку и для записи станет доступным весь объём физического диска. Но вам следует позаботиться о регулярной его очистке:
$ sudo systemctl mask tmp.mount
Не забудьте удалить из /etc/fstab строку с монтированием tempfs, если она была!
Внимание! Для сервера 1С каталог временных файлов должен располагаться на скоростном диске! Лучше всего если это NVME SSD. Ошибочно размещать его на второсортных дисках, например в хранилище на виртуальном диске с низким IOPS, или хуже того - на механике.
Обладателям лицензии ПРОФ имеет смысл не рубить так сильно сгоряча, т.к. лицензионное ограничение не позволяет им использовать весь объём физической памяти, поэтому небольшой tmpfs размером 20% от оперативной памяти не повредит, если на этом же сервере не запущено другое ПО, например СУБД Postgresql. Разумнее будет настроить отдельную временную папку только для служб сервера 1С. Для этого требуется отредактировать файл настройки службы systemd, в общем случае это /usr/lib/systemd/system/srv1cv8.service, нужно добавить в него строчку:
Environment=TMPDIR=/var/tmp/srv1cv8
Путь указываете любой, за пределами tmpfs, главное чтоб на скоростном диске с достаточным объёмом, и не забыть дать права для usr1cv8:grp1cv8.