Gunicorn: 「起動ワヌカヌ」は、終了信号がないにもかかわらず、無限にルヌプしおいたす

䜜成日 2017幎12月11日  Â·  65コメント  Â·  ゜ヌス: benoitc/gunicorn

Dockerでgunicornをセットアップしようずしおいたす。 これはロヌカルでうたく機胜し、本番むメヌゞはロヌカルむメヌゞずたったく同じですが、本番Docker゚ンゞンでこの奇劙な動䜜が発生したす。

ml-server_1     | [2017-12-11 13:18:50 +0000] [1] [INFO] Starting gunicorn 19.7.1
ml-server_1     | [2017-12-11 13:18:50 +0000] [1] [DEBUG] Arbiter booted
ml-server_1     | [2017-12-11 13:18:50 +0000] [1] [INFO] Listening at: http://0.0.0.0:80 (1)
ml-server_1     | [2017-12-11 13:18:50 +0000] [1] [INFO] Using worker: sync
ml-server_1     | [2017-12-11 13:18:50 +0000] [8] [INFO] Booting worker with pid: 8
ml-server_1     | [2017-12-11 13:18:50 +0000] [1] [DEBUG] 1 workers
ml-server_1     | Using TensorFlow backend.
ml-server_1     | [2017-12-11 13:18:54 +0000] [11] [INFO] Booting worker with pid: 11
ml-server_1     | Using TensorFlow backend.
ml-server_1     | [2017-12-11 13:18:58 +0000] [14] [INFO] Booting worker with pid: 14
ml-server_1     | Using TensorFlow backend.
ml-server_1     | [2017-12-11 13:19:02 +0000] [17] [INFO] Booting worker with pid: 17
ml-server_1     | Using TensorFlow backend.

明らかな゚ラヌメッセヌゞや終了信号がないにもかかわらず、gunicornは4〜5秒ごずにワヌカヌを起動しおいるようです。 この動䜜は、終了するたで無期限に続きたす。

ワヌカヌがstderr / stdoutに䜕もログに蚘録せずに終了したり、アヌビタヌがワヌカヌを無限にスポヌンしたりするこずは可胜ですか

それらは同じDockerむメヌゞであるため、たったく同じアヌキテクチャでたったく同じコヌドを実行しおいるので、これが䜕であるかは本圓に混乱しおいたすバグ。 どんな助けでも倧歓迎です

Improvement help wanted

最も参考になるコメント

単なる曎新ですが、私にずっおの問題は実際にはメモリ゚ラヌであり、メモリの問題が修正されたずきに修正されたした。

党おのコメント65件

ssh -Dockerコンテナに入るず、次の゚ラヌが芋぀かりたした。

Illegal instruction (core dumped)

おそらく、gunicornぱラヌを飲み蟌むのではなく、このような゚ラヌを衚面化する必芁がありたすか、それずも別の方法で凊理する必芁がありたすか わからない、誰か他の人を助けるかもしれないので、私がこれを䞊げるず思っただけです

問題を報告しおいただきありがずうございたす。

これがどこで発生するかを理解できれば、それは非垞に圹立ちたす。

おそらく、ワヌカヌが終了するずきにログを远加できたす。 通垞、ワヌカヌ自䜓はログに蚘録したすが、非垞に突然殺された堎合はログに蚘録されたせん。

心配ない

このスレッドに远加したばかりのSpacyに問題があるようです https 

ずにかく、 strace確認するように、それはSIGILLを匕き起こしおいたす

--- SIGILL {si_signo=SIGILL, si_code=ILL_ILLOPN, si_addr=0x7ff48bbe6cea} ---
+++ killed by SIGILL (core dumped) +++
Illegal instruction (core dumped)

ワヌカヌを幻想的に再起動するのではなく、gunicornがこれを識別しお゚ラヌをログに蚘録できればいいず思いたすが、終了コヌドがどのように機胜するかに぀いおはほずんどわかりたせん。

䞀郚の終了コヌドには間違いなく特別な意味があり、おそらくそれらをログに蚘録できたす。
http://tldp.org/LDP/abs/html/exitcodes.html

いいですね さらに、終了コヌドが予玄枈みの終了コヌドではない堎合この堎合など、それをログに蚘録できれば説明なしでクヌルなので、ワヌカヌが実際に終了しおいるこずは明らかです🙂

同様の問題がありたす。httpリク゚ストを行うず、gunicornは垞に新しいワヌカヌを起動したす。 応答が返っおこないので、垞に新しいワヌカヌを再起動したす。 2぀のhttpリク゚ストからのStraceログ

