我正在测试各种下载大型数据集的解决方案,这些下载可能需要数周时间,并且需要多次重启。我不想监控网络速度,而是想使用磁盘使用率的变化来推断下载速度,因为这样可以避免测量失败传输的重新传输。有没有工具可以做到这一点,还是我应该自己动手做 bash 解决方案?
答案1
Coreutils 非常适合处理这种事情。这里有一个快速解决方案,它还可以保存日期和时间。
$ echo -e "$(date)\t$(df | awk '$1 == "/dev/sda1" {print $2}')" > df_1
<wait a while>
$ echo -e "$(date)\t$(df | awk '$1 == "/dev/sda1" {print $2}')" > df_2
$ echo "$(( $(awk '{print $2}' FS='\t' df_2) - $(awk '{print $2}' FS='\t' df_1) )) K increase from $(awk '{print $1}' FS='\t' df_1) to $(awk '{print $1}' FS='\t' df_2)"
12 K increase from Wed Nov 20 21:22:07 EST 2013 to Wed Nov 20 21:23:13 EST 2013
我不确定你是否需要这个,但要解释一下它的作用:
- 首先,将当前日期和时间 (
date
) 以及“已用”磁盘空间 (awk '$1 == "/dev/sda1" {print $2}'
) 保存到文件 中df_1
。您可能需要用特定文件系统来代替/dev/sda1
。df
单独使用可获得列表。 - 其次,稍后再重复。
- 最后,打印出存储在每个文件的第一个字段中的“已用”磁盘空间之间的差值
$((...))
,并打印出日期(来自第二个字段)。
答案2
Sparhawk 抢先了一步,但这是我自己的解决方案,我打算将其作为 cron 任务来运行
#!/bin/bash
timestamp1=$(cat du-prev.txt | cut -f 2)
timestamp2=$(date +"%s")
timediff=$(echo "${timestamp2}-${timestamp1}" | bc)
current=$(du -s | cut -f 1)
previous=$(cat du-prev.txt | cut -f 1)
spacediff=$(echo "${current}-${previous}" | bc)
speed=$(echo "scale=2; ((${spacediff}/${timediff})*8)/1024" | bc)
echo "timediff : ${timediff} sec"
echo "spacediff : ${spacediff} KB"
echo "speed : ${speed} Mb/s"
echo -e "${current}\t${timestamp2}" > du-prev.txt
echo -e "${speed}\t${timestamp2}" >> logs/speedlog.txt