Auto Scalingの基準にカスタムスクリプトのメモリ使用量を使う
Amazon CloudWatch Monitoring Scripts for Linux から得られる情報を使って、 Auto Scaling でインスタンスを増減させようと思ったときに、このスクリプトで取得できるメモリ量について少し考えてしまったのでメモを残す。
http://www.slideshare.net/AmazonWebServicesJapan/aws-black-belt-tech-amazon-cloudwatch-auto-scaling/14
http://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/DeveloperGuide/mon-scripts-perl.html
空きメモリとは何か
下記で提供されているスクリプトのコード(mon-put-instance-data.pl)を読んでみると、メモリに関する情報は /proc/meminfo から取得していることがわかる。
また、 MemFree + Cached + Buffers の値が、 Memory Available になることがわかる。このことから、 Cached と Buffers にカウントされているキャッシュは、このスクリプトでは Available な領域と定義されていることがわかる。
# meminfo values are in kilobytes
my $mem_total = $meminfo{'MemTotal'} * KILO;
my $mem_free = $meminfo{'MemFree'} * KILO;
my $mem_cached = $meminfo{'Cached'} * KILO;
my $mem_buffers = $meminfo{'Buffers'} * KILO;
my $mem_avail = $mem_free;
if (!defined($mem_used_incl_cache_buff)) {
$mem_avail += $mem_cached + $mem_buffers;
}
my $mem_used = $mem_total - $mem_avail;
my $swap_total = $meminfo{'SwapTotal'} * KILO;
my $swap_free = $meminfo{'SwapFree'} * KILO;
my $swap_used = $swap_total - $swap_free;
if ($report_mem_util) {
my $mem_util = 0;
$mem_util = 100 * $mem_used / $mem_total if ($mem_total > 0);
add_metric('MemoryUtilization', 'Percent', $mem_util);
}
if ($report_mem_used) {
add_metric('MemoryUsed', $mem_units, $mem_used / $mem_unit_div);
}
if ($report_mem_avail) {
add_metric('MemoryAvailable', $mem_units, $mem_avail / $mem_unit_div);
}
if ($report_swap_util) {
my $swap_util = 0;
$swap_util = 100 * $swap_used / $swap_total if ($swap_total > 0);
add_metric('SwapUtilization', 'Percent', $swap_util);
}
if ($report_swap_used) {
add_metric('SwapUsed', $mem_units, $swap_used / $mem_unit_div);
}
一方、Linux上で運用する dentry cache は上記の Cached + Buffers には含まれない。dentry cache が増えていくと、MemFreeが減っていくのだが、このスクリプトからはそれを知ることができない。Memory Available が減っていても dentry cache が適切に利用されていない場合では、この値を基準にしたAuto Scalingによるインスタンス増減が本当に問題がないか考える必要がある。たとえば下記のような意図しない negative dentry 増大化が発生した場合、このカスタムメトリクスから取得できるMemory Availableでは適切にインスタンスを増減させることができない。
メモリ使用量については、どのように算出されているものか確認してみると良い。