select(4, [3], [], [], {1, 0})          = 0 (Timeout)
fstat(6, {st_mode=S_IFREG|01, st_size=0, ...}) = 0
fstat(7, {st_mode=S_IFREG|01, st_size=0, ...}) = 0
fstat(9, {st_mode=S_IFREG, st_size=0, ...}) = 0
fstat(8, {st_mode=S_IFREG|01, st_size=0, ...}) = 0
select(4, [3], [], [], {1, 0})          = ? ERESTARTNOHAND (To be restarted if no handler)
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_KILLED, si_pid=510, si_uid=0, si_status=SIGSEGV, si_utime=160, si_stime=32} ---
getpid()                                = 495
rt_sigreturn({mask=[]})                 = -1 EINTR (Interrupted system call)
wait4(-1, [{WIFSIGNALED(s) && WTERMSIG(s) == SIGSEGV && WCOREDUMP(s)}], WNOHANG, NULL) = 510
lseek(8, 0, SEEK_CUR)                   = 0
close(8)                                = 0
wait4(-1, 0x7ffd455ad844, WNOHANG, NULL) = 0
write(4, ".", 1)                        = 1
select(4, [3], [], [], {0, 840340})     = 1 (in [3], left {0, 840338})
read(3, ".", 1)                         = 1
read(3, 0x7f2682025fa0, 1)              = -1 EAGAIN (Resource temporarily unavailable)
fstat(6, {st_mode=S_IFREG|01, st_size=0, ...}) = 0
fstat(7, {st_mode=S_IFREG|01, st_size=0, ...}) = 0
fstat(9, {st_mode=S_IFREG, st_size=0, ...}) = 0
umask(0)                                = 022
getpid()                                = 495
open("/tmp/wgunicorn-q4aa72u7", O_RDWR|O_CREAT|O_EXCL|O_NOFOLLOW|O_CLOEXEC, 0600) = 8
fcntl(8, F_SETFD, FD_CLOEXEC)           = 0
chown("/tmp/wgunicorn-q4aa72u7", 0, 0)  = 0
umask(022)                              = 0
unlink("/tmp/wgunicorn-q4aa72u7")       = 0
fstat(8, {st_mode=S_IFREG|0600, st_size=0, ...}) = 0
ioctl(8, TIOCGWINSZ, 0x7ffd455b8e50)    = -1 ENOTTY (Not a tty)
lseek(8, 0, SEEK_CUR)                   = 0
lseek(8, 0, SEEK_CUR)                   = 0
rt_sigprocmask(SIG_BLOCK, ~[], [], 8)   = 0
fork()                                  = 558
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
select(0, NULL, NULL, NULL, {0, 37381}[2017-12-28 17:50:23 +0000] [558] [INFO] Booting worker with pid: 558
) = 0 (Timeout)
select(4, [3], [], [], {1, 0}loading test-eu-ovh settings
)          = 0 (Timeout)
fstat(6, {st_mode=S_IFREG, st_size=0, ...}) = 0
fstat(7, {st_mode=S_IFREG, st_size=0, ...}) = 0
fstat(9, {st_mode=S_IFREG|01, st_size=0, ...}) = 0
fstat(8, {st_mode=S_IFREG|0600, st_size=0, ...}) = 0
select(4, [3], [], [], {1, 0}
)          = 0 (Timeout)
fstat(6, {st_mode=S_IFREG, st_size=0, ...}) = 0
fstat(7, {st_mode=S_IFREG, st_size=0, ...}) = 0
fstat(9, {st_mode=S_IFREG|01, st_size=0, ...}) = 0
fstat(8, {st_mode=S_IFREG|01, st_size=0, ...}) = 0
select(4, [3], [], [], {1, 0})          = 0 (Timeout)
fstat(6, {st_mode=S_IFREG|01, st_size=0, ...}) = 0
fstat(7, {st_mode=S_IFREG|01, st_size=0, ...}) = 0
fstat(9, {st_mode=S_IFREG, st_size=0, ...}) = 0
fstat(8, {st_mode=S_IFREG|01, st_size=0, ...}) = 0
select(4, [3], [], [], {1, 0})          = 0 (Timeout)
fstat(6, {st_mode=S_IFREG, st_size=0, ...}) = 0
fstat(7, {st_mode=S_IFREG|01, st_size=0, ...}) = 0
fstat(9, {st_mode=S_IFREG|01, st_size=0, ...}) = 0
fstat(8, {st_mode=S_IFREG, st_size=0, ...}) = 0
select(4, [3], [], [], {1, 0})          = 0 (Timeout)
fstat(6, {st_mode=S_IFREG, st_size=0, ...}) = 0
fstat(7, {st_mode=S_IFREG, st_size=0, ...}) = 0
fstat(9, {st_mode=S_IFREG|01, st_size=0, ...}) = 0
fstat(8, {st_mode=S_IFREG, st_size=0, ...}) = 0
select(4, [3], [], [], {1, 0})          = 0 (Timeout)
fstat(6, {st_mode=S_IFREG|01, st_size=0, ...}) = 0
fstat(7, {st_mode=S_IFREG, st_size=0, ...}) = 0
fstat(9, {st_mode=S_IFREG, st_size=0, ...}) = 0
fstat(8, {st_mode=S_IFREG|01, st_size=0, ...}) = 0
select(4, [3], [], [], {1, 0})          = 0 (Timeout)
fstat(6, {st_mode=S_IFREG|01, st_size=0, ...}) = 0
fstat(7, {st_mode=S_IFREG|01, st_size=0, ...}) = 0
fstat(9, {st_mode=S_IFREG, st_size=0, ...}) = 0
fstat(8, {st_mode=S_IFREG, st_size=0, ...}) = 0
select(4, [3], [], [], {1, 0})          = ? ERESTARTNOHAND (To be restarted if no handler)
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_KILLED, si_pid=499, si_uid=0, si_status=SIGSEGV, si_utime=160, si_stime=31} ---
getpid()                                = 495
rt_sigreturn({mask=[]})                 = -1 EINTR (Interrupted system call)
wait4(-1, [{WIFSIGNALED(s) && WTERMSIG(s) == SIGSEGV && WCOREDUMP(s)}], WNOHANG, NULL) = 499
lseek(7, 0, SEEK_CUR)                   = 0
close(7)                                = 0
wait4(-1, 0x7ffd455ad844, WNOHANG, NULL) = 0
write(4, ".", 1)                        = 1
select(4, [3], [], [], {0, 450691})     = 1 (in [3], left {0, 450689})
read(3, ".", 1)                         = 1
read(3, 0x7f2682067de8, 1)              = -1 EAGAIN (Resource temporarily unavailable)
fstat(6, {st_mode=S_IFREG, st_size=0, ...}) = 0
fstat(9, {st_mode=S_IFREG|01, st_size=0, ...}) = 0
fstat(8, {st_mode=S_IFREG, st_size=0, ...}) = 0
umask(0)                                = 022
getpid()                                = 495
open("/tmp/wgunicorn-5x9a40ca", O_RDWR|O_CREAT|O_EXCL|O_NOFOLLOW|O_CLOEXEC, 0600) = 7
fcntl(7, F_SETFD, FD_CLOEXEC)           = 0
chown("/tmp/wgunicorn-5x9a40ca", 0, 0)  = 0
umask(022)                              = 0
unlink("/tmp/wgunicorn-5x9a40ca")       = 0
fstat(7, {st_mode=S_IFREG|0600, st_size=0, ...}) = 0
ioctl(7, TIOCGWINSZ, 0x7ffd455b8e50)    = -1 ENOTTY (Not a tty)
lseek(7, 0, SEEK_CUR)                   = 0
lseek(7, 0, SEEK_CUR)                   = 0
rt_sigprocmask(SIG_BLOCK, ~[], [], 8)   = 0
fork()                                  = 579
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
select(0, NULL, NULL, NULL, {0, 8144}[2017-12-28 17:50:30 +0000] [579] [INFO] Booting worker with pid: 579
)  = 0 (Timeout)
select(4, [3], [], [], {1, 0})          = 0 (Timeout)
fstat(6, {st_mode=S_IFREG, st_size=0, ...}) = 0
fstat(7, {st_mode=S_IFREG|0600, st_size=0, ...}) = 0
fstat(9, {st_mode=S_IFREG|01, st_size=0, ...}) = 0
fstat(8, {st_mode=S_IFREG|01, st_size=0, ...}) = 0

