SlideShare a Scribd company logo
1 of 33
P   D


A   C
$ pgrep memcached
4695




$ pgrep memcached
$
$ pgrep memcached
4695
$ echo $?
0

$ pgrep memcached
$
$ echo $?
1
$ cronlog -- pgrep memcached
$

$ cronlog -- pgrep memcached
srv1 starting: pgrep memcached
command exited with code:1
MAILTO=”ops@example.com”
5 * * * * cronlog -- pgrep memcached >&1
$ nc -z -w 4 localhost 11211




$ cronlog -- nc -w 1 -z localhost 11211
srv1 starting: nc -w 1 -z localhost 11211
command exited with code:1
GetOptions(
   'H=s' => my $HOST,
   'p=s' => my $PORT,
);

my $sock = IO::Socket::INET->new(
   PeerAddr => $HOST, PeerPort => $PORT
);
if ( !$sock ) {
    print "couldnot connect to $HOST:$PORT: $!n";
    exit(1);
}

$sock->syswrite("versionrn");
$sock->sysread( my $result, 16 );
if ( $result =~ m!^VERSION! ) {
    exit(0);
}

print "couldnot get VERSION from $HOST:$PORTn";
exit(1);
$ cronlog -- ./version.pl -H localhost -p 11211
srv1 starting: perl version.pl -H localhost -p 11211
couldnot get VERSION from localhost:11211
command exited with code:1
GetOptions(
   'H=s' => my $HOST,
   'p=s' => my $PORT,
);

my $sock = IO::Socket::INET->new(
   PeerAddr => $HOST, PeerPort => $PORT
);
if ( !$sock ) {
    print "couldnot connect to $HOST:$PORT: $!n";
    exit(3); ##UNKNOWN
}

$sock->syswrite("versionrn");
$sock->sysread( my $result, 16 );
if ( $result =~ m!^VERSION! ) {
    exit(0); ##OK
}

print "couldnot get VERSION from $HOST:$PORTn";
exit(1); ##CLITICAL
GetOptions(                                      $sock->syswrite("stats settingsrn");
    'H=s' =>   my   $HOST,
                                                 $sock->sysread(my $r_setting, 8192 );
    'p=s' =>   my   $PORT,
                                                 my %setting;
    ‘w=i' =>   my   $WARN,
                                                 foreach my $line ( split /r?n/, $r_setting )
    'c=i' =>   my   $CRITICAL,
                                                 {
);
                                                 	    if ( $line =~ /^STATs([^ ]+)s(.+)$/ ) {
                                                 	    	    $setting{$1} = $2;
my $sock = IO::Socket::INET->new(
                                                 	    }
   PeerAddr => $HOST, PeerPort => $PORT
                                                 }
);
                                                 my $rate = $stats{curr_connections}
$sock->syswrite("statsrn");                               / $setting{maxconns} * 100;
$sock->sysread(my $r_stats, 8192 );              if ( $rate >= $CRITICAL ) {
my %stats;                                       	    printf "conn/max = %d%%n",$rate;
foreach my $line ( split /r?n/, $r_stats ) {   	    exit(2); #CRTICAL
	    if ( $line =~ /^STATs([^ ]+)s(.+)$/ ) {   }
	    	    $stats{$1} = $2;                       elsif ( $rate >=$WARN ) {
	    }                                           	    printf "conn/max = %d%%n", $rate;
}                                                	    exit(1); #WARNING
                                                 }
                                                 exit(0); #OK
stats                         stats settings
STAT pid 4695                 STAT maxbytes 67108864
STAT uptime 84017             STAT maxconns 300000
STAT time 1285600226          STAT tcpport 11211
STAT version 1.4.2            STAT udpport 11211
STAT pointer_size 64          STAT inter NULL
STAT rusage_user 0.000000     STAT verbosity 0
STAT rusage_system 0.020000   STAT oldest 0
STAT curr_connections 10      STAT evictions on
STAT total_connections 16     STAT domain_socket NULL
STAT cmd_get 0                STAT umask 700
...                           STAT growth_factor 1.25
STAT bytes 0                  STAT chunk_size 48
STAT curr_items 0             STAT num_threads 4
STAT total_items 0            ..
STAT evictions 0              STAT item_size_max 1048576
END                           END
$ cronlog -- ./memconn.pl -H localhost -p 11211 
                          -w 80 -c 90
srv1 starting: memconn.pl -H localhost -p 11211 -w 80
-c 90
conn/max = 91
command exited with code:2
define service{
  use                     generic-service
  host_name               srv1
  service_description     Memcached Connection
  check_command           check_memcached_conn
  normal_check_interval   10
  retry_check_interval    2
  max_check_attempts      3
  notification_options    w,u,c,r
}

