gunicorn worker 为每个请求退出
gunicorn worker exits for every request
我全新安装了 apache-airflow 1.8.2
,启动了它的网络服务器,它的 gunicorn worker 在每次网页请求时退出,让请求挂起大约 30 秒,同时等待新的 worker 产生。需要帮助解决此问题。
详情如下
我已经安装了 apache-airflow 1.8.2
并关注了 this guide。我在 8081
.
端口启动了网络服务器
现在用浏览器访问服务器时,响应很慢。我查看了控制台输出,发现每次加载网页时,它都会显示 "Worker existing",然后停顿很长时间并显示 "Booting worker".
挖源码后发现,这些都是gunicorn worker。我没有使用 gunicorn、airflow 或 Flask 的经验,所以我不知道这是否是预期的行为,但我觉得不应该。至少网络服务器不应该为每个网页挂起半分钟。
控制台输出:
---> Browser request
[2017-11-01 19:08:07 -0700] [14549] [INFO] Worker exiting (pid: 14549)
---> Hangs for 30s
[2017-11-01 19:08:37 -0700] [13316] [INFO] Handling signal: ttin
[2017-11-01 19:08:37 -0700] [14698] [INFO] Booting worker with pid: 14698
/Users/michael/Programs/clones/airflow/airflow/www/app.py:23: FlaskWTFDeprecationWarning: "flask_wtf.CsrfProtect" has been renamed to "CSRFProtect" and will be removed in 1.0.
csrf = CsrfProtect()
/Users/michael/Programs/miaozhen/tests/airflow-test/lib/python3.6/site-packages/flask/exthook.py:71: ExtDeprecationWarning: Importing flask.ext.cache is deprecated, use flask_cache instead.
.format(x=modname), ExtDeprecationWarning
127.0.0.1 - - [01/Nov/2017:19:08:37 -0700] "GET /admin/ HTTP/1.1" 200 95063 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36"
[2017-11-01 19:08:38,096] [14698] {models.py:168} INFO - Filling up the DagBag from /Users/michael/airflow/dags
---> other GET requests on the same webpage, skipped here for simplicity
[2017-11-01 19:08:39 -0700] [13316] [INFO] Handling signal: ttou
现在我是 运行 apache-airflow 1.8.2
的源代码版本(即克隆源代码,检查标签,并使用 pip install -e .
安装)在 virtualenv
.但是我也尝试过: 运行 没有 virtualenv
的 pypi 版本 (pip install apache-airflow
); 运行 没有 virtualenv
的源版本。所有安装都存在相同的问题,因此这些差异无关紧要。
我的 Python 安装是:
$ python -VV
Python 3.6.3 (default, Oct 4 2017, 06:09:38)
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.37)]
编辑:
我试过在另一台机器上安装&运行apache-airflow
(UbuntuLinux16.04+Python3.5),没有问题。我也问了另外一个用Python3.6上Mac的人,也没有问题。我想我的机器有些奇怪...有什么建议可以调试这个东西吗?
工人定期退出信号ttou
(意思是decrement # of processes by one) every so often is intentional. This is airflow periodically "refreshing" workers. Based on what I read in AIRFLOW-276,它增加了这个功能,刷新工人是为了确保他们接受新的或更新的DAGs。这个行为可以在你的气流中修改在 worker_refresh_interval
和 worker_refresh_batch_size
下配置。
从 source 来看,它会在停止旧工作程序之前启动新工作程序,所以我认为这不会导致您的请求延迟。但是,您可以尝试使用 worker_refresh_batch_size = 0
.
禁用它
好的,在调试源代码后我设法隔离了问题,但是它与 gunicorn 无关。
问题是this
$ time python -c 'import socket; socket.getfqdn()'
real 0m30.051s
user 0m0.018s
sys 0m0.013s
我认为这个问题应该关闭,因为它现在无效,但我不知道该怎么做。
我 运行 遇到了与气流 1.10.1
相同的问题,WUI 非常没有响应,果然,对 socker.getfqdn()
的调用需要 10 秒。
我 运行正在使用旧版本的 Docker,众所周知,当容器试图通过 DNS 解析自己的地址时,它会遇到问题。
作为解决方法,我将 airflow.cfg
中的配置值 hostname_callable
更改为 socket:gethostname
,并且 WUI 证明响应。
这确实意味着所有日志中使用的主机名将是本地主机名(即您在 运行 hostname
时获得的主机名)。
我全新安装了 apache-airflow 1.8.2
,启动了它的网络服务器,它的 gunicorn worker 在每次网页请求时退出,让请求挂起大约 30 秒,同时等待新的 worker 产生。需要帮助解决此问题。
详情如下
我已经安装了 apache-airflow 1.8.2
并关注了 this guide。我在 8081
.
现在用浏览器访问服务器时,响应很慢。我查看了控制台输出,发现每次加载网页时,它都会显示 "Worker existing",然后停顿很长时间并显示 "Booting worker".
挖源码后发现,这些都是gunicorn worker。我没有使用 gunicorn、airflow 或 Flask 的经验,所以我不知道这是否是预期的行为,但我觉得不应该。至少网络服务器不应该为每个网页挂起半分钟。
控制台输出:
---> Browser request
[2017-11-01 19:08:07 -0700] [14549] [INFO] Worker exiting (pid: 14549)
---> Hangs for 30s
[2017-11-01 19:08:37 -0700] [13316] [INFO] Handling signal: ttin
[2017-11-01 19:08:37 -0700] [14698] [INFO] Booting worker with pid: 14698
/Users/michael/Programs/clones/airflow/airflow/www/app.py:23: FlaskWTFDeprecationWarning: "flask_wtf.CsrfProtect" has been renamed to "CSRFProtect" and will be removed in 1.0.
csrf = CsrfProtect()
/Users/michael/Programs/miaozhen/tests/airflow-test/lib/python3.6/site-packages/flask/exthook.py:71: ExtDeprecationWarning: Importing flask.ext.cache is deprecated, use flask_cache instead.
.format(x=modname), ExtDeprecationWarning
127.0.0.1 - - [01/Nov/2017:19:08:37 -0700] "GET /admin/ HTTP/1.1" 200 95063 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36"
[2017-11-01 19:08:38,096] [14698] {models.py:168} INFO - Filling up the DagBag from /Users/michael/airflow/dags
---> other GET requests on the same webpage, skipped here for simplicity
[2017-11-01 19:08:39 -0700] [13316] [INFO] Handling signal: ttou
现在我是 运行 apache-airflow 1.8.2
的源代码版本(即克隆源代码,检查标签,并使用 pip install -e .
安装)在 virtualenv
.但是我也尝试过: 运行 没有 virtualenv
的 pypi 版本 (pip install apache-airflow
); 运行 没有 virtualenv
的源版本。所有安装都存在相同的问题,因此这些差异无关紧要。
我的 Python 安装是:
$ python -VV
Python 3.6.3 (default, Oct 4 2017, 06:09:38)
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.37)]
编辑:
我试过在另一台机器上安装&运行apache-airflow
(UbuntuLinux16.04+Python3.5),没有问题。我也问了另外一个用Python3.6上Mac的人,也没有问题。我想我的机器有些奇怪...有什么建议可以调试这个东西吗?
工人定期退出信号ttou
(意思是decrement # of processes by one) every so often is intentional. This is airflow periodically "refreshing" workers. Based on what I read in AIRFLOW-276,它增加了这个功能,刷新工人是为了确保他们接受新的或更新的DAGs。这个行为可以在你的气流中修改在 worker_refresh_interval
和 worker_refresh_batch_size
下配置。
从 source 来看,它会在停止旧工作程序之前启动新工作程序,所以我认为这不会导致您的请求延迟。但是,您可以尝试使用 worker_refresh_batch_size = 0
.
好的,在调试源代码后我设法隔离了问题,但是它与 gunicorn 无关。
问题是this
$ time python -c 'import socket; socket.getfqdn()'
real 0m30.051s
user 0m0.018s
sys 0m0.013s
我认为这个问题应该关闭,因为它现在无效,但我不知道该怎么做。
我 运行 遇到了与气流 1.10.1
相同的问题,WUI 非常没有响应,果然,对 socker.getfqdn()
的调用需要 10 秒。
我 运行正在使用旧版本的 Docker,众所周知,当容器试图通过 DNS 解析自己的地址时,它会遇到问题。
作为解决方法,我将 airflow.cfg
中的配置值 hostname_callable
更改为 socket:gethostname
,并且 WUI 证明响应。
这确实意味着所有日志中使用的主机名将是本地主机名(即您在 运行 hostname
时获得的主机名)。