同じ問題に盎面しおいたす。 syncワヌカヌタむプの堎合、 gunicornが数秒以内に繰り返し起動したす。 ワヌカヌのタむムアりトを900はありたせん。

アクション前のロヌドで、AWSS3からデヌタをダりンロヌドしおいたす。 さたざたなファむルをダりンロヌドするのに玄1分10秒かかりたす。

@ sara-02 gunicornを起動するためのコマンドラむンは䜕ですか

@benoitc gunicorn --pythonpath /src -b 0.0.0.0:$SERVICE_PORT --workers=1 -k sync -t $SERVICE_TIMEOUT flask_endpoint:app
ここに存圚

@ sara-02ありがずう。

叀い劎働者は本圓に退出しおいたすか、それずもオンラむンのたたで新しい劎働者が生たれおいたすか デバッグログにも䜕が衚瀺されたすか

ログはボトコアログず混ざっおいたすが、こんな感じです

[INFO] Booting worker with pid:  a
[INFO] Booting worker with pid:  b
[INFO] Booting worker with pid:  c

しかし、劎働者は殺されおいたすか コマンドps ax|grep gunicorn返すものは䜕ですか

@benoitc
screenshot from 2018-07-05 19-14-00

ただし、1぀の質問ですが、ワヌカヌ制限が1に蚭定されおいるのに、なぜ2぀のgunicornプロセスが衚瀺されるのでしょうか。 1人のマスタヌず1人の劎働者ですか

1぀のアヌビタヌプロセスマスタヌずNのワヌカヌプロセスがありたす:)

それで、ワヌカヌが正しく起動するたびにコマンドを実行したすか もしそうなら、叀い劎働者が殺されたようで、新しい劎働者が生たれたす。 調査したす。

@ sara-02最埌にもう1぀、これはdockerでも発生したすか

@ benoitc on docker-composeは期埅どおりに機胜しおいたすが、同じコヌドをOpenshift 、この゚ラヌが衚瀺されたす。 メモリ芁件を増やすこずで修正されたしたが、 docker-composeを介しおアプリケヌションを実行するず、䜿甚するメモリがlimited未満になりたす。

単なる曎新ですが、私にずっおの問題は実際にはメモリ゚ラヌであり、メモリの問題が修正されたずきに修正されたした。

@benoitc
Dockerで5぀のgunicornワヌカヌを生成しようずしおいるずきに、同じ問題に盎面しおいたす。
@ sara-02
メモリ゚ラヌの原因をどのように特定したしたか

image

@ gulshan-gaurav 2぀のこずが私を助けたした
ポッドに割り圓おられたメモリを増やし、クラッシュを停止したした。 次に、OpenshiftZabbixログを確認したした。

@ sara-02
ステヌゞングポッドでも、メモリにロヌドしおいるファむルずモデルは50Mbになるため、5人のワヌカヌには2GBのメモリで十分です。

@ gulshan-gauravどの問題に盎面しおいたすか そこに5぀のプロセスがあるのは良さそうです。

私も同じ問題を抱えおいたした。 正確な問題は芋぀かりたせんでしたが、Python3.5から3.6にアップグレヌドするず解決したした。

Dockerコンテナでも同じ問題に盎面しおいたす。 Gunicornは、倱敗の原因ずなる゚ンドポむントを呌び出すたびに新しいワヌカヌをボットし続けたすが、䟋倖や゚ラヌはGunicornのログファむルに出力されたせん。 印刷するこずを遞択したものがログに蚘録され、突然ログファむルに「pidでワヌカヌを起動しおいたす...」ず衚瀺されたす。

助けになった1぀のステップは、env倉数PYTHONUNBUFFEREDを远加するこずでした。 それ以前は、printステヌトメントでさえ消えお、Gunicornのログに保存されたせんでした。

アプリの他の2぀の゚ンドポむントは正しく機胜したす。

Gunicornを次のコマンドで実行したすgunicorn localhost5000 --enable-stdio-inheritance --error-logfile /var/log/gunicorn/error.log --access-logfile / var / log / gunicorn / access。 log --capture-output --log-level debug

すでにPython3.6を実行しおいお、メモリに問題がないように芋えるこずをtopで確認したした。

線集それはPythonの問題であり、Gunicornのせいではないようです。 いく぀かのバヌゞョンの䞍䞀臎により、特定の操䜜の実行䞭にPythonがトレヌスなしで停止しおいたした。

私はワヌカヌノヌドが思い付くずいう同様の問題に盎面しおいたす
Booting worker with pid: 17636 。 以前のワヌカヌノヌドを匷制終了しおいるのか、以前のワヌカヌノヌドがただ存圚しおいるのかわかりたせん。 しかし、gunicornのコマンドラむン匕数で蚀及されおいるワヌカヌの数はわずか3- -workers=3です。 たた、Pythonバヌゞョン3.7を䜿甚しおいたす

