Построение графика скоростных характеристик винчестера

Материал из Linux Wiki
Перейти к навигацииПерейти к поиску

Скрипт выполнять от рута, то, что выдаст скрипт - скинуть в file.dat (или указать -o file.dat), после чего выполнить gnuplot myfile.plot > file.png, где myfile.plot имеет такое содержимое:

set terminal png 
set yrange [0:40]
set title "Disk Speed"
set xlabel "Mb"
set ylabel "Mbyte/sec"
plot "file.dat" using 1:3 title "Disk speed" with line 1

Второе значение во второй строке править под себя.


#!/bin/bash
# By Rain ;)

error() {
echo -e "\e[31m${1}\e[0m"
exit 1
}

cleancache() {
echo -en "\e[31mСброс кэшей... \e[0m"
echo 3 > /proc/sys/vm/drop_caches
echo -en "\e[33mСинхронизация... \e[0m"
sync
echo -e "\e[32mСпим...\e[0m"
sleep 3
}

resol='200'

[ "${UID}" != '0' ] && error 'Для доступа к устройству нужны права рута'
if	[ -z "${1}" ]; then
		error 'Укажите корректное блочное устройство'
elif	[ ! -b "${1}" ]; then
		error "${1} не блочное устройство"
fi

if [ "${2}" == '-o' ]; then
	if [ ! -z "${3}" ]; then
		if [ -e "${3}" ]; then	
			echo -e "\e[32m${3} \e[36mуже существует, используем заново...\e[0m"
			if [ -f "${3}" ]; then
				if [ -w "${3}" ]; then
					outfile="${3}"
					> "${outfile}"
				else error "${3} недоступен для записи"
				fi
			else error "${3} не является обычным файлом"
			fi
		elif [ -w "${3%/*}" ] || [ -w '.' ]; then
			outfile="${3}"
			> "${outfile}"
		else error "Не могу записать в ${3%/*}."
		fi
	else error 'Укажите файл результатов'
	fi
else outfile="/dev/null"
fi

disksize="$(fdisk -l "${1}" 2>/dev/null | awk '/^Disk/&&/bytes$/{OFMT="%.f" ;print $5/1024/1024}')"
echo -e "\e[36mРазмер диска \e[35m${disksize} MiB\e[0m"

echo -e "\e[36mВычисляем начальную скорость диска...\e[0m"
cleancache
initspeed="$(LANG=C dd if="${1}" of=/dev/null bs=1M count=1000 2>&1 | awk '/copied/{OFMT="%.f" ; print $8*1}')"
echo -e "\e[36mНачальная скорость диска \e[35m"${initspeed}" Mb/sec\e[0m"

step="$([ "$((${disksize}/${resol}))" -lt "$((${initspeed}*10))" ] && echo $((${initspeed}*10)) || echo $((${disksize}/${resol})))"

echo -e "\e[36mНачинаем тестирование диска размером \e[35m${disksize} Mb \e[36mс шагом \e[35m${step} Mb \e[36mи размером куска в \e[35m$((${initspeed}*2)) Mb\e[36m, всего \e[35m$((${disksize}/${step})) \e[36mзамеров.\e[0m"
cleancache
for i in $(seq 0 ${step} "${disksize}")
do
	sleep 0.2
	LANG=C dd if=${1} of=/dev/null bs=1M skip=${i} count=$((${initspeed}*2)) 2>&1 |
awk '/copied/{print "'$i'\t:::\t"$8}' | tee -a "${outfile}"
done

exit 0
ToDo: Доделать нормальное построение графика