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

Alo*_*lon 5 javascript memory amazon-ec2 amazon-web-services node.js

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

我希望在内存使用量达到特定大小的情况下发送电子邮件.

我知道PM2公开了一个API,允许在达到一定量的内存使用量时重新启动应用程序.现在我不想重新启动应用程序,只是为了获得有关它的通知,并且无论我想要什么(在我的情况下,发送电子邮件).

如何使用PM2或任何其他免费工具进行此操作?

Tat*_*ead 6

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

您需要做的第一件事是启动一个可以写入CloudWatch的新Ubuntu EC2实例.这涉及具有权限的新IAM角色.(您无法将新角色附加到现有实例 - 请参阅第二个注意: 此处.). 您不再需要启动EC2实例来更改IAM角色. 见公告.

您采取的下一个操作是:安装AWS创作的perl脚本,以便您可以写入CloudWatch.每五分钟添加一个新的cron写入CloudWatch.

最后在CloudWatch控制台中创建一个新警报,以便在内存使用率超过某个阈值时通过电子邮件发送给您.


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

安装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. 使用以下命令验证是否已正确安装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. 等待大约20分钟,同时将统计信息添加到CloudWatch.

在CloudWatch控制台中创建新警报

  1. 在AWS控制台中,选择CoudWatch并单击蓝色按钮,浏览度量标准.
  2. 在屏幕的右侧,您应该会看到屏幕下半部分的All Metrics选项卡以及指向Linux System的链接.单击Linux System,然后单击InstanceId,您应该会看到MemoryUtilization指标.
  3. 单击MemoryUtilization,然后切换到底部的Graphed Metrics选项卡.
  4. 在此处右侧,您将看到"警报"图标.在此输入图像描述
  5. 单击此图标可创建警报.如果内存利用率超过40,请设置阈值以通过电子邮件发送给您.
  6. 给实例添加压力,你应该会看到一封电子邮件.我使用了这个答案中stress找到的命令并且它有效.Type 和ubuntu将向您展示如何安装压力.请参阅下面我为此编写生成的内存使用情况CloudWatch图表的屏幕截图.每次内存使用率超过40%时,我收到了一封电子邮件. stress

在此输入图像描述

希望这可以帮助.


小智 3

正如数学家提到的那样有一个具体的实现。

您可以通过定期检查内存使用情况在节点内轻松完成这一切: https: //nodejs.org/api/process.html#process_process_memoryusage。如果这是一个长时间运行的服务器,请每小时左右检查一次。然后,如果内存达到某个阈值,只需使用像 nodemailer 这样的包发送一封电子邮件即可。

我喜欢 PM2,但我想知道是否可以不用它。

如此处所述 RSS(Resident Set Size)是进程的全部内存使用量,这包括共享内存的所有内存使用量。因此,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);
Run Code Online (Sandbox Code Playgroud)

- 更新 -

如果需要更多的堆存储,Node 进程将尝试分配该内存。此分配是自动完成的。当成功时,堆存储和 rss 也会增加。因此,在我们的例子中可以忽略 heapUsage 和 heapTotal。

有多种方法可以设置内存限制,但我们感兴趣的是检查限制。我认为检查剩余的可用系统内存量是合理的。然而,这与 Node 进程本身的实际内存使用情况无关,并且需要对如何使用 Node 脚本检查可用系统内存进行不同的威胁。