Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
3
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

CloudWatch Monitoring Scriptsを使ったメモリ使用量取得時の注意点

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では適切にインスタンスを増減させることができない。

メモリ使用量については、どのように算出されているものか確認してみると良い。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
3
Help us understand the problem. What are the problem?