Zabbix — CPU Time & Memory Usage для процесса
Задача — мониторить zabbix-ом Memory и CPU Time Usage для конкретного процесса в Linux/Unix.
Больше конкретики …
Есть вот такой процесс:
bioc 8607 40.4 1.2 11097680 418576 pts/0 Sl Feb25 423:27 /usr/java/jdk1.7.0_67/bin/java -classpath /opt/bioc/maven/boot/plexus-classworlds-2.4.jar -Dclassworlds.conf=/opt/bioc/maven/bin/m2.conf -Dmaven.home=/opt/bioc/maven org.codehaus.plexus.classworlds.launcher.Launcher tomcat7:run
black@linux9:~$
Как узнать сколько ресурсов он потребляет? И не просто узнать, но еще и запихнуть в zabbix для сбора статистики и накручивания триггеров.
Процессор!
CPU Time процесса — в дефолте Zabbix не умеет собирать агентом этот параметр. Но есть возможность написать свой UserParameter в конфиг zabbix-agent. Вот мой вариант:
На zabbix-server можно использовать Item «proc.cputime.fc» с дополнительными параметрами которые нужны для выборки awk:
USER=$1 — username, в моем случае «bioc»
COMM=$2 — command name, в моем случае «java»
SNAME=$3 — some unique parameter, в моем случае «tomcat7»
В моем случае это:
bioc /usr/java/jdk1.7.0_67/bin/java tomcat7:run
black@linux9:~$
Тоесть в моем конкретном случае Item выглядит так: proc.cputime.fc[bioc,java,tomcat7]
А что с памятью?
Поскольку я при настройке сервисов руководствуюсь правилом — один сервис на одного юзера, то в моем случае достаточно иметь Item для сбора использования памяти пользователем. В Zabbix версии 2.4 есть возможность получить от zabbix-client используемую память юзером, но к сожалению только VSZ. А я хочу еще и RSS! Тут опять поможет дополнительный UserParameter в zabbix-agent:
Он ведет к скрипту, а вот его листинг:
# Author: Tom Llewellyn-Smith
# Date: 10/12/2012
#
# Comment: simple perl script which sums all rss memory used by a given process (-p)
# tested on linux ps, easily modified to run with BSD ps.
#
# Copyright: © Onix Consulting Limited 2012-2012. All rights reserved.
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
use strict;
use warnings;
use Getopt::Std;
my $PS='/bin/ps';
my %opts;
getopts('h:p:', \%opts);
my $total_rss = 0;
sub usage
{
print "$0:\n\t-h displays this message\n\t-p [process name]\n";
exit 1;
}
unless ($opts{'p'})
{
# As a side-effect of not having -p set, -h also display help message.
&usage;
}
# Loop over all processes and add to total_rss counter if process matches regex.
foreach my $proc (`$PS -eF`)
{
if ($proc =~ /$opts{'p'}/)
{
my (undef,$pid,undef,undef,undef,$rss) = split(/\s+/,$proc);
# Do not include current script process as it will also match.
unless ($pid == $$)
{
$total_rss += $rss;
}
}
}
print $total_rss;
Этот скрипт был найден на просторах Интернета. Не помню менял я в нем чтото или нет …. Но суть не в том. Так что там с памятью? А вот что:
Memory Usage by Process (RSS) Item — proc.mem.rss[tomcat7]
Memory Usage by User (VSZ) Item — proc.mem[,bioc]
Не стоит использовать %CPU из ps
Там значение усредненное за все время работы процесса, а это сааааавсем не тот параметр который хочется мониторить.
@Павел
вполне хватает точности данного итема. Несколько раз реально выручали триггеры на основании этого показателя.