Скрипт для вывода информации по контейнерам OpenVZ
Скрипт, представленный ниже, выводит некоторую информацию по текущим парамерам контейнеров OpenVZ, используя показания утилиты vzlist, файла /proc/user_beancounters и параметров конфиг-файлов контейнеров.
Выводятся:
- Идентификатор контейнера
- IP-адрес контейнера. Параметр берется из файла /etc/network/interfaces внутри контейнера для варианта с Virtual Ethernet interface (почему не из вывода vzlist - там используются адреса для venet'a, а нужен veth)
- Название хоста (задается в --name)
- Загрузка контейнера за 1, 5 и 15 минут
- Использование диска - занятое место в Мб и процент заполненности от размера квоты
- Использование памяти:
- Текущее потребление / сколько контейнер аллоцировал под свои нужны (но реально не потребляет)
- Максимальное потребление / максимальное значение аллоцированной памяти
- Гарантированный контейнеру объем
- Лимит памяти для контейнера (показывается в выводе free -m)
- Сетевые подключения:
- Текущее значение для TCP / других видов (UDP, unix socket)
- Максимальное значение в процентах от лимита для TCP / других видов
- Лимит для TCP / других видов
- Заполненность сетевого буфера для TCP-соединений, в процентах от лимита:
- Исходящий трафик: текущее / максимальное значение
- Входящий трафик: текущее / максимальное значение
Скрипт форматировался под мою ширину экрана и шрифт (1024 px)
В качестве параметров можно передавать идентификаторы контейнеров или их имена, например, ./vzstat.sh 104 seedbox выведет информацию только по двум контейнерам с соответствующими параметрами. Пример вывода
Состояние контейнера отображается цветом: зеленый - работает, красный - остановлен.
Хотел сделать еще выделение цветом ограничение параметров (например, приближение заполненности диска к его квоте или переполнение буфера), но как-то сходу оно не пошло, в итоге забросил.
#!/bin/bash
# By Rain ;)
#↑↓
echo -ne "$(
printf "%-3s |%-15s|%-8s |%-14s |%-9s |%-26s |%-26s|%s %s %s|\n" \
"ID" "IP Address" "Host" "Load Average" "Disk, Mb" "Memory, Mb, Used/Wanted" "Net Connections, TCP/Other" "NetBuf, C/M"
printf "%-3s |%-15s|%-8s |%-14s|%-9s |%-26s|%-26s|%s %s %s|\n" \
"" "" "" "1 m./5 m./15 m." "Used Use" "Used Max Guar Lim." "Current Max,% Limit" "▲TCP ▼TCP"
echo \
====+\
===============+\
=========+\
===============+\
==========+\
===========================+\
==========================+\
=============+
vzlist -aHo ctid,status,name,laverage,diskspace ${@} | while read vpsid state host la disk
do
ip="$(awk '/address/{print $2}' /vz/private/${vpsid}/etc/network/interfaces)"
diskquota="$(awk -F'=\"|:' '/DISKSPACE/{print $2}' /etc/vz/conf/$vpsid.conf)"
awk '{if (NF==7) {a=$1 ; print} else print a" "$0}' /proc/user_beancounters | grep -E "^ *${vpsid}: " |
awk 'BEGIN {
OFMT="%.2g"
CONVFMT="%.0f"
}
/oomguarpages/{
totmemused+=$3*4/1024
totmemusedmax+=$4*4/1024
}
/kmemsize/||/tcpsndbuf/||/tcprcvbuf/||/othersockbuf/||/dgramrcvbuf/{
totmemused+=$3/1024/1024
totmemusedmax+=$4/1024/1024
}
/privvmpages/{
totmemusedw+=$3*4/1024
totmemusedmaxw+=$4*4/1024
}
/kmemsize/||/tcpsndbuf/||/tcprcvbuf/||/othersockbuf/||/dgramrcvbuf/{
totmemusedw+=$3/1024/1024
totmemusedmaxw+=$4/1024/1024
}
/vmguarpages/{
vmguar=$5*4/1024
}
/privvmpages/{
vmmax=$5*4/1024
}
/numtcpsock/{
numtcp=$3
numtcpmax=$4/$6*100
numtcplim=$6
}
/numothersock/{
numoth=$3
numothmax=$4/$6*100
numothlim=$6
}
/tcpsndbuf/{
tcpsb+=$3/$6*100
tcpsbmax+=$4/$6*100
}
/tcprcvbuf/{
tcprb+=$3/$6*100
tcprbmax+=$4/$6*100
}
END {
diskspuse="'$disk'"/"'$diskquota'"*100
if ("'$state'"=="stopped") c="\\e[31m"
else {
#if (totmemusedmaxw>0.9*vmmax) totmemusedmaxw="\\e[31m"totmemusedmaxw"\\e[0m "
#if (totmemusedmax>0.9*vmmax) totmemusedmax="\\e[31m"totmemusedmax"\\e[0m"
#if (totmemusedmax>vmguar) totmemusedmax="\\e[33m"totmemusedmax"\\e[0m"
#if (diskspuse>85) diskspuse="\\e[31m"diskspuse"\\e[0m"
#if (diskspuse>70) diskspuse="\\e[33m"diskspuse"\\e[0m"
#if (numtcpmax>15) numtcpmax="\\e[31m"numtcpmax"\\e[0m"
#if (numtcpmax>5) numtcpmax="\\e[33m"numtcpmax"\\e[0m"
}
printf "%s |%-15s|%-9s|%-14s |%-4s %-5s|%-8s %-8s %-4s %-4s|%-8s %-7s %-9s|%-6s %-6s|\n",
c"'$vpsid'", "'$ip'", "'$host'", "'$la'",
"'$disk'"/1024, "("diskspuse"%)",
totmemused"/"totmemusedw, totmemusedmax"/"totmemusedmaxw, vmguar, vmmax,
numtcp"/"numoth, numtcpmax"/"numothmax, numtcplim"/"numothlim,
tcpsb"/"tcpsbmax, tcprb"/"tcprbmax
}'
echo -ne "\e[0m"
done
)"