thinly provisioned root partition in Centos 7

По всей вероятности, ваш сценарий иногда запускается одновременно с записью файла. Когда cat запускается, он копирует данные, которые есть в данный момент. У него нет возможности узнать, что позже будут добавлены дополнительные данные.

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

gather_data --origin=somewhere >somewhere.stat.tmp &&
mv somewhere.stat.tmp somewhere.stat

Если вы не можете изменить процесс создания, вы можете реагировать на закрытие файлов с помощью inotify . В зависимости от того, как эти файлы создаются и удаляются, может иметь смысл использовать incron , например вы можете использовать эту строку incrontab:

/share/scripts/stats IN_CLOSE_WRITE case $@/$# in *.stat) new_stat_file $@/$# esac

new_stat_file будет сценарием, включающим новый файл. Не запускайте там что-то вроде cat * .stat , потому что он также может забирать частичные файлы. Переименуйте файлы или копии файлов, например

/share/scripts/stats IN_CLOSE_WRITE case $@/$# in *.stat) ln $@/$# /share/scripts/stats/ready/; esac

, а затем возьмите файлы из / share / scripts / stats / ready вместо / share / scripts / stats .

2
13.04.2017, 13:57
2 ответа

На случай, если кто-то еще наткнется на ту же проблему, отвечаю сам себе:

fstrim -v -a

или

fstrim -v /

вот что помогает. Файловая система не возвращает неиспользуемые блоки в пул, чтобы они могли быть использованы повторно (той же файловой системой в данном случае).

2
27.01.2020, 22:10

Я наткнулся на это, пытаясь выяснить, может ли корневая файловая система находиться на логическом томе с тонкой инициализацией. Полезно знать, что это возможно.

Чтобы ответить на (и дополнительно пояснить )ваш вопрос, из вывода lvsследует, что исходная группа томов изначально была выделена как стандартный логический том swapс использованием 16G и тонкого выделенного пула. логический том pool00. Без вывода из lvs -aневозможно определить размер базового логического тома метаданных; размер тома данных составляет 41,66 ГБ.

Затем логический том rootбыл создан как логический том с тонкой инициализацией поверх pool00, но был перераспределен (или позже расширен )до 50 ГБ поверх тома данных 41,66 ГБ. Предположительно, LVM допускает это, исходя из предположения, что том пула будет расширен до того, как он заполнится, но этого не произошло.

Как вы правильно заметили, файловая система не возвращает блоки в LVM, когда они больше не используются, хотя сама будет повторно использовать их, поэтому, хотя вы используете только 14 ГБ в реальных файлах, еще 27,66 ГБ были выделены из LVM. в root, а затем удаляется из файловой системы, но фактически не отбрасывается и возвращается в LVM. Следовательно, у вас закончилось место в базовом томе pool00.

Как вы правильно определили, запуск fstrimфактически отбрасывает неиспользуемые блоки в файловой системе, уведомляя LVM о том, что их можно использовать повторно, и освобождая место в pool00.

Поскольку вы переместили swapв другое место, вероятно, было бы неплохо использовать lvextendи увеличить размер pool00как минимум до 50G, текущий размер root.

В качестве альтернативы,запланируйте запуск fstrimкаждые несколько недель или около того, чтобы отбросить неиспользуемые блоки.

0
27.01.2020, 22:10

Теги

Похожие вопросы