executando o vmstat a cada 300 milissegundos

1

Existe alguma maneira de executar os comandos vmstat , iostat , sar repetidamente com um intervalo de 300 milissegundos?

Eu sei que o padrão é 1 segundo, mas eu quero rodar a cada 300 milissegundos para monitorar o desempenho do sistema.

    
por karthikeyan vijayan 22.09.2015 / 11:36

2 respostas

0

Você pode escrever um script que chama o comando repetidamente com um intervalo de 0,3 segundo:

  • Alguns sistemas ( Linux , FreeBSD , Solaris por exemplo) fornece um comando sleep em nível de comando que aceita intervalos menores que 1 segundo. Para aqueles, é possível escrever um loop de shell comum, como

    #!/bin/sh CMD=vmstat $CMD while : do $CMD | tail -n 1 sleep 0.3 done

    Isso não está em POSIX , é claro.

  • Outras linguagens de script, como o Perl, fornecem funções que podem ser usadas no lugar. Para Perl, há a função usleep em Time::HiRes , por exemplo,
    #!/usr/bin/perl -w
    use strict;
    use Time::HiRes qw(usleep);

    our $CMD="vmstat";
    system($CMD);
    while (1) {
        system("$CMD | tail -n 1");
        usleep (300000);
    }
    
por 22.09.2015 / 13:34
-1

Eu tentei este approch, batendo o vmstat em um loop while para que eu pudesse facilmente sair quando eu terminei o meu teste, em seguida, analisar o arquivo de log coletado para csv para facilitar a importação de gráficos. Funcionou, mas vmstats 1ª linha foi quase sempre o mesmo, então isso era inútil. Eu tive que executar o vmstat manualmente e coletar os logs em um arquivo e processá-los depois.

#!/bin/bash
OUTPUT="/dropinbox/vmstat_$(hostname)_$(date +%Y-%m-%d_%H-%M).csv"

echo Starting Recording...
echo Press Q to exit.

# create blank temp file
echo '' > /tmp/vmstat.log

while true; do

    # -t time -a active and inactive memory reporting -n no repeate headers -S M size
    vmstat 1 1 -tanwS M >> /tmp/vmstat.log

    # In the following line -t for timeout, -N for just 1 character
    # -t 0.25 therefore loop will run 4 times a second.
    read -t 0.25 -N 1 input
    if [[ $input = "q" ]] || [[ $input = "Q" ]]; then
        # The following line is for the prompt to appear on a new line.
        echo Finshed
        break
    fi
done

# remove blank lines
sed -i '/^$/d' /tmp/vmstat.log
# remove headers
sed -i '/procs/d' /tmp/vmstat.log
# Keep 1 line of the 2nd headers
grep -m1 r /tmp/vmstat.log > /tmp/headers
tr -s ' ' , < /tmp/headers | sed s/,// > $OUTPUT
# remove all 2nd line headers
sed -i '/r/d' /tmp/vmstat.log
# process columns into csv output missing out column 18 (Date) as this got in myway
awk 'BEGIN { OFS = "," }!($18="")' /tmp/vmstat.log |tr -s ',' >> $OUTPUT
cat -vet $OUTPUT
echo finished saving to $OUTPUT
    
por 16.08.2018 / 09:38

Tags