Как то раз я решил сделать копию данных с домашнего компьютера на сервер и столкнулся с жуткими тормозами. Как показало исследование диск был очень сильно фрагментирован (судя по выводу xfs_db аж на 98%), с такой фрагментацией теряют скорость исполнения все дисковые операции (даже удаление файла может затянуться на несколько минут). Естественно, в этом нет ничего хорошего, поэтому был определен следующий план действий: во-первых, определить программу, которая создает фрагментацию, во-вторых, найти решение проблемы.
Первая задача решилась просто: фрагментацию создавал torrent-клиент deluge. В качестве простого решения захотелось, чтобы deluge при загрузке файла сразу занимал место под файл на жестком диске, поэтому включаем full allocation.
Тем не менее, проблема еще не решена полностью, т.к. при загрузке торрента с большим числом мелких файлов и при последующей его перезаписи, файловая система все равно будет изрядно фрагментироваться. Поэтому был написан скрипт, который запускается раз в неделю и производит дефрагментацию, предварительно остановив torrent-клиент.
Скрипт прописывается в cron и при выполнении пишет лог в /var/log/defrag.log, а также отсылает сообщения на e-mail.
#!/bin/bash LOGLOCATION="/var/log/defrag.log" LOGDATE=`date +"%d-%m-%y"` ACTIONTIME=`date +"%H:%M:%S"` mail -s "Defragmentation started" root@localhost echo "--------------------------------------------" >> $LOGLOCATION echo "Defragmentation started at $LOGDATE" >> $LOGLOCATION echo "--------------------------------------------" >> $LOGLOCATION ACTIONTIME=`date +"%H:%M:%S"` echo "[$ACTIONTIME] Stop deluged" >> $LOGLOCATION /etc/init.d/deluge-daemon stop >> $LOGLOCATION ACTIONTIME=`date +"%H:%M:%S"` echo "[$ACTIONTIME] Start analysing hdd" >> $LOGLOCATION /usr/sbin/xfs_db -r -c frag /dev/sda6 >> $LOGLOCATION ACTIONTIME=`date +"%H:%M:%S"` echo "[$ACTIONTIME] Start defragmentation" >> $LOGLOCATION /usr/sbin/xfs_fsr -v /dev/sda6 >> $LOGLOCATION ACTIONTIME=`date +"%H:%M:%S"` echo "[$ACTIONTIME] Start analysing after defragmentation" >> $LOGLOCATION /usr/sbin/xfs_db -r -c frag /dev/sda6 >> $LOGLOCATION ACTIONTIME=`date +"%H:%M:%S"` echo "[$ACTIONTIME] Start deluged" >> $LOGLOCATION /etc/init.d/deluge-daemon start >> $LOGLOCATION ACTIONTIME=`date +"%H:%M:%S"` echo "[$ACTIONTIME] Will done." >> $LOGLOCATION |
Соответствующая строка в cron будет выглядеть так:
1 8 * * 0 bash /etc/cron.d/defrag |
Или просто можно кинуть файлик в папку /etc/cron.weekly.