为什么 Amazon EC2 状态检查对无响应的实例会成功?

Tal*_*lia 5 amazon-ec2 amazon-web-services amazon-cloudwatch

危险!

除非您准备好崩溃和/或强制重启系统,否则不要运行此命令来“测试”它。

我采取的步骤:

我预计实例状态检查会失败。但是,两个状态检查在 20 多分钟后继续通过。该实例对 SSH 和 ping 没有响应,尽管 nmap 报告端口 22 已打开。

我希望使用状态检查来确定实例是否有响应,并使其自动缩放组终止并替换它,但看起来我无法做到这一点。

我有两个问题:

  1. 为什么实例通过两个状态检查?
  2. 是否有另一种解决方案(除了为未用于平衡负载的负载平衡器支付 18 美元/月)来终止无响应的实例?我可以用 Cloudwatch 警报做些什么吗?
    • 理想情况下,我希望能够让实例定期报告其运行状况,如果它在一段时间内未能这样做,请将其终止(并让我的自动缩放组处理其余部分)。

我的 SSH 会话:

Welcome to Ubuntu 14.04.2 LTS (GNU/Linux 3.13.0-57-generic x86_64)

 * Documentation:  https://help.ubuntu.com/

  System information as of Thu Jul  9 18:50:39 UTC 2015

  System load: 0.0               Memory usage: 7%   Processes:       47
  Usage of /:  16.8% of 7.75GB   Swap usage:   0%   Users logged in: 0

  Graph this data and manage this system at:
    https://landscape.canonical.com/

  Get cloud support with Ubuntu Advantage Cloud Guest:
    http://www.ubuntu.com/business/services/cloud


Last login: [[redacted]]
ubuntu@ip-172-31-18-225:~$ :(){ :|: & };:
[1] 1218
ubuntu@ip-172-31-18-225:~$ -bash: fork: Cannot allocate memory
-bash: fork: Cannot allocate memory
Connection to 52.2.62.141 closed.
Run Code Online (Sandbox Code Playgroud)

编辑:所以,我的真正目标是缩小状态检查检查的内容与检查我的应用程序是否正在运行之间的差距。如果状态检查确实检查内核是否正常运行,在我看来,我可以使用内核软件看门狗(如 softdog 内核模块)来缩小差距。

  • 状态检查是否真的检查内核是否正常运行?
  • 如果状态检查显示内核正在运行,是否一定意味着我加载的所有内核模块都在正常运行?

Tal*_*lia 2

由于状态检查已经负责确保内核已启动,因此使用softdog内核模块就足够了。尽管这是一个软件看门狗计时器,但它是一个内核模块这一事实意味着看门狗本身变得无响应的任何实例也会被AWS 执行的实例状态检查检测到,从而终止 EC2 实例。

以下是我在设置脚本中所做的操作(这是一个 Ubuntu AMI):

cat >>/etc/modules <<EOF
softdog
EOF

apt-get install watchdog

cat >>/etc/watchdog.conf <<EOF
interval = 10
logtick = 60
max-load-1 = 24
max-load-5 = 18
max-load-15 = 12
min-memory = 65536
watchdog-device = /dev/watchdog0
ping = 8.8.8.8
interface = eth0
test-binary = /path/to/my/health/check/script.sh
test-timeout = 30
realtime = yes
priority = 1
EOF

...other setup stuff...

reboot

# If you don't want to reboot, you can instead do:
modprobe softdog
service watchdog restart
Run Code Online (Sandbox Code Playgroud)