Zabbix监控memcached性能

2016年6月20日

说明: 这里介绍的是固定端口的zabbix 监控memcached   示例端口: 11211

一、创建memcached-tool脚本

vim   /etc/zabbix/shell/memcache-tool.pl

#!/usr/bin/perl

#

# memcached-tool:

#  stats/management tool for memcached.

#

# Author:

#  Brad Fitzpatrick <[email protected]>

#

# Contributor:

#  Andrey Niakhaichyk <[email protected]>

#

# License:

#  public domain.  I give up all rights to this

#  tool.  modify and copy at will.

#

use strict;

use IO::Socket::INET;

my $addr = shift;

my $mode = shift || "display";

my ($from, $to);

if ($mode eq "display") {

undef $mode if @ARGV;

} elsif ($mode eq "move") {

$from = shift;

$to = shift;

undef $mode if $from < 6 || $from > 17;

undef $mode if $to  < 6 || $to  > 17;

print STDERR "ERROR: parameters out of range\n\n" unless $mode;

} elsif ($mode eq 'dump') {

;

} elsif ($mode eq 'stats') {

;

} elsif ($mode eq 'settings') {

;

} elsif ($mode eq 'sizes') {

;

} else {

undef $mode;

}

undef $mode if @ARGV;

die

"Usage: memcached-tool <host[:port] | /path/to/socket> [mode]\n

memcached-tool 10.0.0.5:11211 display    # shows slabs

memcached-tool 10.0.0.5:11211            # same.  (default is display)

memcached-tool 10.0.0.5:11211 stats      # shows general stats

memcached-tool 10.0.0.5:11211 settings  # shows settings stats

memcached-tool 10.0.0.5:11211 sizes      # shows sizes stats

memcached-tool 10.0.0.5:11211 dump      # dumps keys and values

WARNING! sizes is a development command.

As of 1.4 it is still the only command which will lock your memcached instance for some time.

If you have many millions of stored items, it can become unresponsive for several minutes.

Run this at your own risk. It is roadmapped to either make this feature optional

or at least speed it up.

" unless $addr && $mode;

my $sock;

if ($addr =~ m:/:) {

$sock = IO::Socket::UNIX->new(

Peer => $addr,

);

}

else {

$addr .= ':11211' unless $addr =~ /:\d+$/;

$sock = IO::Socket::INET->new(

PeerAddr => $addr,

Proto    => 'tcp',

);

}

die "Couldn't connect to $addr\n" unless $sock;

if ($mode eq 'dump') {

my %items;

my $totalitems;

print $sock "stats items\r\n";

while (<$sock>) {

last if /^END/;

if (/^STAT items:(\d*):number (\d*)/) {

$items{$1} = $2;

$totalitems += $2;

}

}

print STDERR "Dumping memcache contents\n";

print STDERR "  Number of buckets: " . scalar(keys(%items)) . "\n";

print STDERR "  Number of items  : $totalitems\n";

foreach my $bucket (sort(keys(%items))) {

print STDERR "Dumping bucket $bucket - " . $items{$bucket} . " total items\n";

print $sock "stats cachedump $bucket $items{$bucket}\r\n";

my %keyexp;

while (<$sock>) {

last if /^END/;

# return format looks like this

# ITEM foo [6 b; 1176415152 s]

if (/^ITEM (\S+) \[.* (\d+) s\]/) {

$keyexp{$1} = $2;

}

}

foreach my $k (keys(%keyexp)) {

print $sock "get $k\r\n";

my $response = <$sock>;

if ($response =~ /VALUE (\S+) (\d+) (\d+)/) {

my $flags = $2;

my $len = $3;

my $val;

read $sock, $val, $len;

print "add $k $flags $keyexp{$k} $len\r\n$val\r\n";

# get the END

$_ = <$sock>;

$_ = <$sock>;

}

}

}

exit;

}

