Como posso executar um trabalho quando a carga do servidor está baixa?

4

Eu tenho um comando que executa um instantâneo de disco (no EC2, congelando um disco XFS e executando um comando de instantâneo do EBS), que é definido para ser executado em um agendamento regular como uma tarefa agendada. Idealmente, eu gostaria de poder ter o comando atrasado por um período de tempo se o disco estiver sendo usado pesadamente no momento em que a tarefa está programada para ser executada.

Tenho receio de que o uso de nice / ionice não tenha o efeito adequado, pois gostaria que o script fosse executado com alta prioridade enquanto estava em execução (ou seja, espere por um bom tempo e termine rapidamente).

Obrigado.

UPDATE :

Foi com isso que acabei indo. Ele verifica / proc / diskstats e executa meu job quando a atividade atual de IO atinge 0, ou o tempo limite. Provavelmente terei que ajustar isso quando analisarmos o tipo de atividade de IO que nossos servidores realmente produzem:

#!/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
    
por jberryman 15.04.2010 / 01:15

3 respostas

2

Eu encontrei um script perl aqui link

Isso deve fazer o que você precisa.

Você provavelmente poderia implementar isso com um script de shell simples que analise o tempo de atividade, e sendo apenas a execução uma vez que a média da carga baixou para um determinado valor.

Tenha em atenção que, se o seu servidor estiver constantemente ocupado, com um processo de fuga, o seu cronjobs nunca será executado!.

Talvez uma idéia melhor, se você tiver memória, é executar tarefas do cron em um sistema operacional menor prioridade, assim eles só consumirão recursos excedentes.

    
por 15.04.2010 / 01:34
3

Você pode dar uma olhada no comando em lote Talvez isso se ajuste às suas necessidades.

man batch para mais detalhes (é uma parte do subsistema)

    
por 15.04.2010 / 15:32
1

Que tal escrever um pequeno script de pesquisa / daemon que, começando no horário agendado, verifique iostat (vmstat) para baixa atividade do disco e continue a verificar a cada 5 minutos até que a atividade do disco seja menor / abaixo de um limite predefinido ou um período do tempo, o que quer que venha primeiro?

    
por 15.04.2010 / 01:25