Одна из причин, почему ваш Ubuntu сервер может сигнализировать, что кончилась память, тогда как её предостаточно — слишком большое количество файлов. Каждый диск в зависимости от размера имеет ограниченное максимальное количество файлов и папок, которые вы можете создать.
Проверить количество используемых inodes можно командой:
root@ec2-consumer:~# df -ih
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/root 2.5M 2.1M 419K 84% /
devtmpfs 482K 349 482K 1% /dev
tmpfs 484K 5 484K 1% /dev/shm
tmpfs 484K 602 483K 1% /run
tmpfs 484K 4 484K 1% /run/lock
tmpfs 484K 18 484K 1% /sys/fs/cgroup
/dev/loop1 16 16 0 100% /snap/amazon-ssm-agent/4046
/dev/loop5 11K 11K 0 100% /snap/core18/2253
/dev/nvme1n1 25M 462K 25M 2% /var/www
tmpfs 484K 22 484K 1% /run/user/0
Видим 84% около /dev/root — процент очень большой, это свидетельствует о проблеме. Обычно должно быть не больше 50%, а 80% — это верхний предел.
Причин может быть несколько, например, у вас есть какой-то скрипт, пишущий много логов или временных файлов в /tmp. В моём случае это была библиотека phrets, которая создаёт много пустых временных файлов в /tmp.
Если не знаете, где превышаете лимит по количеству файлов, запустите команду (может занять несколько минут):
du --inodes -d 3 / | sort -n | tail
Быстрое решение
Просто удалите лишние файлы. Это можно сделать по шаблону regexp:
find /tmp -type f -mtime +0 -name 'phrets*' -execdir rm -- '{}' \;
Здесь -mtime +0 фильтрует все файлы, которые были созданы больше суток назад — я не хотел удалять все файлы, так как не был уверен, что библиотека phrets не использует самые свежие для чего-то нужного (хотя они все и были пустыми). Почитайте про значения параметра mtime, чтобы фильтровать как давно созданные файлы, так и недавно.
Долгое решение
Нужно увеличить количество inodes. Это крайне редкое и радикальное решение, которое хорошо описано тут — https://www.ctrl.blog/entry/how-to-all-out-of-inodes.html.