【问题标题】:gunicorn doesn't kill worker even after timeoutgunicorn 即使在超时后也不会杀死工人
【发布时间】:2019-02-22 18:06:08
【问题描述】:

gunicorn 似乎在超时后也不会杀死并重新生成工人。

这是我的代码(myapp.py):

 def app(environ, start_response):
 data = b"Hello, World!\n"
 start_response("200 OK", [
     ("Content-Type", "text/plain"),
     ("Content-Length", str(len(data)))
 ])
 return iter([data])

这是我触发 gunicorn 服务器的方式:

gunicorn -t 10 -w 1 --log-level debug myapp:app

这是日志:

[2019-02-22 09:56:15 -0800] [20969] [DEBUG] Current configuration:
  config: None
  bind: ['127.0.0.1:8000']
  backlog: 2048
  workers: 1
  worker_class: sync
  threads: 1
  worker_connections: 1000
  max_requests: 0
  max_requests_jitter: 0
  timeout: 10
  graceful_timeout: 30
  keepalive: 2
  limit_request_line: 4094
  limit_request_fields: 100
  limit_request_field_size: 8190
  reload: False
  reload_engine: auto
  reload_extra_files: []
  spew: False
  check_config: False
  preload_app: False
  sendfile: None
  reuse_port: False
  chdir: /Users/abc/experiments/gnuicorn_test
  daemon: False
  raw_env: []
  pidfile: None
  worker_tmp_dir: None
  user: 501
  group: 20
  umask: 0
  initgroups: False
  tmp_upload_dir: None
  secure_scheme_headers: {'X-FORWARDED-PROTOCOL': 'ssl', 'X-FORWARDED-PROTO': 'https', 'X-FORWARDED-SSL': 'on'}
  forwarded_allow_ips: ['127.0.0.1']
  accesslog: None
  disable_redirect_access_to_syslog: False
  access_log_format: %(h)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s "%(f)s" "%(a)s"
  errorlog: -
  loglevel: debug
  capture_output: False
  logger_class: gunicorn.glogging.Logger
  logconfig: None
  logconfig_dict: {}
  syslog_addr: unix:///var/run/syslog
  syslog: False
  syslog_prefix: None
  syslog_facility: user
  enable_stdio_inheritance: False
  statsd_host: None
  statsd_prefix: 
  proc_name: None
  default_proc_name: myapp:app
  pythonpath: None
  paste: None
  on_starting: <function OnStarting.on_starting at 0x1067a6730>
  on_reload: <function OnReload.on_reload at 0x1067a6840>
  when_ready: <function WhenReady.when_ready at 0x1067a6950>
  pre_fork: <function Prefork.pre_fork at 0x1067a6a60>
  post_fork: <function Postfork.post_fork at 0x1067a6b70>
  post_worker_init: <function PostWorkerInit.post_worker_init at 0x1067a6c80>
  worker_int: <function WorkerInt.worker_int at 0x1067a6d90>
  worker_abort: <function WorkerAbort.worker_abort at 0x1067a6ea0>
  pre_exec: <function PreExec.pre_exec at 0x1067b9048>
  pre_request: <function PreRequest.pre_request at 0x1067b9158>
  post_request: <function PostRequest.post_request at 0x1067b91e0>
  child_exit: <function ChildExit.child_exit at 0x1067b92f0>
  worker_exit: <function WorkerExit.worker_exit at 0x1067b9400>
  nworkers_changed: <function NumWorkersChanged.nworkers_changed at 0x1067b9510>
  on_exit: <function OnExit.on_exit at 0x1067b9620>
  proxy_protocol: False
  proxy_allow_ips: ['127.0.0.1']
  keyfile: None
  certfile: None
  ssl_version: 2
  cert_reqs: 0
  ca_certs: None
  suppress_ragged_eofs: True
  do_handshake_on_connect: False
  ciphers: TLSv1
  raw_paste_global_conf: []
[2019-02-22 09:56:15 -0800] [20969] [INFO] Starting gunicorn 19.9.0
[2019-02-22 09:56:15 -0800] [20969] [DEBUG] Arbiter booted
[2019-02-22 09:56:15 -0800] [20969] [INFO] Listening at: http://127.0.0.1:8000 (20969)
[2019-02-22 09:56:15 -0800] [20969] [INFO] Using worker: sync
[2019-02-22 09:56:15 -0800] [20972] [INFO] Booting worker with pid: 20972
[2019-02-22 09:56:15 -0800] [20969] [DEBUG] 1 workers
[2019-02-22 09:56:40 -0800] [20972] [DEBUG] GET /
[2019-02-22 09:57:29 -0800] [20972] [DEBUG] GET /
[2019-02-22 09:57:57 -0800] [20972] [DEBUG] GET /
[2019-02-22 09:58:32 -0800] [20972] [DEBUG] GET /
[2019-02-22 10:04:07 -0800] [20972] [DEBUG] GET /

如您所见,超时设置为 10 秒,但即使经过 5 分钟的空闲期,worker 也从未回收过。

我在这里缺少什么?非常感谢您在这方面的任何帮助!

【问题讨论】:

  • 你确定那个工人没有默默地回收吗?您能否验证该过程在10 秒后没有更改其PID
  • 另外,您能否澄清一下--log-level 存在于您的gunicorn 版本中?至少我只有--log-syslog--logger-class STRING。另外,尝试使用--spew 键运行gunicorn
  • 嗯...附加的日志显示所有 PID 为 20972
  • 是的,--log-level 确实存在于我的独角兽中。让我试试--spew 选项。

标签: python gunicorn


【解决方案1】:

好的...刚刚想通了。 [1] 处的官方文档说明如下:

静默超过这么多秒的工作器将被杀死并重新启动。

在这里,silent 这个词让我很困惑。我在想 GUnicorn 会回收在timeout 表示的时间段内空闲的工人。实际上,它实际上会杀死收到请求但尚未在timeout 参数提供的时间段内完成的工作人员。

我认为non-responding 会比silent 更好。

[1]http://docs.gunicorn.org/en/stable/settings.html#config

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多