Файловая система zram сообщает об использовании на уровне устройства, отличном от того, что сообщает файловая система

Файловая система zram сообщает об использовании на уровне устройства, отличном от того, что сообщает файловая система

На нашем хосте определено устройство 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Освобождение файлового пространства вернулось на устройство памяти, и в результате использование на двух устройствах снова совпало.

Связанный контент