Скрипт для вывода информации по контейнерам OpenVZ

Материал из Linux Wiki
Перейти к навигацииПерейти к поиску
Версия для печати больше не поддерживается и может содержать ошибки обработки. Обновите закладки браузера и используйте вместо этого функцию печати браузера по умолчанию.

Скрипт, представленный ниже, выводит некоторую информацию по текущим парамерам контейнеров 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
)"