Node.js获取高内存使用率的通知

我在Amazon EC2的Ubuntu 14上运行了一个Node.js应用程序。

如果内存使用量达到特定的大小,我想发送电子邮件。

我知道,PM2公开了一个API,它允许在达到一定的内存使用量时重新启动应用程序。 现在我不想在这个时候重新启动应用程序,只是为了得到一个关于它的通知,并用它来做任何我想要的(在我的情况下,发送一封电子邮件)。

我怎样才能使用PM2或任何其他免费工具?

作为matthewmatician提到的具体实现。

您可以通过定期检查您的内存使用情况轻松地在节点内执行此操作: https : //nodejs.org/api/process.html#process_process_memoryusage 。 如果这是一个长时间运行的服务器,请每小时检查一次。 然后,如果内存达到一定的阈值,只需发送一个包含nodemailer的邮件。

我喜欢PM2,但是我想知道是否可以没有。

如此处所述,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脚本检查可用系统内存的不同威胁。

答案是使用AWS CloudWatch警报。 他们是免费的资格,并有一个很好的仪表板。 详细设置在本文档指南中进行了描述,但是我build议您按照我的步骤来确保它适用于您。

您需要做的第一件事是启动一个可以写入CloudWatch的新的Ubuntu EC2实例 这涉及具有权限的新IAMangular色。 (您不能将新的angular色附加到现有的实例 – 请参阅第二个注意: 这里 。)。 您不再需要启动EC2实例来更改IAMangular色。 见公告 。

您执行的下一个操作是: 安装允许您写入CloudWatch 的AWS创作的perl脚本 。 每五分钟添加一个新的cron以写入CloudWatch。

最后,在CloudWatch控制台中创build一个新的警报,当内存使用量超过特定阈值时向您发送电子邮件。


以下是上面列出的每个阶段的步骤:

安装AWS开发的perl脚本

  1. SSH到你的新实例并运行以下命令:

$ 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

  1. 使用以下命令validation您的perl脚本已正确安装

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

  1. 添加到cron中,perl脚本命令将ubuntu实例使用的内存量放入CloudWatch

crontab -e

*/5 * * * * ~/aws-scripts-mon/mon-put-instance-data.pl --mem-util --from-cron

  1. 统计信息添加到CloudWatch时等待大约20分钟。

在CloudWatch控制台中创build新的警报

  1. 在AWS控制台中,selectCoudWatch,然后单击蓝色button浏览度量标准。
  2. 在屏幕的右侧,您应该可以看到屏幕下半部分的“ 所有度量”选项卡以及指向Linux系统的链接。 单击Linux系统,然后单击InstanceId,您应该看到您的MemoryUtilization指标。
  3. 点击MemoryUtilization ,然后切换到底部的图表 度量标签。
  4. 在这里,你会看到报警图标。 在这里输入图像描述
  5. 点击此图标创build警报。 如果内存利用率高于40,则设置阈值以通过电子邮件发送给您。
  6. 给实例增加压力,你会看到一个电子邮件进来。我用在这个答案find的stress命令,它的工作。 typesstress和Ubuntu会告诉你如何安装压力。 请参阅下面的屏幕截图,了解我为此编写的内存使用情况CloudWatch图表。 每次内存使用率超过40%时,我都会收到一封电子邮件。

在这里输入图像描述

希望这可以帮助。

您可以使用简单的bash脚本来获取实例的内存使用情况,并使用“自定义指标”function将该实例推送到CloudWatch。 然后,您可以在Cloudwatch中创build警报,并使SNS向您发送电子邮件。 (您应该创build一个cron作业,例如每10分钟运行一次)。

aws cloudwatch put-metric-data –metric-name memusage –namespace mem –value 20 –timestamp 2016-10-14T12:00:00.000Z

您可以通过定期检查您的内存使用情况轻松地在节点内执行此操作: https : //nodejs.org/api/process.html#process_process_memoryusage 。 如果这是一个长时间运行的服务器,请每小时检查一次。 然后,如果内存达到一定的阈值,只需发一封包含nodemailer的邮件。