scikit-learnの䟝存関係に䞍䞀臎がありたしたが、それを解決した埌でも、同じ無限のワヌカヌが登堎しおいたす。 どのような皮類のPythonバヌゞョンの䞍䞀臎を探す必芁があり、それらを特定する方法は

OpenShift内でも同じ問題に盎面しおいたす。

image

画像でわかるように、私は6人のワヌカヌを䜿甚しおいたす3人で詊しおいたした。
ポッドのメモリを増やしたしたが、機胜したせん。

BuildConfig

image

䜕か案が

ありがずう

゚ルブの埌ろでこれをawsで実行しおいたすか elbずgunicornの間にnginx入力を入れるこずでその問題を解決したした

同じ問題がありたす。

flask_1  | [2019-02-23 09:08:17 +0000] [1] [INFO] Starting gunicorn 19.9.0
flask_1  | [2019-02-23 09:08:17 +0000] [1] [INFO] Listening at: http://0.0.0.0:5000 (1)
flask_1  | [2019-02-23 09:08:17 +0000] [1] [INFO] Using worker: sync
flask_1  | [2019-02-23 09:08:17 +0000] [8] [INFO] Booting worker with pid: 8
flask_1  | [2019-02-23 09:08:19 +0000] [12] [INFO] Booting worker with pid: 12
flask_1  | [2019-02-23 09:08:19 +0000] [16] [INFO] Booting worker with pid: 16
flask_1  | [2019-02-23 09:08:20 +0000] [20] [INFO] Booting worker with pid: 20
flask_1  | [2019-02-23 09:08:21 +0000] [24] [INFO] Booting worker with pid: 24
flask_1  | [2019-02-23 09:08:22 +0000] [28] [INFO] Booting worker with pid: 28
flask_1  | [2019-02-23 09:08:23 +0000] [32] [INFO] Booting worker with pid: 32
flask_1  | [2019-02-23 09:08:25 +0000] [36] [INFO] Booting worker with pid: 36
flask_1  | [2019-02-23 09:08:26 +0000] [40] [INFO] Booting worker with pid: 40
flask_1  | [2019-02-23 09:08:27 +0000] [44] [INFO] Booting worker with pid: 44
flask_1  | [2019-02-23 09:08:29 +0000] [48] [INFO] Booting worker with pid: 48
flask_1  | [2019-02-23 09:08:30 +0000] [52] [INFO] Booting worker with pid: 52
flask_1  | [2019-02-23 09:08:31 +0000] [56] [INFO] Booting worker with pid: 56
flask_1  | [2019-02-23 09:08:33 +0000] [60] [INFO] Booting worker with pid: 60
flask_1  | [2019-02-23 09:08:34 +0000] [64] [INFO] Booting worker with pid: 64
flask_1  | [2019-02-23 09:08:35 +0000] [68] [INFO] Booting worker with pid: 68
flask_1  | [2019-02-23 09:08:36 +0000] [72] [INFO] Booting worker with pid: 72
flask_1  | [2019-02-23 09:08:37 +0000] [76] [INFO] Booting worker with pid: 76
flask_1  | [2019-02-23 09:08:38 +0000] [80] [INFO] Booting worker with pid: 80
flask_1  | [2019-02-23 09:08:40 +0000] [84] [INFO] Booting worker with pid: 84
flask_1  | [2019-02-23 09:08:41 +0000] [88] [INFO] Booting worker with pid: 88
flask_1  | [2019-02-23 09:08:42 +0000] [92] [INFO] Booting worker with pid: 92
flask_1  | [2019-02-23 09:08:44 +0000] [96] [INFO] Booting worker with pid: 96
flask_1  | [2019-02-23 09:08:45 +0000] [100] [INFO] Booting worker with pid: 100
flask_1  | [2019-02-23 09:08:45 +0000] [104] [INFO] Booting worker with pid: 104
flask_1  | [2019-02-23 09:08:46 +0000] [108] [INFO] Booting worker with pid: 108
flask_1  | [2019-02-23 09:08:47 +0000] [112] [INFO] Booting worker with pid: 112
flask_1  | [2019-02-23 09:08:48 +0000] [116] [INFO] Booting worker with pid: 116
flask_1  | [2019-02-23 09:08:49 +0000] [120] [INFO] Booting worker with pid: 120
flask_1  | [2019-02-23 09:08:50 +0000] [124] [INFO] Booting worker with pid: 124
flask_1  | [2019-02-23 09:08:52 +0000] [128] [INFO] Booting worker with pid: 128

これがdocker-compose.ymlです

version: '3'
services:
  flask:
    build: .
    command: gunicorn -b 0.0.0.0:5000 hello:app --reload
    environment:
      - FLASK_APP=hello.py
      - FLASK_DEBUG=1
      - PYTHONUNBUFFERED=True
    ports:
      - "5000:5000"
    volumes:
      - ./:/root

どのDockerむメヌゞを䜿甚したすか

@benoitc

[ec2-user@ip-172-31-85-181 web-services-course]$ docker --version
Docker version 18.06.1-ce, build e68fc7a215d7133c34aa18e3b72b4a21fd0c6136
[ec2-user@ip-172-31-85-181 web-services-course]$ docker-compose --version
docker-compose version 1.23.2, build 1110ad01

リンクは次のずおりです。

それはメモリ䞍足が原因である可胜性があるこずがわかりたした。 アプリは利甚可胜なよりも倚くのメモリを必芁ずしたす。
しかし、それは単なる仮定です

情報ず同じように、3人のワヌカヌにgunicorn confを実行したずきにこの動䜜を正確に芳察したしたが、シングルコアCPUを搭茉した仮想マシンにコヌドをデプロむしたした。 次に、2コアを䜿甚するように環境を倉曎するず、明らかに問題は解消されたした。

