········print "reps="int(rep/NR) ";retops=" int(retop/NR) \
··········";dupps=" int(dupp/NR) ";oops="int(oop/NR) }
··EOF
··eval $(awk −f $awktmp < $stats)
··if [$repn −gt $reps]; then
····echo "*** Warning: Retransmit rate is currently higher than average."
····echo " (average is $reps% and current is $repn%)"
··fi
··if [$retopn −gt $retops]; then
····echo "*** Warning: Transmit timeouts are currently higher than average."
····echo " (average is $retops% and current is $retopn%)"
··fi
··if [$duppn −gt $dupps]; then
····echo "*** Warning: Duplicate receives are currently higher than average."
····echo " (average is $dupps% and current is $duppn%)"
··fi
··if [$oopn −gt $oops]; then
····echo "*** Warning: Out of orders are currently higher than average."
····echo " (average is $oops% and current is $oopn%)"
··fi
··echo \(Analyzed $(wc −l < $stats) netstat log entries for calculations\)
··exit 0
Программа netstat чрезвычайно полезна, но ее вывод может показаться пугающим. В листинге 10.12 показаны только первые его десять строк.
Листинг 10.12.Запуск netstat для получения информации о TCP
$ netstat −s — p tcp | head
tcp:
····51848278 packets sent
········46007627 data packets (3984696233 bytes)
········16916 data packets (21095873 bytes) retransmitted
········0 resends initiated by MTU discovery
········5539099 ack-only packets (2343 delayed)
········0 URG only packets
········0 window probe packets
········210727 window update packets
········74107 control packets
Первый шаг — извлечь только записи с интересной информацией и сведениями о функционировании сети. В этом заключается главная задача сценария getstats, и он решает ее, сохраняя вывод команды netstat во временном файле $temp и извлекая из него ключевые параметры, такие как общее количество отправленных и полученных пакетов. Строка
, например, извлекает количество отправленных пакетов.
Команда sed удаляет любые нечисловые значения, чтобы гарантировать отсутствие любых символов пробелов и табуляции в результатах. Затем все извлеченные значения записываются в файл журнала .netstatlog , в формате var1Name=var1Value; var2Name=var2Value; и так далее. Этот формат позволит потом использовать eval для интерпретации каждой строки в .netstatlog и сохранить все прочитанные значения в переменных командной оболочки:
time=1063984800;snt=3872;re=24;rec=5065;dup=306;oo=215;creq=46;cacc=17;reto=170
Сценарий выполняет анализ содержимого файла .netstatlog , выводит последние значения параметров функционирования сети и сообщает о любых аномалиях и других значениях, неуклонно увеличивающихся с течением времени. Сценарий netperf вычисляет текущий процент повторно отправляемых пакетов, деля их количество на общее число отправленных пакетов и умножая результат на 100. Целочисленная версия процента повторно отправляемых пакетов получается делением количества повторно отправленных пакетов на общее количество отправленных пакетов, умножением на 10 000 и делением на 100
.
Как видите, имена переменных в сценарии начинаются с сокращений, полученных из наименований значений, возвращаемых программой netstat и сохраняемых в .netstatlog в конце сценария getstats
. К таким сокращениям относятся: snt, re, rec, dup, oo, creq, cacc и reto. В сценарии netperf к этим сокращениям добавляется окончание p, чтобы получить имена переменных, представляющих вещественные значения процентов от общего числа отправленных и полученных пакетов. Окончание pn добавляется к сокращениям, чтобы получить имена переменных, представляющих целочисленные версии процентов от общего числа отправленных и полученных пакетов. В сценарии netperf окончание ps обозначает переменную, представляющую усредненный процент, которая используется на финальной стадии вычислений.
Цикл while перебирает записи в файле .netstatlog , вычисляет четыре ключевых перцентиля (re, retr, dup и oo, которые представляют количество повторно отправленных пакетов, превышений таймаута при отправке, дубликатов и внеочередных (срочных) пакетов соответственно). Все это записывается во временный файл $stats , затем сценарий awk суммирует каждую колонку в $stats и вычисляет средние значения, деля суммы на количество записей в файле (NR).
Команда eval в строке
связывает все вместе. Комплект статистик ($stats), полученных циклом while, передается команде awk, которая использует сценарий в файле $awktmp для вывода последовательностей variable=value. Эти последовательности variable=value затем внедряются в командную оболочку инструкцией eval, в результате чего создаются переменные reps, retops, dupps и oops, представляющие среднее количество повторно отправленных пакетов, среднее количество таймаутов при повторной передаче, среднее количество пакетов-дубликатов и среднее количество внеочередных (срочных) пакетов соответственно. Затем текущие процентные значения можно сравнивать с этими усредненными величинами, чтобы выявлять настораживающие тенденции.
Читать дальше