Назад | Перейти на главную страницу

Как я могу запустить задание при низкой загрузке сервера?

У меня есть команда, которая запускает моментальный снимок диска (на EC2, замораживает диск XFS и запускает команду моментального снимка EBS), которая настроена на регулярное выполнение в качестве задания cron. В идеале я хотел бы иметь возможность отложить выполнение команды на определенный период времени, если диск интенсивно используется в момент, когда запланировано выполнение задачи.

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

Спасибо.

ОБНОВИТЬ:

Это то, к чему я пришел. Он проверяет / proc / diskstats и запускает мою работу, когда текущая активность ввода-вывода достигает 0 или истекает время ожидания. Мне, вероятно, придется настроить это, когда я посмотрю, какие операции ввода-вывода наши серверы фактически получают в производстве:

#!/bin/bash

DEVICE=sdf

# we want to make a snapshot when IO in progresses reaches this:
LOW_THRESHOLD=0

TIMER=0
MAX_SEC_DELAY=120

# Get the number of IO operations in progress:
ioInProgress(){
    grep $DEVICE /proc/diskstats | awk '{print $12}'
}

# Wait for a good time to run snapshot, else timeout:

while [[ $TIMER -lt $MAX_SEC_DELAY && $(ioInProgress) -gt $LOW_THRESHOLD  ]]; do
    TIMER=`expr $TIMER + 1`
    sleep 0.5
done

# Recording delay required:
echo $TIMER
echo "Executing snapshot"
run-the-snapshot

Вы можете взглянуть на пакетную команду. Возможно, она подойдет вам.

man batch для более подробной информации (это часть подсистемы at)

я нашел здесь Perl скрипт http://www.skolnick.org/cgi-bin/list.pl?file=serverload.pl

Это должно сделать то, что вам нужно.

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

Помните, что если ваш сервер постоянно занят, ваши cronjobs никогда не будут выполняться!

Возможно, лучшая идея, если у вас есть память, - это запускать задания cron с самым низким приоритетом ОС, поэтому они будут потреблять только свободные ресурсы.

Как насчет написания небольшого скрипта опроса / демона, который, начиная с вашего запланированного времени, проверяет iostat (vmstat) на низкую активность диска и продолжает проверять каждые 5 минут, пока активность диска не станет ниже / ниже заданного порога или период времени не будет прошло, что будет раньше?