Мне нужно сделать резервную копию данных с веб-сервера с 10 ГБ ОЗУ (Ubuntu). Для резервного копирования данных я использую Rsync.
Моим первым тестом было использовать один rsync для всех веб-сайтов, но он использует 5 ГБ. Поэтому я решил разделить rsync, но он по-прежнему использует 5 ГБ. В обоих случаях он потребляет много памяти и не всегда полностью освобождается после процесса.
Если я вручную сбросил кеш между rsync, он использует только от 150 до 500 МБ, чтобы полностью освободить память после процесса. (И освободить 50% -70% памяти сервера)
for CURDIR in "$ROOTDIR"*
do
echo "Start $CURDIR"
rsync -aHh --stats --compress --delete "$CURDIR" --link-dest="saveofyesterday" "saveoftoday"
echo "Clear"
sync
echo 3 > /proc/sys/vm/drop_caches
echo "Finish $CURDIR."
done
Вроде не рекомендую. Как правильно этого добиться?
Я бы посоветовал изучить фантазия патч для rsync. Цель состоит в том, чтобы сохранить кэш диска при резервном копировании. Эффект: вы должны увидеть, что эта память, которую вы считаете «использованной», не будет «использоваться». На самом деле память, которую вы считаете использованной, используется, но используется для дискового кеша и будет освобождена программами при необходимости. Если системе не хватает памяти, в конечном итоге весь дисковый кеш будет удален из памяти, чтобы попытаться предоставить память нуждающимся приложениям. Это плохо, особенно в загруженных системах, которые не имеют чрезвычайно быстрой дисковой подсистемы, потому что после того, как дисковый кеш будет вытеснен из памяти, все однажды кэшированные данные нужно будет снова прочитать с диска, что приведет к огромной нагрузке ввода-вывода и времени ожидания.
Удаление кеша вручную так же плохо и поставит ваш сервер в тяжелое положение. Это не рекомендуется. Ваш сценарий не должен беспокоиться об управлении памятью, об этом позаботится ядро.
Похоже, что вы хотите запустить процесс и ограничить его влияние на кеш файловой системы, чтобы это не создавало проблемы «шумного соседа».
Вы можете поместить rsync в контейнер и ограничить размер памяти. Это в основном похоже на причуду на стероидах.
Создать такой контейнер сложно, к счастью, есть инструмент, который сделает всю работу за вас, и называется LMCTFY: https://github.com/google/lmctfy
Используя lmctfy, вы можете создать контейнер с таким ограничением памяти:
lmctfy create mycontainer "memory:{limit:100000000}"
lmctfy run mycontainer "rsync ..."
lmctfy destroy mycontainer