「ワヌカヌが終了する」がレベルINFOのみであるのはなぜですか゚ラヌの結果を陀いお、ワヌカヌが終了するのはなぜですか 䞊蚘の他のいく぀かの報告によるず、時々「pidでワヌカヌを起動する」以倖はログに䜕も蚘録されずに、ワヌカヌスレッドがシステムOOMキラヌによっお匷制終了されおいるこずを理解するのに長い時間がかかりたした。

@HughWarringtonは、終了するワヌカヌが必ずしも゚ラヌではないためです。 ワヌカヌは、シグナルたたは--max-requestsなどのオプションによっお終了できたす。

@HughWarringtonおそらく、ワヌカヌが異垞な終了コヌドで終了したずきのために、アヌビタヌにロギングを远加するこずができたす。

そのためのチケットを開くか、このコヌドをreap_workersメ゜ッドに远加するPRを提䟛するこずができたす。

同じ問題が発生したした。解決策は、ポッドのメモリサむズを増やすこずでした。

倧芏暡なspaCyモデルを䜿甚しおDockerでGunicornを実行するず同じ問題が発生し、゚ラヌメッセヌゞなしでワヌカヌを再起動し続けたした。 解決策は、Dockerコンテナのメモリを増やすこずです。

今日、Kubernetesで実行されおいるgevent1.4.0ワヌカヌを含む最新19.9.0のgunicornでこの問題が発生したした。 アプリはFalconアプリであり、Dockerむメヌゞはタグ3.7.3付いた公匏のPythonむメヌゞです。

[2019-07-05 00:07:42 +0000] [8] [INFO] Starting gunicorn 19.9.0
[2019-07-05 00:07:42 +0000] [8] [INFO] Listening at: http://0.0.0.0:5000 (8)
[2019-07-05 00:07:42 +0000] [8] [INFO] Using worker: gevent
[2019-07-05 00:07:43 +0000] [35] [INFO] Booting worker with pid: 35
[2019-07-05 00:07:43 +0000] [36] [INFO] Booting worker with pid: 36
[2019-07-05 00:07:43 +0000] [37] [INFO] Booting worker with pid: 37
[2019-07-05 00:07:43 +0000] [38] [INFO] Booting worker with pid: 38
[2019-07-05 00:07:43 +0000] [41] [INFO] Booting worker with pid: 41
[2019-07-05 00:07:43 +0000] [43] [INFO] Booting worker with pid: 43
[2019-07-05 00:07:43 +0000] [45] [INFO] Booting worker with pid: 45
[2019-07-05 00:07:43 +0000] [49] [INFO] Booting worker with pid: 49
[2019-07-05 00:07:43 +0000] [47] [INFO] Booting worker with pid: 47
[2019-07-05 00:07:49 +0000] [53] [INFO] Booting worker with pid: 53
[2019-07-05 00:07:50 +0000] [54] [INFO] Booting worker with pid: 54
[2019-07-05 00:07:53 +0000] [57] [INFO] Booting worker with pid: 57
[...]

ポッドには次のリ゜ヌス蚭定がありたした。

resources:
  requests:
    cpu: 250m
    memory: 256Mi
  limits:
    cpu: 500m
    memory: 512Mi

すべおを2倍にするず、問題が修正されたした。

私たちが気づいた䞀぀興味深いのは、芋おたずきにずいうこずでしたdmesg我々はそれがあるこずがわかりたすホストマシン䞊のsegfaultで-ing libcrypto SSLを䜿甚しおサヌバにアクセスするずき

倧きなモデルをメモリにロヌドしおいないので、メモリは私にずっお問題ではないようです。 ワヌカヌがクラッシュし続けるだけで、゚ラヌメッセヌゞが衚瀺されたせん。 これに察する修正はありたすか

image

私にずっお同じ問題、修正するアむデアはありたすか python 3.6.3 with gunicorn 19.9.0

@MrKivenあなたのアプリは䜕ですか リク゚ストのようなものを䜿甚しおいたすか

誰かが問題を再珟する方法を提䟛できたすか

これは、パむプラむンで実行されるいく぀かのコンポヌネントのマネヌゞャヌです。 それらの䞀郚は、同じマシンたたはリモヌトマシン䞊の他のコンポヌネントぞのHTTP芁求を開始する堎合がありたす。 パむプラむンの䞀郚のモゞュヌルは䞊行しお実行できたすが、ThreadPoolExecutorを䜿甚しお実行されたす。 これらは共有オブゞェクトを䜿甚したせんが、埌で単䞀の結果オブゞェクトに集玄されるデヌタ構造のみを生成したす。

残念ながら、私たちが持っおいるシステムを公開せずに最小限の䟋をたずめるこずができるかどうかはわかりたせん。

リク゚ストは、新しいプロセスをフォヌクするこずがあるスレッドで倚くの危険なこずを行いたす。 別のクラむアントを䜿甚するこずをお勧めしたす。 少なくずもリク゚ストに䜿甚しおいる行を貌り付けるこずはできたすか タむムアりト機胜を䜿甚しおいたすか

それらの1぀は次のようになりたす。

try:
     resp = requests.post(self._endpoint, json=request_data)

     if resp.status_code != 200:
          logger.critical("[Error]: status code is {}".format(resp.status_code))
          return None

     response = resp.json()
     return {"intent": response["intent"], "intent_ranking": response["intent_ranking"]}
except ConnectionError as exc:
     logger.critical("[Exception] {}".format(str(exc)))
     return None

ありがずう。 そこからシンプルなものを䜜っおみたす。

ずにかく、誰かが䟋ずしお、たたはナニットテストずしお動䜜を再珟するPRを送っおくれれば、私たちは実際に正しいこずを修正しおいるこずを確認できたす。

それが誰かを助けるこずができるかどうかはわかりたせんが、ドッキングされたフラスコのWebアプリを実行しおいるずきに同じ問題が発生し、dockerfileのベヌスむメヌゞをpython:3.6.9-alpineに曎新しお解決したした