define command{
  command_name   check_memcached_conn
  command_line     $USER1$/memconn.pl
    -H $HOSTADDRESS$ 
    -p 11211 
    -c 90 -w 80
}
#!/bin/sh

exec 2>&1
exec /usr/bin/memcached -c 32768 -u nobody 
              -C -m 16G -p 11211 -U 0 -v
5 min




                t


        1 sec
GetOptions(
    'H=s' => my $HOST,
    'p=s' => my $PORT,
    'c=i' => my $CRITICAL,
);

my $sock = IO::Socket::INET->new(
   PeerAddr => $HOST, PeerPort => $PORT
);

$sock->syswrite("statsrn");
$sock->sysread(my $r_stats, 8192 );
my %stats;
foreach my $line ( split /r?n/, $r_stats ) {
	   if ( $line =~ /^STATs([^ ]+)s(.+)$/ ) {
	   	    $stats{$1} = $2;
	   }
}

if ( $stat{uptime} <= $CRITICAL ) {
	   printf "uptime: %dn", $stat{uptime};
	   exit(2); #CRTICAL
}
exit(0);
define service{
   use                     generic-service
   host_name               srv1
   service_description     Memcached Uptime
   check_command           check_memcached_uptime
   normal_check_interval   5
   retry_check_interval    5
   max_check_attempts      1
   notification_options    c
}
define command{
  command_name   check_memcached_uptime
  command_line     $USER1$/check_memcahced_uptime.pl 
    -H $HOSTADDRESS$ -p 11211 
    -c 310
}
Shibuya.pm#14 memcached運用監視ノウハウ
Shibuya.pm#14 memcached運用監視ノウハウ

More Related Content

More from Masahiro Nagano

メルカリでのNorikraの活用、 Mackerelを添えて
メルカリでのNorikraの活用、 Mackerelを添えてメルカリでのNorikraの活用、 Mackerelを添えて
メルカリでのNorikraの活用、 Mackerelを添えてMasahiro Nagano
 
Gazelle & CPAN modules for performance. Shibuya.pm Tech Talk #17 LT
Gazelle & CPAN modules for performance. Shibuya.pm Tech Talk #17 LTGazelle & CPAN modules for performance. Shibuya.pm Tech Talk #17 LT
Gazelle & CPAN modules for performance. Shibuya.pm Tech Talk #17 LTMasahiro Nagano
 
Mackerel & Norikra mackerel meetup #4 LT
Mackerel & Norikra mackerel meetup #4 LTMackerel & Norikra mackerel meetup #4 LT
Mackerel & Norikra mackerel meetup #4 LTMasahiro Nagano
 
ISUCON4 予選問題で(中略)、”my.cnf”に1行だけ足して予選通過ラインを突破するの術
ISUCON4 予選問題で(中略)、”my.cnf”に1行だけ足して予選通過ラインを突破するの術ISUCON4 予選問題で(中略)、”my.cnf”に1行だけ足して予選通過ラインを突破するの術
ISUCON4 予選問題で(中略)、”my.cnf”に1行だけ足して予選通過ラインを突破するの術Masahiro Nagano
 
Isucon makers casual talks
Isucon makers casual talksIsucon makers casual talks
Isucon makers casual talksMasahiro Nagano
 
blogサービスの全文検索の話 - #groonga を囲む夕べ
blogサービスの全文検索の話 - #groonga を囲む夕べblogサービスの全文検索の話 - #groonga を囲む夕べ
blogサービスの全文検索の話 - #groonga を囲む夕べMasahiro Nagano
 
Gazelle - Plack Handler for performance freaks #yokohamapm
Gazelle - Plack Handler for performance freaks #yokohamapmGazelle - Plack Handler for performance freaks #yokohamapm
Gazelle - Plack Handler for performance freaks #yokohamapmMasahiro Nagano
 
Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014
Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014
Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014Masahiro Nagano
 
Web Framework Benchmarksと Perl の現状報告会 YAPC::Asia Tokyo 2014 LT
Web Framework Benchmarksと Perl の現状報告会 YAPC::Asia Tokyo 2014 LTWeb Framework Benchmarksと Perl の現状報告会 YAPC::Asia Tokyo 2014 LT
Web Framework Benchmarksと Perl の現状報告会 YAPC::Asia Tokyo 2014 LTMasahiro Nagano
 
