Задача — сделать консольную утилиту, которая выводила бы информацию аналогично visualvm —
Used heap
+ писать в лог.
Для получения данных от Java-машины — используем jmap
.
Предполагается, что мониторить мы будем Tomcat с заданной переменной CATALINA_PID
.
Сам скрипт:
#!/usr/bin/env bash # задаём цвета - если больше 75% то "график" грасный green="E[32;40m" red="E[31;40m" # расположение лога log="$OUTPUT_DIR/memmon.log" # главная функция-рисовалка print () { printf "Total: $2 MBt" # пока i меньше, чем переденное значение $short - рисовать | for((i=1;i<=$1;i++)); do printf "$3%s" "|" done printf "n" # сбрасываем значение цвета консоли перед следующей итерацией tput sgr0 } # временный файл для результатов jmap if [ ! -e "/tmp/jmap.log" ]; then touch "/tmp/jmap.log" fi # нам наличие PID Tomcat'a необходимо, можно просто задать переменную pid напрямую if ! pid=$(cat $CATALINA_HOME/conf/catalina.pid); then echo "ERROR! Can't find Tomcat's PID-file. Exit." exit 1 fi if [ ! -e "$log" ]; then touch "$log" fi # при каждой итерации цикла while - записываем данные в лог jmapsave () { jmap -heap "$1" &> /tmp/jmap.log } # получаем различные значения из лога jmapgetnum () { jmapsave "$pid" cat /tmp/jmap.log | grep "used =*" | awk '{print $4}' | cut -d"." -f 1 | sed 's/(//g' | tail -n $1 | head -n 1 } # вычислияем MaxHeapSize jmapgetmax () { max=$(cat /tmp/jmap.log | grep -E "$1" | awk '{print $4}' | cut -d"." -f 1 | sed 's/(//g') } echo -e "Memory monitoring started at $(date +%Y-%m-%d %H:%M)n" | tee -a "$log" # когда нажмут Ctrl+C - записываем время прекращения мониторинга trap 'echo -e "nMemory monitoring finished at $(date +%Y-%m-%d %H:%M)n" | tee -a "$log"; exit 2' 2 # начинаем выполнение while true; do jmapgetmax "MaxHeapSize" # задаём занчения переменных из функции jmapgetnum pspermgeng=$(jmapgetnum 1) psoldgen=$(jmapgetnum 2) youngtospace=$(jmapgetnum 3) yongfromspace=$(jmapgetnum 4) yongedenspace=$(jmapgetnum 5) # если какая-то из переменных пустая - будут ошибки, задаём значение 0 : ${pspermgeng:=0} : ${psoldgen:=0} : ${youngtospace:=0} : ${yongfromspace:=0} : ${yongedenspace:=0} # суммируем значение переменных из переменных heapmax=$(( psoldgen + youngtospace + yongfromspace + yongedenspace )) full=$(( ( pspermgeng + psoldgen + youngtospace + yongfromspace + yongedenspace) )) # если памяти много и строка графика в консоли слишком длинная - увеличиваем тут значение, например / 30 short=$(( $full / 10 )) # вычисляем процент занятой от MaxHeapSize памяти percent=$(echo "$heapmax*100/$max"| bc) yong=$(( yongedenspace + yongfromspace + youngtospace )) # more defaults : ${heapmax:=0} : ${full:=0} : ${short:=0} : ${percent:=0} : ${yong:=0} # save to log-file echo "Young Generation: "$yong";" >> "$log" echo "Old Generation: "$psoldgen";" >> "$log" echo -e "Perm Generation: "$pspermgeng".n" >> "$log" # раскрашиваем вывод - измените, при необходимости - если более 70% занято - рисовать красный график if [ "$percent" -lt 70 ]; then color=$green else color=$red fi # и запускаем функцию print в цикле, пока не будет Ctrl+C print "$short" "$full" "$color" sleep 10 done
Выполнение:
$ ./memgraph Memory monitoring started at 2014-07-08 13:45 Total: 902 MB |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| Total: 909 MB |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| Total: 917 MB ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| Total: 923 MB |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| Total: 930 MB ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| Total: 939 MB ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| Total: 945 MB |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| Total: 953 MB ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| Total: 960 MB |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| Total: 967 MB |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| Total: 974 MB ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| Total: 981 MB |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| Total: 990 MB ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| Total: 996 MB ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| Total: 1003 MB |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| Total: 1011 MB ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| Total: 1018 MB ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| Total: 1026 MB |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| Total: 1033 MB ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| Total: 1040 MB |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| Total: 1048 MB |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| Total: 1055 MB ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| Total: 1063 MB |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| Total: 1070 MB ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ^C Memory monitoring finished at 2014-07-08 13:51
Лог-файл:
$ tail -n 30 ../logs/memmon.log Memory monitoring started at 2014-07-08 13:51 Young Generation: 5; Old Generation: 617; Perm Generation: 120. Young Generation: 12; Old Generation: 617; Perm Generation: 120. Young Generation: 19; Old Generation: 617; Perm Generation: 120. Young Generation: 27; Old Generation: 617; Perm Generation: 120. Young Generation: 34; Old Generation: 617; Perm Generation: 120. Memory monitoring finished at 2014-07-08 13:52