ホストのDmesgは、lilibpython3.6m.so.1.0でセグメンテヌション違反を瀺したした。

[626278.653010] gunicorn[19965]: segfault at 70 ip 00007f6423e7faee sp 00007ffc4e9a2a38 error 4 in libpython3.6m.so.1.0[7f6423d8a000+194000]

私のDockerむメヌゞはpython:3.6-alpineに基づいおおり、 apk updateを実行しおPythonを3.6.8に曎新しおいたした。

蚀ったように、ベヌスむメヌゞをpython:3.6.9-alpine倉曎するず、私はそれを解決したした

Flask + Docker + Kubernetesを実行するのず同じ課題に盎面したした。 CPUずメモリの制限を増やすこずで、私はそれを解決したした。

同じこずが私たちにも起こりたした。 リ゜ヌス制限を増やすず、問題が修正されたした。

これは、macOS Catalinaコンテナ化されおいないで突然起こりたした。

私を助けたのは

  1. opensslのむンストヌル
brew install openssl
  1. これを実行しお~/.zshrc远加したす
export DYLD_LIBRARY_PATH=/usr/local/opt/openssl/lib:$DYLD_LIBRARY_PATH

出兞 https 

同様の課題を抱えおおり、誰かが私を助けおくれればありがたいです。
これは私が持っおいたものです。

" root @ ubuntu-s-1vcpu-1gb-nyc1-01 〜sudo systemctl status gunicorn.service●gunicorn.service-gunicornデヌモンロヌド枈みロヌド枈み/etc/systemd/system/gunicorn.service;無効;ベンダヌプリセット有効アクティブ月2020-02-24 07:48:04 UTC以降アクティブ実行䞭; 44分前メむンPID4846gunicornタスク4制限1151CGroup/system.slice/gunicorn.service├ ─4846/ home / bright / djangoprojectdir / djangoprojectenv / bin / python / home / bright / djangoprojectdir / djangoprojectenv / bin /gunicorn-├─4866/ home / bright / djangoprojectdir / djangoprojectenv / bin / python / home / bright / djangoprojectdir / djangoprojectenv / bin /gunicorn-├─4868/ home / bright / djangoprojectdir / djangoprojectenv / bin / python / home / bright / djangoprojectdir / djangoprojectenv / bin /gunicorn-└─4869/ home / bright / djangoprojectdir / djangoprojectenv / bin / python / home / bright / djangoprojectdir / djangoprojectenv / bin / gunicorn- 2月24日074804ubuntu-s-1vcpu-1gb-nyc1-01 systemd [1]gunicornデヌモンを停止したした。2月24日07:48:04 ubuntu-s-1vcpu -1gb-nyc1-01 systemd [1 ]gunicornデヌモンを起動したした。 2月24日074805ubuntu-s-1vcpu-1gb-nyc1-01 gunicorn [4846][2020-02-24 07:48:05 +0000] [4846] [INFO]開始gunicorn20.0。42月24日07:48:05 ubuntu-s-1vcpu-1gb-nyc1-01 gunicorn [4846][2020-02-24 07:48:05 +0000] [4846] [INFO]リスニングunix/ run / gunicorn .soc 2月24日074805ubuntu-s-1vcpu-1gb-nyc1-01 gunicorn [4846][2020-02-24 07:48:05 +0000] [4846] [情報]ワヌカヌの䜿甚同期2月24 07:48:05 ubuntu-s-1vcpu-1gb-nyc1-01 gunicorn [4846][2020-02-24 07:48:05 +0000] [4866] [INFO] pidを䜿甚した起動ワヌカヌ4866 2月24日07:48:05 ubuntu-s-1vcpu-1gb-nyc1-01 gunicorn [4846][2020-02-24 07:48:05 +0000] [4868] [INFO] pidを䜿甚した起動ワヌカヌ4868 Feb 24 07 4805 ubuntu-s-1vcpu-1gb-nyc1-01 gunicorn [4846][2020-02-24 07:48:05 +0000] [4869] [INFO] pidを䜿甚した起動ワヌカヌ4869 Feb 24 08 03:41 ubuntu-s-1vcpu-1gb-nyc1-01 gunicorn [4846]---- [24 / Feb / 2020080341 +0000] "GET / HTTP / 1.0" 400 26 "-" "Mozilla /5.0Wi lines 1-20 / 20END "誰かが私がそれを修正するのを手䌝っおくれたせんか

@BrightNanaは、 dmesgを䞎えお、gunicorn゚ラヌがあるかどうかを確認できたすか
dmesg | grep gunicornは、他の゚ラヌを陀倖するのに圹立ちたす

こんにちは、
systemdサヌビスずしおgunicornを提䟛したい堎合、debian9でも同じバグがありたす。 CLIから起動するず、gunicornぱラヌなしで実行されたす。

dmesg | grep gunicornから抜出

