Gunicornワーカーのタイムアウトエラー


182

私は3人のワーカーと30人のワーカー接続を使用し、イベントレットワーカークラスを使用してgunicornをセットアップしました。Nginxの背後でセットアップされます。いくつかのリクエストごとに、ログにこれが表示されます。

[ERROR] gunicorn.error: WORKER TIMEOUT (pid:23475)
None
[INFO] gunicorn.error: Booting worker with pid: 23514

なぜこうなった?何がうまくいかないのかをどうやって理解できますか?

ありがとう


2
あなたは問題を解決することができましたか?私もこだわっていますので、どうぞよろしくお願いします。Gunicorn==19.3.1およびgevent==1.0.1
Black_Rider

2
それに対する解決策を見つけました。タイムアウトを非常に大きな値に増やしたところ、スタックトレースを確認できました
Black_Rider

回答:


156

Django + nginx + gunicornを使用しても同じ問題が発生しました。Gunicornのドキュメントから、ほとんど変化のないグレースフルタイムアウトを構成しています。

いくつかのテストの結果、解決策が見つかりました。構成するパラメーターは次のとおりです:タイムアウト(正常なタイムアウトではありません)。時計のように動作します。

だから、やる:

1)gunicorn設定ファイルを開きます

2)タイムアウトを必要なものに設定します-値は秒単位です

NUM_WORKERS=3
TIMEOUT=120

exec gunicorn ${DJANGO_WSGI_MODULE}:application \
--name $NAME \
--workers $NUM_WORKERS \
--timeout $TIMEOUT \
--log-level=debug \
--bind=127.0.0.1:9000 \
--pid=$PIDFILE

9
ありがとう、これが正しい答えです。そして、多くの同時接続でリソースを節約するために: pip install gevent次にworker_class gevent、設定ファイルまたは-k geventコマンドラインで。
little_birdie 2016年

2
スーパーバイザーで実行していますので、それを追加するconf.d / app.confcommand=/opt/env_vars/run_with_env.sh /path/to/environment_variables /path/to/gunicorn --timeout 200 --workers 3 --bind unix:/path/to/socket server.wsgi:application
lukik

31

Google Cloudでは--timeout 90、エントリポイントに追加するだけですapp.yaml

entrypoint: gunicorn -b :$PORT main:app --timeout 90

21

でGunicornを実行し--log-level=DEBUGます。

アプリのスタックトレースが表示されます。


41
私の場合はそうではありません。
Joe

16
それは今です--log-level debug
psychok7 '20 / 06/17

4
私はstracktraceを取得したいのですが、gunicorn 19.4.5を使用して、どれもここでは機能しません。デバッグ情報が表示されるので、フラグは認識されましたが、タイムアウト時のスタックトレースは認識されていません。
orzel


6

他のワーカータイプクラス、geventtornadoなどの非同期タイプを使用する必要があります。詳細については、これを参照してください:最初の外植:

リクエストの処理中にアプリケーションコードが長時間停止する可能性がある場合は、EventletまたはGeventをインストールすることもできます。

二つ目 :

デフォルトの同期ワーカーは、アプリケーションがCPUとネットワーク帯域幅の観点からリソースにバインドされていることを前提としています。一般に、これは、アプリケーションが不定の時間を要することを何もすべきではないことを意味します。たとえば、インターネットへのリクエストはこの基準を満たしています。ある時点で、外部ネットワークは、クライアントがサーバーに蓄積するような方法で失敗します。


実際にそのような別のワーカークラスをどのように利用しますか?
Frederick Nord

6

私は非常に似た問題を抱えていました。「runserver」を使用して何かを見つけることができるかどうかを確認しようとしましたが、メッセージしかありませんでした Killed

リソースの問題かもしれないと思ったので、インスタンスにRAMを追加することにしましたが、うまくいきました。


1
geventとタイムアウトが正しく設定されていても、この問題が発生しました。メモリ不足が問題でした
bcattle

6