ISUCONで学ぶ Webアプリケーションのパフォーマンス向上のコツ 実践編 完全版
ISUCONで学ぶ Webアプリケーションのパフォーマンス向上のコツ 実践編 完全版ISUCONで学ぶ Webアプリケーションのパフォーマンス向上のコツ 実践編 完全版
ISUCONで学ぶ Webアプリケーションのパフォーマンス向上のコツ 実践編 完全版Masahiro Nagano
 
Webアプリケーションの パフォーマンス向上のコツ 実践編
 Webアプリケーションの パフォーマンス向上のコツ 実践編 Webアプリケーションの パフォーマンス向上のコツ 実践編
Webアプリケーションの パフォーマンス向上のコツ 実践編Masahiro Nagano
 
Webアプリケーションの パフォーマンス向上のコツ 概要編
 Webアプリケーションの パフォーマンス向上のコツ 概要編 Webアプリケーションの パフォーマンス向上のコツ 概要編
Webアプリケーションの パフォーマンス向上のコツ 概要編Masahiro Nagano
 
Webアプリケーションとメモリ
WebアプリケーションとメモリWebアプリケーションとメモリ
WebアプリケーションとメモリMasahiro Nagano
 
最近作ったN個のCPANモジュール Yokohama.pm #10
最近作ったN個のCPANモジュール Yokohama.pm #10最近作ったN個のCPANモジュール Yokohama.pm #10
最近作ったN個のCPANモジュール Yokohama.pm #10Masahiro Nagano
 
『How to build a High Performance PSGI/Plack Server』のその後と ISUCON3を受けての話題
『How to build a High Performance PSGI/Plack Server』のその後と ISUCON3を受けての話題『How to build a High Performance PSGI/Plack Server』のその後と ISUCON3を受けての話題
『How to build a High Performance PSGI/Plack Server』のその後と ISUCON3を受けての話題Masahiro Nagano
 
How to build a High Performance PSGI/Plack Server
How to build a High Performance PSGI/Plack Server How to build a High Performance PSGI/Plack Server
How to build a High Performance PSGI/Plack Server Masahiro Nagano
 
Apache::LogFormat::Compiler YAPC::Asia 2013 Tokyo LT-Thon
Apache::LogFormat::Compiler YAPC::Asia 2013 Tokyo LT-ThonApache::LogFormat::Compiler YAPC::Asia 2013 Tokyo LT-Thon
Apache::LogFormat::Compiler YAPC::Asia 2013 Tokyo LT-ThonMasahiro Nagano
 
1台から500台までのMySQL運用(YAPC::Asia編)
1台から500台までのMySQL運用(YAPC::Asia編)1台から500台までのMySQL運用(YAPC::Asia編)
1台から500台までのMySQL運用(YAPC::Asia編)Masahiro Nagano
 

More from Masahiro Nagano (20)

メルカリでのNorikraの活用、 Mackerelを添えて
メルカリでのNorikraの活用、 Mackerelを添えてメルカリでのNorikraの活用、 Mackerelを添えて
メルカリでのNorikraの活用、 Mackerelを添えて
 
Gazelle & CPAN modules for performance. Shibuya.pm Tech Talk #17 LT
Gazelle & CPAN modules for performance. Shibuya.pm Tech Talk #17 LTGazelle & CPAN modules for performance. Shibuya.pm Tech Talk #17 LT
Gazelle & CPAN modules for performance. Shibuya.pm Tech Talk #17 LT
 
Mackerel & Norikra mackerel meetup #4 LT
Mackerel & Norikra mackerel meetup #4 LTMackerel & Norikra mackerel meetup #4 LT
Mackerel & Norikra mackerel meetup #4 LT
 
ISUCON4 予選問題で(中略)、”my.cnf”に1行だけ足して予選通過ラインを突破するの術
ISUCON4 予選問題で(中略)、”my.cnf”に1行だけ足して予選通過ラインを突破するの術ISUCON4 予選問題で(中略)、”my.cnf”に1行だけ足して予選通過ラインを突破するの術
ISUCON4 予選問題で(中略)、”my.cnf”に1行だけ足して予選通過ラインを突破するの術
 
Isucon makers casual talks
Isucon makers casual talksIsucon makers casual talks
Isucon makers casual talks
 
blogサービスの全文検索の話 - #groonga を囲む夕べ
blogサービスの全文検索の話 - #groonga を囲む夕べblogサービスの全文検索の話 - #groonga を囲む夕べ
blogサービスの全文検索の話 - #groonga を囲む夕べ
 
Gazelle - Plack Handler for performance freaks #yokohamapm
Gazelle - Plack Handler for performance freaks #yokohamapmGazelle - Plack Handler for performance freaks #yokohamapm
Gazelle - Plack Handler for performance freaks #yokohamapm
 
Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014
Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014
Dockerで遊んでみよっかー YAPC::Asia Tokyo 2014
 