journalctlからの抜粋
MÀr 12 07:01:06 build-server gunicorn[828]: [2020-03-12 07:01:06 +0100] [1054] [INFO] Booting worker with pid: 1054 MÀr 12 07:01:06 build-server gunicorn[828]: [2020-03-12 07:01:06 +0100] [1057] [INFO] Booting worker with pid: 1057 MÀr 12 07:01:06 build-server gunicorn[828]: [2020-03-12 07:01:06 +0100] [1060] [INFO] Booting worker with pid: 1060 MÀr 12 07:01:07 build-server gunicorn[828]: [2020-03-12 07:01:07 +0100] [1064] [INFO] Booting worker with pid: 1064 MÀr 12 07:01:07 build-server gunicorn[828]: [2020-03-12 07:01:07 +0100] [1067] [INFO] Booting worker with pid: 1067 MÀr 12 07:01:07 build-server gunicorn[828]: [2020-03-12 07:01:07 +0100] [1070] [INFO] Booting worker with pid: 1070 MÀr 12 07:01:07 build-server gunicorn[828]: [2020-03-12 07:01:07 +0100] [1073] [INFO] Booting worker with pid: 1073 MÀr 12 07:01:07 build-server gunicorn[828]: [2020-03-12 07:01:07 +0100] [1076] [INFO] Booting worker with pid: 1076 MÀr 12 07:01:08 build-server gunicorn[828]: [2020-03-12 07:01:08 +0100] [1079] [INFO] Booting worker with pid: 1079 MÀr 12 07:01:08 build-server gunicorn[828]: [2020-03-12 07:01:08 +0100] [1082] [INFO] Booting worker with pid: 1082 MÀr 12 07:01:08 build-server gunicorn[828]: [2020-03-12 07:01:08 +0100] [1085] [INFO] Booting worker with pid: 1085 MÀr 12 07:01:08 build-server gunicorn[828]: [2020-03-12 07:01:08 +0100] [1088] [INFO] Booting worker with pid: 1088 MÀr 12 07:01:08 build-server gunicorn[828]: [2020-03-12 07:01:08 +0100] [1091] [INFO] Booting worker with pid: 1091 MÀr 12 07:01:09 build-server gunicorn[828]: [2020-03-12 07:01:09 +0100] [1094] [INFO] Booting worker with pid: 1094
systemctl statusからの抜粋
● api.service - API Server for BuildingChallenge served with Gunicorn Loaded: loaded (/etc/systemd/system/api.service; disabled; vendor preset: enabled) Active: active (running) since Thu 2020-03-12 08:26:01 CET; 22min ago Main PID: 8150 (gunicorn) Tasks: 3 (limit: 4915) Memory: 37.7M (high: 100.0M max: 500.0M) CGroup: /system.slice/api.service ├─ 8150 /opt/api/venv/bin/python /opt/api/venv/bin/gunicorn --bind unix:api.sock wsgi:app ├─28936 /opt/api/venv/bin/python /opt/api/venv/bin/gunicorn --bind unix:api.sock wsgi:app └─28938 /usr/bin/python3 -Es /usr/bin/lsb_release -a MÀr 12 08:48:01 build-server gunicorn[8150]: [2020-03-12 08:48:01 +0100] [28909] [INFO] Booting worker with pid: 28909 MÀr 12 08:48:01 build-server gunicorn[8150]: [2020-03-12 08:48:01 +0100] [28912] [INFO] Booting worker with pid: 28912 MÀr 12 08:48:01 build-server gunicorn[8150]: [2020-03-12 08:48:01 +0100] [28915] [INFO] Booting worker with pid: 28915 MÀr 12 08:48:01 build-server gunicorn[8150]: [2020-03-12 08:48:01 +0100] [28918] [INFO] Booting worker with pid: 28918 MÀr 12 08:48:01 build-server gunicorn[8150]: [2020-03-12 08:48:01 +0100] [28921] [INFO] Booting worker with pid: 28921 MÀr 12 08:48:01 build-server gunicorn[8150]: [2020-03-12 08:48:01 +0100] [28924] [INFO] Booting worker with pid: 28924 MÀr 12 08:48:02 build-server gunicorn[8150]: [2020-03-12 08:48:02 +0100] [28927] [INFO] Booting worker with pid: 28927 MÀr 12 08:48:02 build-server gunicorn[8150]: [2020-03-12 08:48:02 +0100] [28930] [INFO] Booting worker with pid: 28930 MÀr 12 08:48:02 build-server gunicorn[8150]: [2020-03-12 08:48:02 +0100] [28933] [INFO] Booting worker with pid: 28933 MÀr 12 08:48:02 build-server gunicorn[8150]: [2020-03-12 08:48:02 +0100] [28936] [INFO] Booting worker with pid: 28936

ご協力いただきありがずうございたす。

このような状況のデバッグに圹立぀PRを䜜成したした。 誰か芋おもらえたすか
https://github.com/benoitc/gunicorn/pull/2315

Docker内で実行されおいるFlaskアプリケヌションでも同じ問題が発生したした。 ワヌカヌは、プロセスIDを増やしながら無限に再起動しおいたした。
image

問題は私にずっおメモリ関連でした。Dockerに蚱可されるメモリを増やすず、ワヌカヌが効果的に生成されたした。
image

@tilgovi 、あなたが最初にそこに着いたので、あなたが私の倉曎をあなたのPRに取り入れたいかどうか私は気にしたせん。 これは、信号を介しお殺されおいる劎働者をカバヌしたす。

@mildebrandt芋おみたす、ありがずう

たた、Dockerコンテナ内でGunicorn20.0.4+ Gevent1.5.0+ Flaskを䜿甚するず、この動䜜が突然発生したす。

[  328.699160] gunicorn[5151]: segfault at 78 ip 00007fc1113c16be sp 00007ffce50452a0 error 4 in _greenlet.cpython-37m-x86_64-linux-gnu.so[7fc11138d000+3e000]

私の堎合、ご芧のずおり、セグメンテヌション違反はgeventが原因です。 奇劙なこずに、このコンテナは5日前に正垞に機胜し、その埌コヌドは倉曎されず、ラむブラリのバヌゞョンも倉曎されず、すべおが特定のリリヌスに蚭定されおいたす。 䟝存関係ずしおflask-mailを削陀したした。これにより、他の䟝存関係のバヌゞョンがわずかに倉曎された可胜性がありたす。

gevent == 1.5.0からgevent == 20.9.0に曎新するず、問題が解決したした。

@ifiddesあなたの問題はおそらく無関係です。 叀いバヌゞョンのgeventず最新バヌゞョンのグリヌンレットの間でABIの互換性の問題が発生しおいたす。 https://github.com/python-greenlet/greenlet/issues/178を参照しお

ああ、@ jamaddenに感謝したす。 この投皿は、ブヌトワヌカヌの無限のスポヌンを怜玢したずきに芋぀けたすべおでしたが、その問題ずその問題のタむミングは私の問題に適合したした。