WORKER TIMEOUTアプリケーションは、定義された時間内にリクエストに応答できないことを意味します。これは、gunicornタイムアウト設定を使用して設定できます。一部のアプリケーションは、他のアプリケーションよりも応答に時間がかかります。

これに影響する可能性のあるもう1つのことは、ワーカータイプの選択です

デフォルトの同期ワーカーは、アプリケーションがCPUとネットワーク帯域幅の点でリソースにバインドされていると想定しています。一般に、これは、アプリケーションが不定の時間を要することを何もすべきではないことを意味します。未定義の時間がかかるものの例は、インターネットへの要求です。ある時点で、外部ネットワークは、クライアントがサーバーに蓄積するような方法で失敗します。したがって、この意味で、APIへの発信リクエストを行うすべてのWebアプリケーションは、非同期ワーカーの恩恵を受けます。

あなたと同じ問題が発生したとき(Docker Swarmを使用してアプリケーションをデプロイしようとしていました)、タイムアウトを増やして別のタイプのワーカークラスを使用しようとしました。しかし、すべてが失敗しました。

そして、突然、リソースを制限しすぎて、作成ファイル内のサービスに対して制限していることに気付きました。これは私の場合、アプリケーションを遅くするものです

deploy:
  replicas: 5
  resources:
    limits:
      cpus: "0.1"
      memory: 50M
  restart_policy:
    condition: on-failure

そもそも、アプリケーションを遅くしているものを最初に確認することをお勧めします


4

このエンドポイントに時間がかかりすぎていませんか?

多分あなたは非同期サポートなしでフラスコを使用しているので、すべてのリクエストは呼び出しをブロックします。非同期サポートを作成することを困難にすることなく、geventワーカーを追加します。

geventを使用すると、新しい呼び出しにより新しいスレッドが生成され、アプリはより多くのリクエストを受信できるようになります

pip install gevent
gunicon .... --worker-class gevent

1
簡単な調整..私の日を救った!
penduDev

3

Dockerでも同じ問題があります。

Dockerでは、トレーニング済みのLightGBMモデルとFlaskリクエストの処理を続けます。HTTPサーバーとして使用しましたgunicorn 19.9.0。Macラップトップでコードをローカルで実行すると、すべてが完璧に機能しましたが、Dockerでアプリを実行したときに、POST JSONリクエストがしばらくフリーズしていたため、gunicornワーカーが[CRITICAL] WORKER TIMEOUT例外で失敗していました。

さまざまなアプローチを試しましたが、問題を解決したのはを追加することだけでしたworker_class=gthread

これが私の完全な設定です:

import multiprocessing

workers = multiprocessing.cpu_count() * 2 + 1
accesslog = "-" # STDOUT
access_log_format = '%(h)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s "%(q)s" "%(D)s"'
bind = "0.0.0.0:5000"
keepalive = 120
timeout = 120
worker_class = "gthread"
threads = 3

あなたの他の回答の一部をupvotedにもこの1つだけでは十分ではありません:P
Achala Dissanayake


1

タイムアウトはこの問題の重要なパラメータです。

しかし、それは私には合いません。

worker = 1に設定すると、gunicornタイムアウトエラーは発生しませんでした。

コードを見ると、サーバーのinitにソケット接続(socket.send&socket.recv)が見つかりました

socket.recvは私のコードをブロックします。そのため、workers> 1の場合は常にタイムアウトします。

私に問題を抱えている人々にいくつかのアイデアを与えたいと思います


1

これは私のために働きました:

gunicorn app:app -b :8080 --timeout 120 --workers=3 --threads=3 --worker-connections=1000

eventlet追加した場合:

--worker-class=eventlet

gevent追加した場合:

--worker-class=gevent

0

私にとって、解決策は--timeout 90エントリポイントに追加することでしたが、app.yamlとDockerfileに2つのエントリポイントが定義されているため、機能しませんでした。未使用のエントリポイントを削除--timeout 90して、他に追加しました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.