用脚本监控EC2的内存和磁盘指标

熟悉ec2界面的同学都知道,选中某台ec2,下面有个tab名叫monitor,可以看到很多指标如cpu,磁盘读写,网络进出等,但是却没有内存占用监控,这是出于安全性的考虑,毕竟内存中可是加载着数据的,所以就需要我们亲自动手实现了。

-- D.C

应用场景:对于初次使用aws的童鞋来说,如果根据手头的分析流程来判断所需的计算资源,也许是一个头疼的事情。配置选低了,测试跑断掉,配置选高了,浪费多余的计算资源,费钱!所以通常的做法是,选个适当偏大的配置,跑一遍流程,再回头看整个分析过程中的CPU占用和内存占用,来反推一个合适的配置,作为我们以后常用的分析机型。

那么cpu监控是默认的,我就只要实现内存监控了,其实很简单,总的监控流: 创建IAM Role - Role赋给ec2- 监控脚本 - 日志输出到cloudwatch - 查看日志

创建IAM Role

这个IAM角色是要赋给ec2,让它有权限把监控信息给到CloudWatch。

  1. cloudwatch:PutMetricData

  2. cloudwatch:GetMetricStatistics

  3. cloudwatch:ListMetrics

  4. ec2:DescribeTags

  5. IAM控制界面进去,点击Policy,如下图新建一个policy,命名为watch_ec2_mem

iam_policy

iam_role

iam_attach

ec2上安装监控脚本

Linux

sudo yum install -y perl-Switch perl-DateTime perl-Sys-Syslog perl-LWP-Protocol-https perl-Digest-SHA.x86_64

Ubuntu

sudo apt-get update
sudo apt-get install unzip
sudo apt-get install libwww-perl libdatetime-perl
$ curl https://aws-cloudwatch.s3.amazonaws.com/downloads/CloudWatchMonitoringScripts-1.2.2.zip -O
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 24225  100 24225    0     0  12736      0  0:00:01  0:00:01 --:--:-- 12729
unzip CloudWatchMonitoringScripts-1.2.2.zip && \
rm CloudWatchMonitoringScripts-1.2.2.zip && \
cd aws-scripts-mon

监控脚本的程序包中包含以下文件:

  1. CloudWatchClient.pm – 共享 Perl 模块,以简化从其他脚本调用 Amazon CloudWatch 的过程。
  2. mon-put-instance-data.pl – 收集 Amazon EC2 实例中的系统指标(内存、交换、磁盘空间利用率)并将其发送到 Amazon CloudWatch。
  3. mon-get-instance-stats.pl – 查询 Amazon CloudWatch 并显示在其上执行此脚本的 EC2 实例的最近利用率统计数据。
  4. awscreds.template – AWS 凭据的文件模板,储存您的访问密钥 ID 和私有访问密钥。
  5. LICENSE.txt – 包含 Apache 2.0 许可证的文本文件。
  6. NOTICE.txt – 版权声明。

运行监控脚本

名称 描述
--mem-util 以百分比收集和发送 MemoryUtilization 指标。此指标计算应用程序分配和操作系统使用的内存,如果您指定 --mem-used-incl-cache-buff 选项,则还将缓存和缓冲区内存包括在已用内存中。
--mem-used 收集和发送 MemoryUsed 指标 (以兆字节报告)。此指标计算应用程序分配和操作系统使用的内存,如果您指定 --mem-used-incl-cache-buff 选项,则还将缓存和缓冲区内存包括在已用内存中。
--mem-used-incl-cache-buff 如果包括此选项,则在报告 --mem-util、--mem-used 和 --mem-avail 的指标时,当前用于缓存和缓冲区的内存将计为“已用”。
--mem-avail 收集和发送 MemoryAvailable 指标 (以兆字节报告)。此指标计算应用程序分配和操作系统使用的内存,如果您指定 --mem-used-incl-cache-buff 选项,则还将缓存和缓冲区内存包括在已用内存中。
--swap-util 收集和发送 SwapUtilization 指标 (以百分比报告)。
--swap-used 收集和发送 SwapUsed 指标 (以兆字节报告)。
--disk-path=PATH 选择要报告的磁盘。PATH 可以为需要报告的文件系统指定装入点或装入点上的任何文件。如需选择多个磁盘,请为每个磁盘分别指定 --disk-path=PATH。
要为装载于 / 和 /home 位置的文件系统选择磁盘,请使用下列参数:--disk-path=/ --disk-path=/home
--disk-space-util 收集和发送选定磁盘的 DiskSpaceUtilization 指标。指标以百分比报告。请注意,此脚本计算的磁盘使用率指标与 df -k -l 命令计算的值不同。如果您认为 df -k -l 计算的值更有用,则可以在脚本中更改计算结果。
--disk-space-used 收集和发送选定磁盘的 DiskSpaceUsed 指标。指标默认以千兆字节报告。受限于 Linux 操作系统中的保留磁盘空间,已用磁盘空间和可用磁盘空间可能无法准确相加得到磁盘空间总量。
--disk-space-avail 收集和发送选定磁盘的 DiskSpaceAvailable 指标。指标以千兆字节报告。受限于 Linux 操作系统中的保留磁盘空间,已用磁盘空间和可用磁盘空间可能无法准确相加得到磁盘空间总量。
--memory-units=UNITS 指定报告内存使用率所采用的单位。如果不指定,则内存以兆字节报告。单位可以是以下一种:字节、千字节、兆字节、千兆字节。
--disk-space-units=UNITS 指定报告磁盘空间使用率所采用的单位。如果不指定,则磁盘空间以千兆字节报告。单位可以是以下一种:字节、千字节、兆字节、千兆字节。
--aws-credential- file=PATH 提供包含 AWS 凭证的文件的位置。此参数不能与 --aws-access-key-id 和 --aws-secret-key 参数一起使用。
--aws-access-key-id=VALUE 指定用于识别发起人的 AWS 访问密钥 ID。必须与 --aws-secret-key 选项一起使用。不要将该选项与 --aws-credential-file 参数一起使用。
--aws-secret-key=VALUE 指定用于签署 CloudWatch 请求的 AWS 秘密访问密钥。必须与 --aws-access-key-id 选项一起使用。不要将该选项与 --aws-credential-file 参数一起使用。
--aws-iam-role=VALUE 指定用于提供 AWS 凭证的 IAM 角色。必须提供 =VALUE 值。如果不指定凭证,则会应用与 EC2 实例关联的默认 IAM 角色。只能使用一个 IAM 角色。如果未找到任何 IAM 角色,或者找到多个 IAM 角色,则脚本会返回一条错误信息。
--aggregated[=only] 为实例类型、AMI ID 及区域整体情况添加聚合指数。=only 值是可选的,如果指定,则脚本只报告聚合指标。
--auto-scaling[=only] 为 Auto Scaling 组添加聚合指标。=only 值为可选,如果指定,则脚本只会报告 Auto Scaling 指标。使用脚本与 IAM 账户或角色关联的 IAM 策略必须有权调用 EC2 操作 DescribeTags。
--verify 会对收集指标的脚本执行一次试运行,准备完整 HTTP 请求,但是不会调用 CloudWatch 以报告数据。该选项还会检查是否已提供凭证。在详细模式中运行时,该选项输出的指标会发送到 CloudWatch。
--from-cron 从 cron 调用脚本时,请使用该选项。使用该选项时,会阻止所有诊断输出,但错误消息会发送到用户账户的本地系统日志。
--verbose 显示脚本正在处理的内容的详细信息。
--help 显示使用率信息。
--version 显示脚本的版本号。

