hyperf-admin server:watch 报错 WARNING Worker_reactor_try_to_exit

  • Post author:
  • Post category:其他


在使用hyperf-admin组件时,用 hyperf官方的

热更新 watch

server:watch 时,启动成功,但是修改任何文件都是报以下错误:

[2021-05-15 11:03:43 #936.4]    INFO    Server is shutdown now
[2021-05-15 11:03:46 *948.2]    WARNING Worker_reactor_try_to_exit (ERRNO 9012):
 worker exit timeout, forced termination

===================================================================
 [FATAL ERROR]: all coroutines (count: 1) are asleep - deadlock!
===================================================================

 [Coroutine-2]
--------------------------------------------------------------------
#0  usleep() called at [/data/project/virtual-currency/vendor/hyperf/utils/src/B
ackoff.php:65]
#1  Hyperf\Utils\Backoff->sleep() called at [/data/project/virtual-currency/vend
or/hyperf/utils/src/Functions.php:85]
#2  retry() called at [/data/project/virtual-currency/vendor/hyperf/metric/src/M
etricSetter.php:68]
#3  Hyperf\Metric\Listener\OnWorkerStart->Hyperf\Metric\{closure}() called at [/
data/project/virtual-currency/vendor/hyperf/utils/src/Functions.php:272]
#4  call() called at [/data/project/virtual-currency/vendor/hyperf/utils/src/Cor
outine.php:62]

swoole

官网的解释

是:在约定的时间 (

max_wait_time

秒) 内此 Worker 没有退出,Swoole 底层强行终止此进程。照成2个协程发生死锁。

在不使用 hyperf-admin 组件时,server:watch 没有问题。加了 hyperf-admin 组件之后,就会报错。不知道是 hyperf-admin 的BUG还是 server:watch的问题。

环境:

裸机跑环境,没有上docket

swoole 4.6.6

php 7.4

hyperf 2.0

mysql 5.7

redis 6.2

这里先记录一下,有哪位大佬解答一下。

