AWS上远程计算机上的进程计数

时间:2014-03-29 13:11:52

标签: ruby amazon-web-services process amazon-ec2 count

我正在为我的应用程序设计Auto Scaling系统,该系统在Amazon EC2实例上运行。应用程序从SQS读取消息并处理它们。

Auto Scaling系统将监控两件事:

  1. SQS中的消息数
  2. 所有EC2计算机上运行的进程总数。
  3. 例如,如果SQS中的消息数超过3000,我希望系统自动缩放,创建新的EC2实例,在其上部署代码,每当消息数低于2000时,我希望系统终止EC2实例

    我正在使用Ruby和capistrano这样做。 我的问题是:

    我无法找到一种方法来确定在所有EC2机器上运行的进程数,并将数字保存在变量中。你能帮帮我吗?

1 个答案:

答案 0 :(得分:3)

您可能希望利用cron和CloudWatch API将数字手动推送到CloudWatch,作为自动扩展组策略的一部分。数字我指的是每个实例ps aux | grep your_process | wc -l

的进程数

CloudWatch将允许您为所有正在运行的实例中的nr个进程的SUM聚合的手动指标设置警报,或者通过auto-scaling-group设置警报。

让你开始的东西:

手动推送RAM内存指标: http://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/mon-scripts-perl.html

还有一个: http://aws.typepad.com/aws/2011/05/amazon-cloudwatch-user-defined-metrics.html

对于内存来说,它看起来很简单,因为亚马逊已经为此提供了脚本。对于流程,您可能需要深入了解这些脚本或阅读官方API文档

编辑:

如果您现在担心观看系统中的单点故障而且您有一个服务器列表,则可能最好从远程服务器并行检查它们:

rm ~/count.log

# SSH in parallel
for ROW in `cat ~/ListofIP.txt`
do
    IP=`echo ${ROW} | sed 's/\./ /g' | awk '{print $1}'`
    ssh -i /path/to/keyfile root@${IP} "ps -ef | grep process_name.rb | grep -v grep | wc -l" >> ~/count.log &
done

# Wait for totals
while [ ! `wc -l ~/ListofIP.txt` -eq `wc -l ~/count.log` ]
do
  wait 1
done

# Sum up numbers from ~/count.log
# Push TO CloudWatch