我在Amazon EC2上的Ubuntu 14上运行了一个Node.js应用程序。
我希望在内存使用量达到特定大小的情况下发送电子邮件。
我知道PM2公开了一个API,允许在达到一定量的内存使用量时重启应用程序。现在我不想重新启动应用程序,只是为了获得有关它的通知,并根据我的需要做任何事情(在我的情况下,发送电子邮件)。
如何使用PM2或任何其他免费工具进行此操作?
答案 0 :(得分:6)
答案是使用AWS CloudWatch警报。它们是free tier eligible并且有一个很好的仪表板。详细设置在this documentation guide中进行了描述,但我建议您按照我的步骤确保它适合您。
您需要做的第一件事是启动可写入CloudWatch的新Ubuntu EC2实例。这涉及具有权限的新IAM角色。 (您无法将新角色附加到现有实例 - 请参阅第二个注意: here。)。 您不再需要启动EC2实例来更改IAM角色。 See announcement。
您接下来要采取的措施是:安装AWS创作的perl脚本,以便您可以写入CloudWatch。每五分钟添加一个新的cron写入CloudWatch。
最后在CloudWatch控制台中创建新警报,以便在内存使用率超过特定阈值时通过电子邮件发送给您。
以下是上面列出的每个阶段的步骤:
$ sudo apt-get update
$ sudo apt-get install unzip
$ sudo apt-get install libwww-perl libdatetime-perl
curl http://aws-cloudwatch.s3.amazonaws.com/downloads/CloudWatchMonitoringScripts-1.2.1.zip -O
unzip CloudWatchMonitoringScripts-1.2.1.zip
rm CloudWatchMonitoringScripts-1.2.1.zip
cd aws-scripts-mon
./mon-put-instance-data.pl --mem-util --verify --verbose
crontab -e
*/5 * * * * ~/aws-scripts-mon/mon-put-instance-data.pl --mem-util --from-cron
stress
命令找到at this answer并且它有效。输入stress
,ubuntu将向您展示如何安装压力。请参阅下面我为此编写生成的内存使用情况CloudWatch图表的屏幕截图。每次内存使用率超过40%时,我收到了一封电子邮件。 希望这有帮助。
答案 1 :(得分:2)
您可以使用一个简单的bash脚本来获取实例的内存使用情况,并使用“自定义指标”功能将该实例推送到CloudWatch。然后,您可以在Cloudwatch中创建警报,并让SNS向您发送电子邮件。 (你应该创建一个 例如,每10分钟运行一次cron作业。)
aws cloudwatch put-metric-data --metric-name memusage --namespace mem --value 20 --timestamp 2016-10-14T12:00:00.000Z
答案 2 :(得分:2)
要像matthewmatician所提到的那样具体实施。
您可以通过定期检查内存使用情况轻松地在节点内执行此操作:https://nodejs.org/api/process.html#process_process_memoryusage。如果这是一台长时间运行的服务器,请每隔一小时检查一次。然后,如果内存达到某个阈值,只需使用nodemailer等软件包启动电子邮件。
我喜欢PM2,但我想知道是否可以不用它。
如上所述here,RSS(驻留集大小)是进程的完整内存使用情况,包括共享内存的所有内存使用情况。因此,可以将RSS视为不可用作为单个进程的内存使用,因为共享内存也被其他进程使用。因此PSS存在,它将共享内存划分为所有其他使用的进程。
如果我们想要通过节点进程显示最准确的内存使用情况,我想我们想知道PSS值。但是,有人提到PSS对于大量的fork进程更为重要,例如Apache服务器(以及很多共享内存)。
var hour = 3600*1000;
var checkMemory = function() {
// Retrieves the memory usage
var memory = process.memoryUsage();
var rss_memory_in_bytes = m.rss;
var rss_memory_in_megabytes = m.rss / (1024**2);
if (rss_memory_in_megabytes > 50) {
// More than 50 megabytes RSS usage, do something
doSomething();
}
}
var doSomething = function() {
// For instance sending an email
}
// Check the memory usage every hour
setInterval(checkMemory, hour);
- 更新 -
如果需要更多堆存储,Node进程将尝试分配此内存。这种分配是自动完成的。成功时,堆存储增加,rss也增加。因此,在我们的例子中可以忽略heapUsage和heapTotal。
有一些设置内存限制的方法,但我们有兴趣检查限制。我认为检查剩余的可用系统内存量是合理的。然而,这与Node进程本身的实际内存使用量无关,并且需要对如何使用Node脚本检查空闲系统内存有不同的威胁。
答案 3 :(得分:1)
您可以通过定期检查内存使用情况轻松地在节点内执行此操作:https://nodejs.org/api/process.html#process_process_memoryusage。如果这是一台长时间运行的服务器,请每隔一小时检查一次。然后,如果内存达到某个阈值,只需使用nodemailer等软件包启动电子邮件。