用脚本监控EC2的内存和磁盘指标
熟悉ec2界面的同学都知道,选中某台ec2,下面有个tab名叫monitor,可以看到很多指标如cpu,磁盘读写,网络进出等,但是却没有内存占用监控,这是出于安全性的考虑,毕竟内存中可是加载着数据的,所以就需要我们亲自动手实现了。
-- D.C
应用场景:对于初次使用aws的童鞋来说,如果根据手头的分析流程来判断所需的计算资源,也许是一个头疼的事情。配置选低了,测试跑断掉,配置选高了,浪费多余的计算资源,费钱!所以通常的做法是,选个适当偏大的配置,跑一遍流程,再回头看整个分析过程中的CPU占用和内存占用,来反推一个合适的配置,作为我们以后常用的分析机型。
那么cpu监控是默认的,我就只要实现内存监控了,其实很简单,总的监控流: 创建IAM Role - Role赋给ec2- 监控脚本 - 日志输出到cloudwatch - 查看日志
创建IAM Role
这个IAM角色是要赋给ec2,让它有权限把监控信息给到CloudWatch。
-
cloudwatch:PutMetricData
-
cloudwatch:GetMetricStatistics
-
cloudwatch:ListMetrics
-
ec2:DescribeTags
-
IAM控制界面进去,点击Policy,如下图新建一个policy,命名为
watch_ec2_mem
。
- IAM控制界面左侧,点击Role,如下图新建一个角色,选中刚刚创建的策略 watch_ec2_mem,命名为
ec2_mem_cw
。
- 选中ec2机器,点击 Actions - Instance Settings - Attach/Replace IAM Role, 选中上一步新建的Role黄马甲,给它穿上。
ec2上安装监控脚本
- 连接到要监控的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
- 下载、解压缩并配置 CloudWatch 监控脚本。
$ 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
监控脚本的程序包中包含以下文件:
- CloudWatchClient.pm – 共享 Perl 模块,以简化从其他脚本调用 Amazon CloudWatch 的过程。
- mon-put-instance-data.pl – 收集 Amazon EC2 实例中的系统指标(内存、交换、磁盘空间利用率)并将其发送到 Amazon CloudWatch。
- mon-get-instance-stats.pl – 查询 Amazon CloudWatch 并显示在其上执行此脚本的 EC2 实例的最近利用率统计数据。
- awscreds.template – AWS 凭据的文件模板,储存您的访问密钥 ID 和私有访问密钥。
- LICENSE.txt – 包含 Apache 2.0 许可证的文本文件。
- NOTICE.txt – 版权声明。
运行监控脚本
- Usage: mon-put-instance-data.pl, 此脚本会收集当前系统的内存、交换和磁盘空间使用率数据。然后远程调用 Amazon CloudWatch,以自定义指标的形式报告收集到的数据。
名称 | 描述 |
---|---|
--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
- Usage: mon-get-instance-stats.pl , 此脚本可查询最近一段时间 CloudWatch 中有关内存、交换和磁盘空间指标的统计数据,比如测试流程跑完以后,运行此脚本查看结果。
名称 | 描述 |
---|---|
--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%
日日不辍,方得始终。