Ускорение расчёта места на диске для инстансов с интенсивной загрузкой

Команда du, используемая для получения данных о дисковом пространстве, занятом загруженными файлами, вызывала проблемы с производительностью моей административной панели. Да, у нас очень много загрузок изображений. Вместо полного отключения этой функции (у нас ведь есть панель мониторинга Grafana/Prometheus), я решил заменить её на гораздо более быстрое очень грубое приближение с использованием команды df. Это изменение, разумеется, может быть включено или отключено администратором; по умолчанию используется du.

Я отправил PR с этим изменением. Это мой первый PR, так что, пожалуйста, отнеситесь с пониманием :))

Вы можете просмотреть PR здесь:

У вас есть приблизительное представление о том, сколько времени занимала команда du в вашем случае? Мне не очень нравится этот подход к решению проблемы с производительностью, и я считаю, что есть две альтернативы:

  1. Просто использовать Upload.sum(:filesize).to_i + OptimizedImage.sum(:filesize).to_i для определения uploads_used_bytes, как мы делаем для внешних хранилищ.
  2. Внедрить фоновую задачу, которая периодически пересчитывает объем данных, занимаемый загрузками, и кэширует его в Redis.

Лично я больше склоняюсь к варианту (1), так как это гораздо более простое решение. Мы немного теряем в точности, но нам не нужна 100% точность здесь. Тем не менее, это будет намного лучше, чем приближенное значение, которое мы получаем от df.

2 лайка

Спасибо за ваш отзыв.

du занимал более минуты на HDD, а на SSD это занимает примерно 20 секунд.

Моя логика такова: если у вас есть экземпляр, зависящий от загрузок, как у нас, то у вас всё равно есть выделенный раздел для загрузок.

Но да, ваше решение №1 выглядит более элегантным. Я изучу его и отправлю изменённый PR.

Измененный PR находится здесь:

Спасибо за рассмотрение.

1 лайк