2015-04-01 111 views
2

我有一个由Hypnotoad提供的应用程序,没有反向代理。它有15名工作人员,每个工作人员允许2个客户端。该应用程序通过hypnotoad以前景模式启动。如何解决Hypnotoad工作失败

我看到在日志/ production.log如下:

[Wed Apr 1 16:28:12 2015] [error] Worker 119914 has no heartbeat, restarting. 
[Wed Apr 1 16:28:21 2015] [error] Worker 119910 has no heartbeat, restarting. 
[Wed Apr 1 16:28:21 2015] [error] Worker 119913 has no heartbeat, restarting. 
[Wed Apr 1 16:28:22 2015] [error] Worker 119917 has no heartbeat, restarting. 
[Wed Apr 1 16:28:22 2015] [error] Worker 119909 has no heartbeat, restarting. 
[Wed Apr 1 16:28:27 2015] [error] Worker 119907 has no heartbeat, restarting. 
[Wed Apr 1 16:28:34 2015] [error] Worker 119905 has no heartbeat, restarting. 
[Wed Apr 1 16:28:42 2015] [error] Worker 119904 has no heartbeat, restarting. 
[Wed Apr 1 16:30:12 2015] [error] Worker 119912 has no heartbeat, restarting. 
[Wed Apr 1 16:31:23 2015] [error] Worker 119918 has no heartbeat, restarting. 
[Wed Apr 1 16:32:18 2015] [error] Worker 119911 has no heartbeat, restarting. 
[Wed Apr 1 16:32:22 2015] [error] Worker 119916 has no heartbeat, restarting. 

然而,工人们永远不会重新启动。

当我运行一个strace的,该管理器进程似乎英勇试图杀死(现在已过期)工人:

Process 119878 attached - interrupt to quit 
restart_syscall(<... resuming interrupted call ...>) = 0 
kill(119906, SIGKILL)     = 0 
kill(119917, SIGKILL)     = 0 
kill(119905, SIGKILL)     = 0 
kill(119910, SIGKILL)     = 0 
kill(119904, SIGKILL)     = 0 
kill(119914, SIGKILL)     = 0 
kill(119916, SIGKILL)     = 0 
kill(119908, SIGKILL)     = 0 
kill(119913, SIGKILL)     = 0 
kill(119915, SIGKILL)     = 0 
kill(119918, SIGKILL)     = 0 
kill(119912, SIGKILL)     = 0 
kill(119909, SIGKILL)     = 0 
kill(119911, SIGKILL)     = 0 
kill(119907, SIGKILL)     = 0 
stat("/xxx/xxx/xxx/hypnotoad.pid", {st_mode=S_IFREG|0644, st_size=6, ...}) = 0 
poll([{fd=4, events=POLLIN|POLLPRI}], 1, 1000) = 0 (Timeout) 
kill(119906, SIGKILL)     = 0 
kill(119917, SIGKILL)     = 0 
kill(119905, SIGKILL)     = 0 
kill(119910, SIGKILL)     = 0 
kill(119904, SIGKILL)     = 0 
kill(119914, SIGKILL)     = 0 
kill(119916, SIGKILL)     = 0 
kill(119908, SIGKILL)     = 0 
kill(119913, SIGKILL)     = 0 
kill(119915, SIGKILL)     = 0 
kill(119918, SIGKILL)     = 0 
kill(119912, SIGKILL)     = 0 
kill(119909, SIGKILL)     = 0 
kill(119911, SIGKILL)     = 0 
kill(119907, SIGKILL)     = 0 
stat("/xxx/xxx/xxx/hypnotoad.pid", {st_mode=S_IFREG|0644, st_size=6, ...}) = 0 
poll([{fd=4, events=POLLIN|POLLPRI}], 1, 1000^C <unfinished ...> 
Process 119878 detached 

我该如何解决这个进一步的确定:

  1. 为什么Hypnotoad认为它仍然需要杀死不存在的 进程吗?
  2. 为什么不开始新的?

回答

2

什么是 “工人31842已经没有心跳,重启” 是什么意思?

只要他们正在接受新的连接,所有内置的预执行Web服务器的工作进程就会定期向管理进程发送心跳消息,以表示他们仍然可以响应。阻止操作(例如应用程序中的无限循环)可能会阻止此操作,并会在受到超时后强制重新启动受影响的工作器。此超时默认为20秒,如果您的应用程序需要,可以使用Mojo :: Server :: Prefork中的属性“heartbeat_timeout”进行扩展。

http://mojolicio.us/perldoc/Mojolicious/Guides/FAQ#What-does-Worker-31842-has-no-heartbeat-restarting-mean

+0

感谢您的见解。我非常喜欢你的Mojolicious非封锁文章。我将在我的应用程序中调查阻塞循环。任何提示,将不胜感激。 – arafeandur 2015-04-14 14:54:46

相关问题