Swoole 报错 WARNING Worker_reactor_try_to_exit() (ERRNO 9101): worker exit timeout, forced termination
·
生产环境swoole日志出现报错提示
WARNING Worker_reactor_try_to_exit() (ERRNO 9101): worker exit timeout, forced termination
经排查发现原因为配置中max_request设置过小,导致定时的task被提前释放,便会出现以上报错。
以下为laravelS的配置文件内容 config/laravels.php
'swoole' => [
'daemonize' => env('LARAVELS_DAEMONIZE', false),
'dispatch_mode' => 2,
'reactor_num' => env('LARAVELS_REACTOR_NUM', function_exists('swoole_cpu_num') ? swoole_cpu_num() : 8),
'worker_num' => env('LARAVELS_WORKER_NUM', function_exists('swoole_cpu_num') ? swoole_cpu_num() : 8),
'task_worker_num' => env('LARAVELS_TASK_WORKER_NUM', function_exists('swoole_cpu_num') ? swoole_cpu_num() * 2 : 8),
'task_ipc_mode' => 1,
'task_max_request' => env('LARAVELS_TASK_MAX_REQUEST', 100000),
'task_tmpdir' => @is_writable('/dev/shm/') ? '/dev/shm' : '/tmp',
'max_request' => env('LARAVELS_MAX_REQUEST', 100000), // 此处默认十万,运维为了减少服务器资源占用在.env中设置值仅为70
'open_tcp_nodelay' => true,
'tcp_fastopen' => true,
'pid_file' => storage_path('laravels.pid'),
'log_level' => 4,
'log_file' => storage_path(sprintf('logs/swoole-%s.log', date('Y-m'))),
'document_root' => base_path('public'),
'buffer_output_size' => 200 * 1024 * 1024,
'socket_buffer_size' => 256 * 1024 * 1024,
'package_max_length' => 200 * 1024 * 1024,
'reload_async' => true,
'max_wait_time' => 60,
'enable_reuse_port' => true,
'enable_coroutine' => false,
'upload_tmp_dir' => @is_writable('/dev/shm/') ? '/dev/shm' : '/tmp',
'http_compression' => false,
],
总结:
swoole运行时会有很多个worker来处理task任务。
max_request可以理解为worker最大处理任务数,比如max_request设置了70,那么worker处理完第70个task后,就会把70个吃完食物剩下的碟子全部清掉,重新生成worker,把之前的占用的资源释放,如果设置了10万,那理论上就会积压10万个吃剩碟子。
而报错的原因是定时任务在没到期执行时,worker的max_request却已经超出,提前释放了没有处理的task,定时器到期执行就找不到之前的task了。
不过不管max_request设置多大,这个问题是不是说明swoole定时器不可靠的问题?
更多推荐

所有评论(0)