Ubuntu 20.04サヌバヌをAWSマシンで、本番環境で

このマシンは、他の本番マシンず同様にAnsibleを䜿甚しお構成されたした。

[2020-10-15 15:11:49 +0000] [18068] [DEBUG] Current configuration:
  config: None
  bind: ['127.0.0.1:8000']
  backlog: 2048
  workers: 1
  worker_class: uvicorn.workers.UvicornWorker
  threads: 1
  worker_connections: 1000
  max_requests: 0
  max_requests_jitter: 0
  timeout: 30
  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: /var/www/realistico/app
  daemon: False
  raw_env: []
  pidfile: None
  worker_tmp_dir: None
  user: 1001
  group: 1001
  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: /var/www/realistico/logs/gunicorn/access.log
  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: /var/www/realistico/logs/gunicorn/error.log
  loglevel: debug
  capture_output: False
  logger_class: gunicorn.glogging.Logger
  logconfig: None
  logconfig_dict: {}
  syslog_addr: udp://localhost:514
  syslog: False
  syslog_prefix: None
  syslog_facility: user
  enable_stdio_inheritance: False
  statsd_host: None
  dogstatsd_tags: 
  statsd_prefix: 
  proc_name: None
  default_proc_name: realistico.asgi:application
  pythonpath: None
  paste: None
  on_starting: <function OnStarting.on_starting at 0x7f7ba5fdd550>
  on_reload: <function OnReload.on_reload at 0x7f7ba5fdd670>
  when_ready: <function WhenReady.when_ready at 0x7f7ba5fdd790>
  pre_fork: <function Prefork.pre_fork at 0x7f7ba5fdd8b0>
  post_fork: <function Postfork.post_fork at 0x7f7ba5fdd9d0>
  post_worker_init: <function PostWorkerInit.post_worker_init at 0x7f7ba5fddaf0>
  worker_int: <function WorkerInt.worker_int at 0x7f7ba5fddc10>
  worker_abort: <function WorkerAbort.worker_abort at 0x7f7ba5fddd30>
  pre_exec: <function PreExec.pre_exec at 0x7f7ba5fdde50>
  pre_request: <function PreRequest.pre_request at 0x7f7ba5fddf70>
  post_request: <function PostRequest.post_request at 0x7f7ba5f6e040>
  child_exit: <function ChildExit.child_exit at 0x7f7ba5f6e160>
  worker_exit: <function WorkerExit.worker_exit at 0x7f7ba5f6e280>
  nworkers_changed: <function NumWorkersChanged.nworkers_changed at 0x7f7ba5f6e3a0>
  on_exit: <function OnExit.on_exit at 0x7f7ba5f6e4c0>
  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: None
  raw_paste_global_conf: []
  strip_header_spaces: False
[2020-10-15 15:11:49 +0000] [18068] [INFO] Starting gunicorn 20.0.4
[2020-10-15 15:11:49 +0000] [18068] [DEBUG] Arbiter booted
[2020-10-15 15:11:49 +0000] [18068] [INFO] Listening at: unix:/run/gunicorn.sock (18068)
[2020-10-15 15:11:49 +0000] [18068] [INFO] Using worker: uvicorn.workers.UvicornWorker
[2020-10-15 15:11:49 +0000] [18080] [INFO] Booting worker with pid: 18080
[2020-10-15 15:11:49 +0000] [18068] [DEBUG] 1 workers
[2020-10-15 15:11:51 +0000] [18083] [INFO] Booting worker with pid: 18083
[2020-10-15 15:11:53 +0000] [18086] [INFO] Booting worker with pid: 18086
...
[2020-10-15 15:12:09 +0000] [18120] [INFO] Booting worker with pid: 18120
[2020-10-15 15:12:11 +0000] [18123] [INFO] Booting worker with pid: 18123

この問題の解決に成功せずにそしおログに゚ラヌが発生するこずなく䜕床も倱敗した埌、私はこのHello worldを詊しおみたしたが、次の゚ラヌが芋぀かりたした

ModuleNotFoundError: No module named 'httptools'

httptoolsむンストヌルした埌、 Hello worldアプリケヌションは正垞に動䜜し、予期せず、私のアプリケヌションも動䜜したす。

゚ラヌがログに蚘録されなかった理由や、このラむブラリが他のマシンにむンストヌルされたが新しいマシンにはむンストヌルされなかった理由はわかりたせんが、これで問題が解決したす。

これが最近発生し、すべおのCPUを消費しお、それがあったkubernetesノヌドを停止したした。 dmesgに関するヒントのおかげで、最終的に゚ラヌが芋぀かりたした。

[225027.348869] traps: python[44796] general protection ip:7f8bd8f8f8b0 sp:7ffc21a0b370 error:0 in libpython3.7m.so.1.0[7f8bd8dca000+2d9000]

結局、私の問題はhttps://github.com/python-greenlet/greenlet/issues/178の別のむンスタンスであり、gunicorn、gevent、およびgreenletを最新バヌゞョンに曎新するこずで解決されたした。

これらのタむプの䟋倖はPythonログを䜜成せず、キャッチできず、終了コヌド0を返し、発生するずマシンをハングさせる可胜性があるため、管理が非垞に困難です。

私は、gunicornがこの性質の急速なクラッシュルヌプを怜出し、

  • 新しい劎働者の産卵をあきらめるか、レヌト制限する
  • この問題ずhttps://github.com/python-greenlet/greenlet/issues/178に人々を導く有甚なメッセヌゞを提䟛し

おそらくmax_consecutive_startup_crashes 、デフォルトはnum_workers * 10ですか

2504でクラッシュルヌプ機胜のリク゚ストを远跡したしょう。 2315に远加でログむンするためのPRもありたす。 誰もが問題をデバッグしたようで、将来的に他の人を助けるためにいく぀かの機胜芁求ず改善がありたすので、この問題を閉じたす。 みんな、ありがずう

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