Web Framework Benchmarksと Perl の現状報告会 YAPC::Asia Tokyo 2014 LT
Web Framework Benchmarksと Perl の現状報告会 YAPC::Asia Tokyo 2014 LTWeb Framework Benchmarksと Perl の現状報告会 YAPC::Asia Tokyo 2014 LT
Web Framework Benchmarksと Perl の現状報告会 YAPC::Asia Tokyo 2014 LT
 
ISUCONで学ぶ Webアプリケーションのパフォーマンス向上のコツ 実践編 完全版
ISUCONで学ぶ Webアプリケーションのパフォーマンス向上のコツ 実践編 完全版ISUCONで学ぶ Webアプリケーションのパフォーマンス向上のコツ 実践編 完全版
ISUCONで学ぶ Webアプリケーションのパフォーマンス向上のコツ 実践編 完全版
 
Webアプリケーションの パフォーマンス向上のコツ 実践編
 Webアプリケーションの パフォーマンス向上のコツ 実践編 Webアプリケーションの パフォーマンス向上のコツ 実践編
Webアプリケーションの パフォーマンス向上のコツ 実践編
 
Webアプリケーションの パフォーマンス向上のコツ 概要編
 Webアプリケーションの パフォーマンス向上のコツ 概要編 Webアプリケーションの パフォーマンス向上のコツ 概要編
Webアプリケーションの パフォーマンス向上のコツ 概要編
 
Webアプリケーションとメモリ
WebアプリケーションとメモリWebアプリケーションとメモリ
Webアプリケーションとメモリ
 
最近作ったN個のCPANモジュール Yokohama.pm #10
最近作ったN個のCPANモジュール Yokohama.pm #10最近作ったN個のCPANモジュール Yokohama.pm #10
最近作ったN個のCPANモジュール Yokohama.pm #10
 
『How to build a High Performance PSGI/Plack Server』のその後と ISUCON3を受けての話題
『How to build a High Performance PSGI/Plack Server』のその後と ISUCON3を受けての話題『How to build a High Performance PSGI/Plack Server』のその後と ISUCON3を受けての話題
『How to build a High Performance PSGI/Plack Server』のその後と ISUCON3を受けての話題
 
How to build a High Performance PSGI/Plack Server
How to build a High Performance PSGI/Plack Server How to build a High Performance PSGI/Plack Server
How to build a High Performance PSGI/Plack Server
 
Apache::LogFormat::Compiler YAPC::Asia 2013 Tokyo LT-Thon
Apache::LogFormat::Compiler YAPC::Asia 2013 Tokyo LT-ThonApache::LogFormat::Compiler YAPC::Asia 2013 Tokyo LT-Thon
Apache::LogFormat::Compiler YAPC::Asia 2013 Tokyo LT-Thon
 
MHA for MySQL の話
MHA for MySQL の話MHA for MySQL の話
MHA for MySQL の話
 
1台から500台までのMySQL運用(YAPC::Asia編)
1台から500台までのMySQL運用(YAPC::Asia編)1台から500台までのMySQL運用(YAPC::Asia編)
1台から500台までのMySQL運用(YAPC::Asia編)
 
監視ツールの話
監視ツールの話監視ツールの話
監視ツールの話
 