if ($mode eq 'stats') {

my %items;

print $sock "stats\r\n";

while (<$sock>) {

last if /^END/;

chomp;

if (/^STAT\s+(\S*)\s+(.*)/) {

$items{$1} = $2;

}

}

printf ("#%-17s %5s %11s\n", $addr, "Field", "Value");

foreach my $name (sort(keys(%items))) {

printf ("%24s %12s\n", $name, $items{$name});

}

exit;

}

if ($mode eq 'settings') {

my %items;

print $sock "stats settings\r\n";

while (<$sock>) {

last if /^END/;

chomp;

if (/^STAT\s+(\S*)\s+(.*)/) {

$items{$1} = $2;

}

}

printf ("#%-17s %5s %11s\n", $addr, "Field", "Value");

foreach my $name (sort(keys(%items))) {

printf ("%24s %12s\n", $name, $items{$name});

}

exit;

}

if ($mode eq 'sizes') {

my %items;

print $sock "stats sizes\r\n";

while (<$sock>) {

last if /^END/;

chomp;

if (/^STAT\s+(\S*)\s+(.*)/) {

$items{$1} = $2;

}

}

printf ("#%-17s %5s %11s\n", $addr, "Size", "Count");

foreach my $name (sort(keys(%items))) {

printf ("%24s %12s\n", $name, $items{$name});

}

exit;

}

# display mode:

my %items;  # class -> { number, age, chunk_size, chunks_per_page,

#            total_pages, total_chunks, used_chunks,

#            free_chunks, free_chunks_end }

print $sock "stats items\r\n";

my $max = 0;

while (<$sock>) {

last if /^END/;

if (/^STAT items:(\d+):(\w+) (\d+)/) {

$items{$1}{$2} = $3;

}

}

print $sock "stats slabs\r\n";

while (<$sock>) {

last if /^END/;

if (/^STAT (\d+):(\w+) (\d+)/) {

$items{$1}{$2} = $3;

$max = $1;

}

}

print "  #  Item_Size  Max_age  Pages  Count  Full?  Evicted Evict_Time OOM\n";

foreach my $n (1..$max) {

my $it = $items{$n};

next if (0 == $it->{total_pages});

my $size = $it->{chunk_size} < 1024 ?

"$it->{chunk_size}B" :

sprintf("%.1fK", $it->{chunk_size} / 1024.0);

my $full = $it->{free_chunks_end} == 0 ? "yes" : " no";

printf("%3d %8s %9ds %7d %7d %7s %8d %8d %4d\n",

$n, $size, $it->{age}, $it->{total_pages},

$it->{number}, $full, $it->{evicted},

$it->{evicted_time}, $it->{outofmemory});

}

chmod +x /etc/zabbix/shell/memcache-tool.pl
文本 memcached-tool.pl

二、用脚本查看memcache的各类统计数据

/etc/zabbix/shell/memcache-tool.pl 127.0.0.1:11211 stats

三、在zabbix_agent.conf中自定义UserParameter

vim  /etc/zabbix/zabbix_agentd.conf
UnsafeUserParameters=1

默认是 zabbix_agentd.d 下的文件全部加载  这里我改成只加载某种类型的   [依照个人习惯自定义]

Include=/etc/zabbix/zabbix_agentd.d/*.conf

vim /etc/zabbix/zabbix_agentd.d/memcached.conf

UserParameter=memcached.stat[*],/etc/zabbix/shell/memcache-tool.pl 127.0.0.1:11211 stats|grep $1 |awk '{print $NF}'

然后重启zabbix_agent进程

service zabbix-agent restart

测试

zabbix_get -s  127.0.0.1 -k  memcached.stat[rusage_system]
7561.995910

查看是否有返回值

四、在zabbix中添加模板  具体方法不再介绍

模板文件:

1 不带中文解释的 模板

2 含有中文解释的 模板

最后 如果还有其他端口 参照上述说明 再添加一个模板 注意zabbix中不能使用相同的 UserParameter=memcached.stat[*] 那么就意味着要改名 同时模板中也要修改 . 例如 UserParameter=memcached.stats_10000[*] , 相应的模板中将memcached.stat全部替换成memcached.stats_10000

没有评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注