以下是重现步骤:

  1. 安装 swoole 4.6.6

    phpize && ./configure --enable-openssl --enable-http2 -with-php-config=/www/server/php/74/bin/php-config && make && sudo make install

    安装成功

  2. 安装 hyperf 框架

    composer create-project hyperf/hyperf-skeleton
    

    一路 n 回车

  3. 启动项目,hyperf 框架启动成功

    [root@xxxxxxxx hyperf-skeleton]# php bin/hyperf.php start
    [DEBUG] Event Hyperf\Framework\Event\BootApplication handled by Hyperf\Config\Listener\RegisterPropertyHandlerListener listener.
    [DEBUG] Event Hyperf\Framework\Event\BootApplication handled by Hyperf\ExceptionHandler\Listener\ExceptionHandlerListener listener.
    [DEBUG] Event Hyperf\Framework\Event\BootApplication handled by Hyperf\DbConnection\Listener\RegisterConnectionResolverListener listener.
    [DEBUG] Event Hyperf\Framework\Event\BeforeMainServerStart handled by Hyperf\Process\Listener\BootProcessListener listener.
    [DEBUG] Event Hyperf\Framework\Event\OnStart handled by Hyperf\Server\Listener\InitProcessTitleListener listener.
    [INFO] Worker#1 started.
    [DEBUG] Event Hyperf\Framework\Event\OnManagerStart handled by Hyperf\Server\Listener\InitProcessTitleListener listener.
    [DEBUG] Event Hyperf\Framework\Event\AfterWorkerStart handled by Hyperf\Server\Listener\AfterWorkerStartListener listener.
    [DEBUG] Event Hyperf\Framework\Event\AfterWorkerStart handled by Hyperf\Server\Listener\InitProcessTitleListener listener.
    [INFO] Worker#3 started.
    [INFO] Worker#2 started.
    [DEBUG] Event Hyperf\Framework\Event\AfterWorkerStart handled by Hyperf\Server\Listener\AfterWorkerStartListener listener.
    [DEBUG] Event Hyperf\Framework\Event\AfterWorkerStart handled by Hyperf\Server\Listener\AfterWorkerStartListener listener.
    [DEBUG] Event Hyperf\Framework\Event\AfterWorkerStart handled by Hyperf\Server\Listener\InitProcessTitleListener listener.
    [DEBUG] Event Hyperf\Framework\Event\AfterWorkerStart handled by Hyperf\Server\Listener\InitProcessTitleListener listener.
    [INFO] Worker#0 started.
    [INFO] HTTP Server listening at 0.0.0.0:9501
    [DEBUG] Event Hyperf\Framework\Event\AfterWorkerStart handled by Hyperf\Server\Listener\AfterWorkerStartListener listener.
    [DEBUG] Event Hyperf\Framework\Event\AfterWorkerStart handled by Hyperf\Server\Listener\InitProcessTitleListener listener.
    

  4. 安装

    热更新 Watcher

    [root@xxxxxxx hyperf-skeleton]# php bin/hyperf.php server:watch
    [DEBUG] Event Hyperf\Framework\Event\BootApplication handled by Hyperf\Config\Listener\RegisterPropertyHandlerListener listener.
    [DEBUG] Event Hyperf\Framework\Event\BootApplication handled by Hyperf\ExceptionHandler\Listener\ExceptionHandlerListener listener.
    [DEBUG] Event Hyperf\Framework\Event\BootApplication handled by Hyperf\DbConnection\Listener\RegisterConnectionResolverListener listener.
    Do not run Composer as root/super user! See https://getcomposer.org/root for details
    Continue as root/super user [yes]? yes
    Generating optimized autoload files
    Generated optimized autoload files containing 3337 classes
    
    Start server ...
    #!/usr/bin/env php
    [DEBUG] Event Hyperf\Framework\Event\BootApplication handled by Hyperf\Config\Listener\RegisterPropertyHandlerListener listener.
    [DEBUG] Event Hyperf\Framework\Event\BootApplication handled by Hyperf\ExceptionHandler\Listener\ExceptionHandlerListener listener.
    [DEBUG] Event Hyperf\Framework\Event\BootApplication handled by Hyperf\DbConnection\Listener\RegisterConnectionResolverListener listener.
    


  5. 安装 hyperf-admin

    [root@xxxxx hyperf-skeleton]# composer require hyperf-admin/hyperf-admin -W
    


  6. 启动server:watch

    [root@xxxxx hyperf-skeleton]# php bin/hyperf.php server:watch
    

  7. 监听成功,接下来去修改任意文件



    问题重现了


    [2021-05-15 19:54:48 #20732.4]	INFO	Server is shutdown now
    [2021-05-15 19:54:51 *20741.3]	WARNING	Worker_reactor_try_to_exit (ERRNO 9012): worker exit timeout, forced termination
    
    ===================================================================
     [FATAL ERROR]: all coroutines (count: 1) are asleep - deadlock!
    ===================================================================
    
     [Coroutine-2]
    --------------------------------------------------------------------
    #0  usleep() called at [/www/wwwroot/hyperf-skeleton/vendor/hyperf/utils/src/Backoff.php:65]
    #1  Hyperf\Utils\Backoff->sleep() called at [/www/wwwroot/hyperf-skeleton/vendor/hyperf/utils/src/Functions.php:85]
    #2  retry() called at [/www/wwwroot/hyperf-skeleton/vendor/hyperf/metric/src/MetricSetter.php:68]
    #3  Hyperf\Metric\Listener\OnWorkerStart->Hyperf\Metric\{closure}() called at [/www/wwwroot/hyperf-skeleton/vendor/hyperf/utils/src/Functions.php:271]
    #4  call() called at [/www/wwwroot/hyperf-skeleton/vendor/hyperf/utils/src/Coroutine.php:62]
    
    [2021-05-15 19:54:51 *20739.1]	WARNING	Worker_reactor_try_to_exit (ERRNO 9012): worker exit timeout, forced termination
    [2021-05-15 19:54:51 *20738.0]	WARNING	Worker_reactor_try_to_exit (ERRNO 9012): worker exit timeout, forced termination
    
    ===================================================================
    ===================================================================
     [FATAL ERROR]: all coroutines (count: 1) are asleep - deadlock!
     [FATAL ERROR]: all coroutines (count: 1) are asleep - deadlock!
    ===================================================================
    
    ===================================================================
    
     [Coroutine-2]
     [Coroutine-2]
    --------------------------------------------------------------------
    

    个人理解大致说的是:reactor向worker进程发送 终止信号,但是worker超时没有终止,报warning错误。有一个协程sleep,产生死锁。  是引入了 hyperf-admin 组件之后,才出现的,不知道 组件里面 哪个地方 产生了死锁。



版权声明:本文为lu4506527原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。