在AWS上远程机器的进程数

6
我正在设计一个自动扩展系统,用于在亚马逊EC2实例上运行的应用程序。该应用程序从SQS读取消息并处理它们。
自动扩展系统将监视两件事情:
1. SQS中的消息数量, 2. 所有EC2机器上运行的进程总数。
例如,如果SQS中的消息数量超过3000,则希望系统自动扩展,创建一个新的EC2实例,在其上部署代码,并且每当消息数量低于2000时,希望系统终止一个EC2实例。
我使用Ruby和Capistrano来完成这个任务。我的问题是:
我无法找到一种方法来确定所有EC2机器上运行的进程数量并将该数字保存在变量中。你能帮我吗?
1个回答

3
您可能需要利用cron和CloudWatch API手动推送数字到CloudWatch作为自动扩展组策略的一部分。这里的数字是指每个实例中进程的数量 ps aux | grep your_process | wc -l CloudWatch将让您设置警报,以便对所有正在运行的实例或按自动扩展组汇总的手动度量标准进行设置。
以下内容可供参考:
手动推送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

1
+1. 我只想补充一点,你可以通过远程执行(通过rsh)从监控实例中执行ps命令,这样你就不必更改环境中现有的实例。 - iGili
感谢您的回答。iGilli,您是在谈论这个吗:count = count+ `ssh #{@user}@#{server} ps -ef | grep <process_name>.rb | grep -v grep | wc -l``。我拥有系统内运行的所有ec2实例的IP地址。您认为这种方法有什么问题吗? - kyser
这取决于监控的重要性。如果远程服务器(您从中进行rsh的服务器)出现故障怎么办?这是一个单点故障。但是,如果您不喜欢更新环境,那就这样做,请查看我的更新答案。 - WooDzu
@kyser 如果这个答案解决了你的问题,请点击答案左侧的复选标记将其标记为“已接受”。这有助于其他用户快速看到你的问题已得到解决,并奖励你和回答者一小部分声望。 - Anthony Neace

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接