Назад | Перейти на главную страницу

Файловая система 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 соответствует размеру зрам, как указано в /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? Даже если это пространство уже выделено для повторного использования файловой системой, не следует ли использовать его повторно вместо выделения нового пространства?

Данные состоят из большого количества небольших файлов, которые добавляются и удаляются нерегулярно.

Причина этого заключается в том, что при удалении файлов из файловой системы ext4, находящейся на устройстве zram0, память не освобождается обратно в систему. Это означает, что, хотя пространство доступно для использования файловой системой (вывод df) тем не менее, это все еще выделенная память (статистика в /sys/block/zram0 ). В результате использование памяти достигает 100% от объема выделенной памяти, хотя файловая система по-прежнему оказывается наполовину заполненной из-за удалений.

Это означает, что вы все еще можете заполнить файловую систему, и новые файлы не будут использовать столько нового пространства памяти; однако это отрицательно влияет на степень сжатия.

Решение - смонтировать файловую систему с discard и noatime параметры. В discard высвобождает освобожденное файловое пространство обратно на устройство памяти и, как результат, снова использует два совпадения.