На нашем хосте определено устройство zram объемом 80 ГБ, а внутри него файловая система ext4 объемом 170 ГБ:
echo 170G > /sys/block/zram0/disksize
echo 80G > /sys/block/zram0/mem_limit
/usr/sbin/mkfs.ext4 -q -m 0 /dev/zram0
/usr/bin/mount /dev/zram0 /var/zram
Эта файловая система используется нашим приложением для быстрого доступа к большим объемам временных данных.
Размер файловой системы, отображаемый в, df
соответствует размеру zram, указанному в/sys/block/zram0/disksize
Копируя тестовые данные в пустую файловую систему, мы убедились, что достигается коэффициент сжатия 2,2 : 1, и поэтому файловая система заполняется до того, как мы достигнем предела памяти zramfs. Значение /sys/block/zram0/orig_data_size
соответствует использованию, сообщенному файловой системой:
# expr `cat orig_data_size` / 1024 ; df -k /dev/zram0
112779188
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/zram0 175329308 112956600 62356324 65% /var/zram
Однако когда приложение работает с реальными данными за более длительный период, мы обнаруживаем, что это больше не соответствует действительности.
# expr `cat orig_data_size` / 1024 ; df -k /dev/zram0
173130200
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/zram0 175329308 112999496 62313428 65% /var/zram
Теперь файловая система сообщает об использовании около 110 ГБ, но устройство zramfs сообщает о 165 ГБ. В то же время память zramfs исчерпывается, и файловая система становится доступной только для чтения.
Цифры zram подтверждают, что мы получаем коэффициент сжатия 2,2 : 1 между orig_data_size и compr_data_size; однако,почему файловая система показывает гораздо больше свободного места, чем устройство zram? Даже если это пространство уже выделено для повторного использования файловой системой, разве не следует использовать его повторно, а не выделять новое пространство?
Данные состоят из большого количества небольших файлов, которые добавляются и удаляются через нерегулярные промежутки времени.
решение1
Причиной этого оказывается то, что когда файлы удаляются из файловой системы ext4, находящейся на устройстве zram0, память не освобождается обратно в систему. Это означает, что, хотя пространство доступно для использования файловой системой (вывод ), df
тем не менее, она все еще выделяется (статистика в /sys/block/zram0
). В результате использование памяти достигает 100% от выделенного объема, хотя файловая система все еще оказывается наполовину заполненной из-за удалений.
Это означает, что вы по-прежнему можете заполнить файловую систему, и новые файлы не будут занимать так много места в памяти; однако это отрицательно влияет на степень сжатия.
Решение — смонтировать файловую систему с параметрами discard
и noatime
. discard
Освобождение файлового пространства вернулось на устройство памяти, и в результате использование на двух устройствах снова совпало.