Есть ли способ повторно запускать команды vmstat
, iostat
, sar
с интервалом в 300 миллисекунд?
Я знаю, что значения по умолчанию - 1 секунда, но я хочу запускать каждые 300 миллисекунд для мониторинга производительности системы.
Есть ли способ повторно запускать команды vmstat
, iostat
, sar
с интервалом в 300 миллисекунд?
Я знаю, что значения по умолчанию - 1 секунда, но я хочу запускать каждые 300 миллисекунд для мониторинга производительности системы.
Вы можете написать скрипт, который вызывает команду несколько раз с интервалом 0,3 секунды:
Некоторые системы (например, Linux, FreeBSD, Solaris ) предоставляют команду sleep
уровне команд, которая принимает интервалы меньше 1 секунды. Для них можно написать обычный цикл оболочки, такой как
#!/bin/sh
CMD=vmstat
$CMD
while :
do
$CMD | tail -n 1
sleep 0.3
done
Это не в POSIX, конечно.
usleep
есть функция Time::HiRes
, например:#!/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); }
Я попробовал этот подход, скопировав vmstat в цикле while, чтобы я мог легко выйти из него после завершения теста, а затем проанализировал собранный файл журнала в csv для легкого импорта для построения графиков. Это сработало, НО vmstats 1-ая строка была почти всегда одинаковой, так что это было ПОЛЕЗНО. Мне пришлось запустить vmstat вручную и собрать журналы в файл, а затем обработать их.
#!/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