每 300 毫秒运行一次 vmstat

每 300 毫秒运行一次 vmstat

有没有办法以 300 毫秒的间隔重复运行vmstatiostat、命令?sar

我知道默认值是 1 秒,但我想每 300 毫秒运行一次以监控系统性能。

答案1

您可以编写一个脚本,以 0.3 秒的间隔重复调用该命令:

  • 有些系统(LinuxFreeBSD索拉里斯例如)提供一个命令级sleep命令,接受小于 1 秒的间隔。对于这些,可以编写一个普通的 shell 循环,例如

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

    那不是POSIX, 当然。

  • 其他脚本语言(例如 Perl)提供了可以替代使用的函数。对于 Perl usleepTime::HiRes例如,
    /usr/bin/perl -w #!
    使用严格;
    使用 Time::HiRes qw(usleep);

    我们的$CMD="vmstat";
    系统($CMD);
    当(1){
        系统(“$CMD | tail -n 1”);
        usleep(300000);
    }

答案2

我尝试了这种方法,将 vmstat 放在一个 while 循环中,这样我就可以很容易地在完成测试后退出,然后将收集的日志文件解析为 csv,以便轻松导入进行绘图。这有效,但 vmstats 的第一行几乎总是相同的,所以这没用。我不得不手动运行 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

相关内容