Большая часть способа без побочных эффектов заархивировать большой файл, в то время как это изменяется

Я забочусь о приложении, которое генерирует большой объем данных в файле журнала (о 5G день) на сервере Red Hat. Эти выполнения процесса в течение 24 часов в течение недели, таким образом, нет никакого смысла в день, когда файл не изменяется, хотя информация, добавляемая к нему за полночь, не особенно важна, таким образом, хорошо, если я теряю скажем, несколько секунд данных в течение того периода.

Для создания "безопасных" архивов файла журнала ежедневно, я создал сценарий, который делает следующее в какой-то момент рано утром:

  • делает копию файла к локальной папке
  • усеките "активный" файл
  • tar+compress копия
  • переместите tar.gz копии к нашему пространству архива

Вот сам сценарий в случае, если там бликуют проблемы с ним:

DF=$(date +"%Y%m%d_%H%M%S")
TARGET="fixdata-logs-$DF"
cp -r ./fixdata/logs $TARGET

#Truncate the original log file
find ./fixdata/logs -name '*.log' -exec sh -c 'cat /dev/null >| {}' \;

#Zip the log files
tar -zcvf $TARGET.tar.gz $TARGET

#Delete the labelled copy
rm -rf $TARGET

#Archive files older tha 3 days
find . -type f -mtime +3 -name \*.gz -exec mv {} $ARCHIVE_DIR \;

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

Проблема, в течение этого периода, приложение часто сообщает об ошибках, который связан с системными ресурсами. Например, монитор heartbeat его очереди часто не удаются произвести регулярных heartbeat. Ясно, что эта копия-> tar.gz-> процесс перемещения вызывает действительно влияние на сервер IO, что это влияет на поведение приложения.

Как я могу уменьшить влияние этого сценария? Время к концу не важно - если решение занимает больше времени, но не вызывает ошибки приложения, то это' предпочтительное для чего-то, что быстро. Есть ли другие подходы, которые я должен рассмотреть?

Для полноты я рассмотрел следующее, но имею сомнения:

  • Пропустите часть копии и tar непосредственно: Но я волнуюсь, что tar будет иметь проблемы, если файл будет изменен, в то время как это занято.
  • Скопируйте в папку архива сначала и затем tar - возможно, если сжатие сделано на другом диске затем, влияние IO меньше? Я волнуюсь, что пространство архива, которое мы используем, не подходит для того, чтобы сделать дисковые операции ввода/вывода как сжатие, поскольку я не думаю, что это - традиционный диск произвольного доступа. Я также не уверен, не идет ли копия к другому физическому диску ко всем неприятностям, поскольку я думал бы, что ОС имеет некоторый умный способ сделать локальную копию, физически не читая все байты в файле. К сожалению, мои *отклоняют навыки, не помогает здесь.
  • Ожидайте до выходных: к сожалению, дисковое пространство на сервере не достаточно для содержания ценности недели данных перед архивацией. Конечно, я могу попросить увеличивать его, но сначала я хочу видеть, существуют ли более нормальные решения.
1
задан 8 September 2015 в 10:42
2 ответа

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

Благодаря этому у вас не будет накладных расходов на ввод-вывод копии на том же носителе (что является одновременным чтением + write), затем усечение (что может быть или не быть значительной нагрузкой, в зависимости от вашей файловой системы) и , затем чтение в tar / compress и загрузка записи для создания архива.

Один раз вы переименовали файлы журнала, вы можете tar / сжатие / что угодно на досуге. Чтобы еще больше снизить нагрузку на ввод-вывод, рассмотрите возможность выполнения стороны записи tar / compress непосредственно в архивное хранилище - хотя ваше архивное хранилище может не быть типичным устройством с произвольным доступом, оно все равно будет принимать прямой поток данные, которые сжимаются «на лету» (даже S3 может это сделать с помощью подходящего инструмента CLI).

Еще одна вещь, которую следует учитывать, ортогональная вышесказанному, - это использование ionice . Запустив программу как ionice -c 3 , вы понижаете приоритет ввода-вывода процесса до «только простоя» - то есть, если есть что-нибудь иначе в системе, которая хочет выполнять ввод-вывод, ваша программа будет остановлена. Это отличная идея, но она может укусить вас сзади, если у вас тяжелая система ввода-вывода (ваша программа может занять aaaaages для завершения, потому что она редко получает время ввода-вывода). В тех случаях, когда вы уже выполняете слишком много ненужных операций ввода-вывода, установка приоритета «только простоя» сделает проблему намного хуже.

Я также сильно подозреваю, что планирование только простоя не совсем делает то, что написано на банке; Я видел небольшое снижение производительности других (запланированных с максимальной эффективностью) процессов, когда выполняются программы, работающие только в режиме ожидания, по сравнению с тем, когда процесс, работающий только в режиме ожидания, не работает. Я подозреваю, что это происходит из-за того, что, когда программа запрашивает ввод-вывод, в то время как процесс «только бездействующий» находится в середине выполнения операции ввода-вывода, существует задержка, пока этот ввод-вывод не будет выполнен до «максимального усилия». process 'Операция ввода-вывода может начаться. Другими словами, это все равно намного лучше, чем если бы процесс «только простоя» выполнялся с приоритетом «максимальные усилия», но это не чудесное исправление - все, что может показаться на первый взгляд.

1
ответ дан 4 December 2019 в 07:12

Взгляните на утилиту logrotate linux, которая доступна в rhel, она имеет сжатие, copytruncate и различные другие параметры, а также работает с файлами журнала, которые используются приложениями точно так же, как и вы. Вы также можете попробовать использовать диск ssd и скопировать данные на тот, который должен быть самым быстрым, и хотя он по-прежнему будет использовать процессор, io на медленный диск будет исключен, пока вы не используете usb.

-1
ответ дан 4 December 2019 в 07:12

Теги

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