示例:

执行简单的测试运行而不将数据发布到 CloudWatch

$./mon-put-instance-data.pl --mem-util --verify --verbose

MemoryUtilization: 2.12321017949643 (Percent)
No credential methods are specified. Trying default IAM role.
Using IAM role <ec2_mem_cw>
Endpoint: https://monitoring.cn-northwest-1.amazonaws.com.cn
Payload: {"MetricData":[{"Timestamp":1580913053,"Dimensions":[{"Value":"i-0c98d995ecb670e50","Name":"InstanceId"}],"Value":2.12321017949643,"Unit":"Percent","MetricName":"MemoryUtilization"}],"Namespace":"System/Linux","__type":"com.amazonaws.cloudwatch.v2010_08_01#PutMetricDataInput"}

Verification completed successfully. No actual metrics sent to CloudWatch.

收集所有可用内存指标并将其发送到 CloudWatch,将缓存和缓冲区内存计为“已用”

$./mon-put-instance-data.pl --mem-used-incl-cache-buff --mem-util --mem-used --mem-avail

收集 Auto Scaling 组的聚合指标并将其发送到 Amazon CloudWatch,但不报告单独的实例指标。

$./mon-put-instance-data.pl --mem-util --mem-used --mem-avail --auto-scaling=only

收集实例类型、AMI ID 和区域的聚合指标并将其发送到 Amazon CloudWatch,但不报告单独的实例指标

$./mon-put-instance-data.pl --mem-util --mem-used --mem-avail --aggregated=only

[重要] 为报告CloudWatch的指标制定 cron 计划:运行crontab -e 命令开始编辑 crontab,添加下列命令保存并退出,每 5 分钟将 内存和磁盘 空间使用率报告到 CloudWatch:

*/5 * * * * ~/aws-scripts-mon/mon-put-instance-data.pl --mem-used-incl-cache-buff --mem-util --disk-space-util --disk-path=/ --from-cron
名称 描述
--recent-hours=N 指定报告依据的最近小时数,由 N 表示,其中 N 是一个整数。
--aws-credential-file=PATH 提供包含 AWS 凭证的文件的位置。
--aws-access-key-id=VALUE 指定用于识别发起人的 AWS 访问密钥 ID。必须与 --aws-secret-key 选项一起使用。不要将该选项与 --aws-credential-file 选项一起使用。
--aws-secret-key=VALUE 指定用于签署 CloudWatch 请求的 AWS 秘密访问密钥。必须与 --aws-access-key-id 选项一起使用。不要将该选项与 --aws-credential-file 选项一起使用。
--aws-iam-role=VALUE 指定用于提供 AWS 凭证的 IAM 角色。必须提供 =VALUE 值。如果不指定凭证,则会应用与 EC2 实例关联的默认 IAM 角色。只能使用一个 IAM 角色。如果未找到任何 IAM 角色,或者找到多个 IAM 角色,则脚本会返回一条错误信息。请勿将该选项与 --aws-credential-file、--aws-access-key-id 或 --aws-secret-key 参数一起使用。
--verify 执行脚本的测试运行。该选项还会检查是否已提供凭证。
--verbose 显示脚本正在处理的内容的详细信息。
--help 显示使用率信息。
--version 显示脚本的版本号。

示例:

要获得最近 12 小时的使用率统计数据,请运行以下命令:

$./mon-get-instance-stats.pl --recent-hours=12

Instance i-0098d895ecb678e80 statistics for the last 12 hours.

CPU Utilization
    Average: 0.01%, Minimum: 0.00%, Maximum: 3.00%

Memory Utilization
    Average: 7.41%, Minimum: 7.41%, Maximum: 7.42%

Swap Utilization
    Average: N/A, Minimum: N/A, Maximum: N/A

Disk Space Utilization for /dev/nvme0n1p1 mounted on /
    Average: 2.63%, Minimum: 2.63%, Maximum: 2.63%

日日不辍,方得始终。