Shibuya.pm#14 memcached運用監視ノウハウ

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11. P D A C
  • 12.
  • 13.
  • 14.
  • 15. $ pgrep memcached 4695 $ pgrep memcached $
  • 16. $ pgrep memcached 4695 $ echo $? 0 $ pgrep memcached $ $ echo $? 1
  • 17. $ cronlog -- pgrep memcached $ $ cronlog -- pgrep memcached srv1 starting: pgrep memcached command exited with code:1
  • 18. MAILTO=”ops@example.com” 5 * * * * cronlog -- pgrep memcached >&1
  • 19. $ nc -z -w 4 localhost 11211 $ cronlog -- nc -w 1 -z localhost 11211 srv1 starting: nc -w 1 -z localhost 11211 command exited with code:1
  • 20. GetOptions( 'H=s' => my $HOST, 'p=s' => my $PORT, ); my $sock = IO::Socket::INET->new( PeerAddr => $HOST, PeerPort => $PORT ); if ( !$sock ) { print "couldnot connect to $HOST:$PORT: $!n"; exit(1); } $sock->syswrite("versionrn"); $sock->sysread( my $result, 16 ); if ( $result =~ m!^VERSION! ) { exit(0); } print "couldnot get VERSION from $HOST:$PORTn"; exit(1);
  • 21. $ cronlog -- ./version.pl -H localhost -p 11211 srv1 starting: perl version.pl -H localhost -p 11211 couldnot get VERSION from localhost:11211 command exited with code:1
  • 22.
  • 23. GetOptions( 'H=s' => my $HOST, 'p=s' => my $PORT, ); my $sock = IO::Socket::INET->new( PeerAddr => $HOST, PeerPort => $PORT ); if ( !$sock ) { print "couldnot connect to $HOST:$PORT: $!n"; exit(3); ##UNKNOWN } $sock->syswrite("versionrn"); $sock->sysread( my $result, 16 ); if ( $result =~ m!^VERSION! ) { exit(0); ##OK } print "couldnot get VERSION from $HOST:$PORTn"; exit(1); ##CLITICAL
  • 24. GetOptions( $sock->syswrite("stats settingsrn"); 'H=s' => my $HOST, $sock->sysread(my $r_setting, 8192 ); 'p=s' => my $PORT, my %setting; ‘w=i' => my $WARN, foreach my $line ( split /r?n/, $r_setting ) 'c=i' => my $CRITICAL, { ); if ( $line =~ /^STATs([^ ]+)s(.+)$/ ) { $setting{$1} = $2; my $sock = IO::Socket::INET->new( } PeerAddr => $HOST, PeerPort => $PORT } ); my $rate = $stats{curr_connections} $sock->syswrite("statsrn"); / $setting{maxconns} * 100; $sock->sysread(my $r_stats, 8192 ); if ( $rate >= $CRITICAL ) { my %stats; printf "conn/max = %d%%n",$rate; foreach my $line ( split /r?n/, $r_stats ) { exit(2); #CRTICAL if ( $line =~ /^STATs([^ ]+)s(.+)$/ ) { } $stats{$1} = $2; elsif ( $rate >=$WARN ) { } printf "conn/max = %d%%n", $rate; } exit(1); #WARNING } exit(0); #OK
  • 25. stats stats settings STAT pid 4695 STAT maxbytes 67108864 STAT uptime 84017 STAT maxconns 300000 STAT time 1285600226 STAT tcpport 11211 STAT version 1.4.2 STAT udpport 11211 STAT pointer_size 64 STAT inter NULL STAT rusage_user 0.000000 STAT verbosity 0 STAT rusage_system 0.020000 STAT oldest 0 STAT curr_connections 10 STAT evictions on STAT total_connections 16 STAT domain_socket NULL STAT cmd_get 0 STAT umask 700 ... STAT growth_factor 1.25 STAT bytes 0 STAT chunk_size 48 STAT curr_items 0 STAT num_threads 4 STAT total_items 0 .. STAT evictions 0 STAT item_size_max 1048576 END END
  • 26. $ cronlog -- ./memconn.pl -H localhost -p 11211 -w 80 -c 90 srv1 starting: memconn.pl -H localhost -p 11211 -w 80 -c 90 conn/max = 91 command exited with code:2
  • 27. define service{ use generic-service host_name srv1 service_description Memcached Connection check_command check_memcached_conn normal_check_interval 10 retry_check_interval 2 max_check_attempts 3 notification_options w,u,c,r } define command{ command_name check_memcached_conn command_line $USER1$/memconn.pl -H $HOSTADDRESS$ -p 11211 -c 90 -w 80 }
  • 28. #!/bin/sh exec 2>&1 exec /usr/bin/memcached -c 32768 -u nobody -C -m 16G -p 11211 -U 0 -v
  • 29. 5 min t 1 sec
  • 30. GetOptions( 'H=s' => my $HOST, 'p=s' => my $PORT, 'c=i' => my $CRITICAL, ); my $sock = IO::Socket::INET->new( PeerAddr => $HOST, PeerPort => $PORT ); $sock->syswrite("statsrn"); $sock->sysread(my $r_stats, 8192 ); my %stats; foreach my $line ( split /r?n/, $r_stats ) { if ( $line =~ /^STATs([^ ]+)s(.+)$/ ) { $stats{$1} = $2; } } if ( $stat{uptime} <= $CRITICAL ) { printf "uptime: %dn", $stat{uptime}; exit(2); #CRTICAL } exit(0);
  • 31. define service{ use generic-service host_name srv1 service_description Memcached Uptime check_command check_memcached_uptime normal_check_interval 5 retry_check_interval 5 max_check_attempts 1 notification_options c } define command{ command_name check_memcached_uptime command_line $USER1$/check_memcahced_uptime.pl -H $HOSTADDRESS$ -p 11211 -c 310 }

Editor's Notes