(์ฌ๊ธฐ์ ๋ ๋ฐฑ์ ๋ํด ์ ๊ฐ์ค๋ฝ๊ฒ ์๊ฐํฉ๋๋ค. ๊ฐ๋จํ ์ผ์ด ๋ณต์กํด์ ธ์ ๊ฒฐ๊ตญ ์คํ์ ํํค์ณค์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ด๊ฐ ๋ฌธ์ํํ ๋ด์ฉ์ด ๋ ์์๊ฒ ๋์์ด ๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.)
๋ด๊ฐ ์ดํดํ๋ฏ์ด ๊ธฐ๋ณธ์ ์ผ๋ก :
30
์ด( timeout
๋ก ๊ตฌ์ฑ ๊ฐ๋ฅ) ํ gunicorn ๋ง์คํฐ ํ๋ก์ธ์ค๋ SIGTERM
๋ฅผ ์์
์ ํ๋ก์ธ์ค์ ์ ์กํ์ฌ ์ ์์ ์ธ ์ฌ์์์ ์์ํฉ๋๋ค.30
์ด ๋์ ์ข
๋ฃ๋์ง ์์ผ๋ฉด( graceful_timeout
๋ก ๊ตฌ์ฑ ๊ฐ๋ฅ) ๋ง์คํฐ ํ๋ก์ธ์ค๋ SIGKILL
๋ฅผ ๋ณด๋
๋๋ค. graceful_timeout
๊ธฐ๊ฐ(https://github.com/benoitc/gunicorn/commit/d1a09732256fa8db900a1fe75a71466cf2645ef9) ๋์ ์์
์๊ฐ ์ ์์ ์ผ๋ก ์ข
๋ฃ _does_ํ ๋๋ ์ด ์ ํธ๊ฐ ์ ์ก๋๋ ๊ฒ ๊ฐ์ต๋๋ค.์ง๋ฌธ:
SIGTERM
์ ํธ๋ฅผ ์ด๋ป๊ฒ ์ฒ๋ฆฌํฉ๋๊น? ์ค์ ๋ก ์์ฒญ ์ฒ๋ฆฌ ์ค์ ์ด๋ค ์ผ์ด ๋ฐ์ํฉ๋๊น? ์์ฒญ ์ฒ๋ฆฌ๊ฐ ์๋ฃ๋ ํ ์ข
๋ฃํด์ผ ํ๋ WSGI ์์ฉ ํ๋ก๊ทธ๋จ(werkzeug ์์ค์์) ํ๋๊ทธ๋ฅผ ์ค์ ํฉ๋๊น? ์๋๋ฉด SIGTERM
๊ฐ ์ด๋ฏธ ์งํ ์ค์ธ ์์ฒญ ์ฒ๋ฆฌ์ ์ํฅ์ ๋ฏธ์น๊ณ ์์ต๋๊น? IO ์ฐ๊ฒฐ์ ์ข
๋ฃํ๊ฑฐ๋ ์์ฒญ ์ฒ๋ฆฌ ์๋๋ฅผ ๋์ด๊ธฐ ์ํ ๊ฒ...?SIGKILL
์์ ์์ฒญ ์ฒ๋ฆฌ๊ฐ ๊ฐ์ ๋ก ์ค๋จ๋ ๊ฒ ๊ฐ์ต๋๋ค.
์ค์ ๋ก ์๋ํ๋ ๋ฐฉ์์ ์ดํดํ๋ฉด ์ด์ ๋ํ ๋ฌธ์๋ฅผ ๊ฐ์ ํ๊ธฐ ์ํด ์์ PR์ ์ ์ถํ ์ ์์ต๋๋ค.
ํ , https://github.com/benoitc/gunicorn/issues/1236#issuecomment -254059927 ์์ฒญ ์ฒ๋ฆฌ๊ฐ ์๋ฃ๋ ํ ์์
์๋ฅผ ์ข
๋ฃํ๋๋ก ์ค์ ํ๋ SIGTERM
์ ๋ํ ๋ด ๊ฐ์ ์ ํ์ธํ๋ ๊ฒ ๊ฐ์ต๋๋ค(๊ทธ๋ฆฌ๊ณ ์์
์๊ฐ ์๋ฝํ์ง ์๋๋ก ์ค์ ) ๋ชจ๋ ์๋ก์ด ์ฐ๊ฒฐ).
timeout
๋ฐ graceful_timeout
๋ฅผ ํด์ํ ๋ฐฉ์์ด ์๋ชป๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ ๊ธฐ๊ฐ ๋ชจ๋ ์ค์ ๋ก ์์ฒญ ์ฒ๋ฆฌ๊ฐ ์์๋ ์๊ฐ์ ๋ํ๋
๋๋ค. ๋ฐ๋ผ์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ ์ค์ ๋ชจ๋ 30
์ด๋ก ์ค์ ๋์ด ์์ผ๋ฏ๋ก ์ ์์ ์ธ ์ฌ์์์ด ํ์ฑํ๋์ง ์์ต๋๋ค. --graceful-timeout 15 --timeout 30
์ ๊ฐ์ ์์
์ ์ํํ๋ฉด ์ ์์ ์ธ ์ฌ์์์ด 15์ด์ ์์๋๊ณ ๊ทธ ์ ์ ์์ฒญ์ด ์๋ฃ๋์ง ์์ ๊ฒฝ์ฐ ์์
์๊ฐ 30์ด์ ๊ฐ์ ์ข
๋ฃ๋ฉ๋๋ค.
๊ทธ๋ฐ๋ฐ graceful_timeout
์ timeout
์ฌ์ด์ ์๋ต์ด ๋์์ค๋ฉด ๊ฒฐ๊ตญ ์์
์๊ฐ ๋ค์ ์์๋์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ ๋ผ?
app.py
๋ก ํ
์คํธํ์ต๋๋ค.
import time
from flask import Flask
app = Flask(__name__)
@app.route('/foo')
def foo():
time.sleep(3)
return 'ok'
๊ทธ ๋ค์์:
12:51 $ gunicorn app:app --timeout 5 --graceful-timeout 1
[2017-04-03 12:51:37 +0300] [356] [INFO] Starting gunicorn 19.6.0
[2017-04-03 12:51:37 +0300] [356] [INFO] Listening at: http://127.0.0.1:8000 (356)
[2017-04-03 12:51:37 +0300] [356] [INFO] Using worker: sync
[2017-04-03 12:51:37 +0300] [359] [INFO] Booting worker with pid: 359
๊ทธ๋ฐ ๋ค์ 3์ด ํ์ ๋ฐํ๋๋ curl localhost:8000/foo
๋ฅผ ๋ณด๋
๋๋ค. ๊ทธ๋ฌ๋ gunicorn์์๋ ์๋ฌด ์ผ๋ ์ผ์ด๋์ง ์์ต๋๋ค. ์ ์์ ์ธ ์ฌ์์์ด ์์๋๊ฑฐ๋ ๋ฐ์ํ ํ์ ์ด ๋ณด์ด์ง ์์ต๋๊น?
timeout
์์ SystemExit(1,)
๊ฐ ๋ฐ์ํ์ฌ Flask์ ํ์ฌ ์์ฒญ ์ฒ๋ฆฌ๊ฐ ์ค๋จ๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ด๋ค ์ฝ๋๋ ์ ํธ๊ฐ ๊ทธ๊ฒ์ ์์ฑํ๋์ง ๋งํ ์ ์์ต๋๋ค.
์ด ์์ธ๋ Flask ์คํ์ ํตํด ๋ฐ์ํ๊ณ ๋ชจ๋ teardown_request
ํธ๋ค๋ฌ๊ฐ ์ด๋ฅผ ํฌ์ฐฉํฉ๋๋ค. ๋ฌด์ธ๊ฐ๋ฅผ ๊ธฐ๋กํ ์๊ฐ์ ์ถฉ๋ถํ์ง๋ง time.sleep(1)
๋๋ ์ฒ๋ฆฌ๊ธฐ์์ ์๊ฐ์ด ๋ง์ด ๊ฑธ๋ฆฌ๋ ๋ค๋ฅธ ์์
์ ์ํํ๋ฉด ์๋์ผ๋ก ์ข
๋ฃ๋ฉ๋๋ค. ํ๋ก์ธ์ค๊ฐ ์ค์ ๋ก ๊ฐ์ ์ข
๋ฃ๋๊ธฐ๊น์ง 100-200ms์ ์๊ฐ์ด ์์๋ ๊ฒ ๊ฐ์ผ๋ฉฐ ์ด ์ง์ฐ์ด ๋ฌด์์ธ์ง ๊ถ๊ธํฉ๋๋ค. ์ ์์ ์ธ ์๊ฐ ์ด๊ณผ๊ฐ ์๋๋ฉฐ ํด๋น ์ค์ ์ ์ง์ฐ์ ์ํฅ์ ๋ฏธ์น์ง ์์ต๋๋ค. SystemExit
์คํ์ ํตํด ๋์ ธ์ง๋ ๋์ ํ๋ก์ธ์ค๊ฐ ๊ฐ์ ์ข
๋ฃ๋ ๊ฒ์ผ๋ก ์์ํ์ง๋ง ์ด์จ๋ ์ ์ฌ์ ์ผ๋ก ํ๋ก์ธ์ค๊ฐ ๊ณต์ค์์ ์ข
๋ฃ๋ฉ๋๋ค.
์ฌ์ค, ๋๋ graceful_timeout
๊ฐ ์๋ฌด๊ฒ๋ ํ์ง ์๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค - ๋๊ธฐํ ์์
์์ ๋ํด ์ง์๋์ง ์๊ฑฐ๋ "๋
๋ฆฝ ์คํํ"์ผ๋ก ์๋ํ์ง ์์ ์ ์์ต๋๋ค(๋๋ timeout
์ ํจ๊ป) - ๋ง SIGTERM
๋ฅผ ์๋์ผ๋ก ๋ณด๋ผ ๋?
๋ํ ์ด์ํ ์ ์ https://github.com/benoitc/gunicorn/blob/master/gunicorn/arbiter.py#L392 ๊ฐ graceful
ํ๋๊ทธ๋ฅผ ์ ํ ํ์ธํ์ง ์๋๋ค๋ ๊ฒ์
๋๋ค. https://github.com/benoitc/gunicorn/blob/master/gunicorn/arbiter.py#L390 ์ self.WORKERS
์ด ๋น์ด ์์ผ๋ฏ๋ก ๋น์ ์ ์ ์ง๋ฅผ ํ ๋ ์ฐ์ํ ์๊ฐ ์ด๊ณผ๊ฐ ๊ธฐ๋ค๋ฆฌ์ง ์๋๋ก ํฉ๋๋ค.
@benoitc @tilgovi ์ฌ๊ธฐ์์ ์์ ๋ด๋ฐ์ด ์ฃผ์๊ฒ ์ต๋๊น? ์์ ๋ด ๊ธ์ด ์๋ฏธ๊ฐ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค ...
@tuco86 graceful timeout
๋ ์ค์ฌ์๋ฅผ ์ข
๋ฃํ๊ฑฐ๋ ์
๊ทธ๋ ์ด๋(USR2)ํ๊ฑฐ๋ ์ค์ฌ์์๊ฒ HUP ์ ํธ๋ฅผ ๋ณด๋ด๊ฑฐ๋ ์์
์์๊ฒ QUIT ์ ํธ๋ฅผ ๋ณด๋ผ ๋๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ฆ, ๋์์ด ์ ์์ผ ๋๋ง ์ฌ์ฉ๋ฉ๋๋ค.
์๊ฐ ์ด๊ณผ๋ ๋ฐ์ ์์
์๊ฐ ๋ค๋ฅธ ์์ฒญ์ ์ฐจ๋จํ๋ ๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํ ๊ฒ์
๋๋ค. timeout
๋ณด๋ค ์งง์ ์๊ฐ ๋ด์ ์ค์ฌ์์๊ฒ ์๋ฆฌ์ง ์์ผ๋ฉด ์์
์๋ ๋จ์ํ ์ข
๋ฃ๋๊ณ ํด๋ผ์ด์ธํธ์์ ์ฐ๊ฒฐ์ด ๋ซํ๋๋ค.
์ด, ์์์ด. timeout
๋ ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ์ ํจ๊ณผ๊ฐ ์์ต๋๊น?
์ค์ฌ์ ์ข ๋ฃ, ์ ๊ทธ๋ ์ด๋(USR2), ์ค์ฌ์์๊ฒ HUP ์ ํธ ๋ณด๋ด๊ธฐ ๋๋ ์์ ์์๊ฒ QUIT ์ ํธ ๋ณด๋ด๊ธฐ
๋ด ๋ง์, ์์
์๊ฐ graceful_timeout
์ ์ข
๋ฃ๋์ง ์์ผ๋ฉด - ๊ทธ ํ timeout
๊ฐ ์์๋๊ณ ์์
์๊ฐ ๊ฐ์ ๋ก ์ฃฝ์์ ๋นํ๊ฑฐ๋ SIGQUIT
๋ฅผ ํธ์ถํ๋ ๊ฒ์ ์ฌ์ฉ์์๊ฒ ๋ฌ๋ ค ์์ต๋๋ค.
์์ ์์๊ฒ QUIT ์ ํธ
์ฌ๊ธฐ์ TERM
๋ฅผ ์๋ฏธํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค( QUIT
๋ ๋ง์คํฐ์ ์์
์ ๋ชจ๋์ ๋ํด _๋น ๋ฅธ ์ข
๋ฃ_๋ก ๋ฌธ์ํ๋์ด ์์ผ๋ฏ๋ก)?
์์ ์๊ฐ ์ ์์ ์ธ ์๊ฐ ๋์ ์ข ๋ฃํ์ง ์์ผ๋ฉด ๋ค๋ฅธ ์ง์ฐ ์์ด ์ข ๋ฃ๋ฉ๋๋ค.
๋น์ฐํ์ง. ์ ๋ฆฌํด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค!
@benoitc ์ด ์ค๋๋ ํฐ์ผ์ ๋งฅ๋ฝ์์ ์ง๋ฌธ - timeout
๋ฌธ์์ ๋ง์ง๋ง ๋ฌธ์ฅ์ ์ค์ ๋ก ๋ฌด์์ ์๋ฏธํฉ๋๊น?
์ผ๋ฐ์ ์ผ๋ก 30์ด๋ก ์ค์ ๋ฉ๋๋ค. ๋๊ธฐํ ์์ ์์ ๋ํ ์ํฅ์ ํ์ ํ๋ ๊ฒฝ์ฐ์๋ง ์ด ๊ฐ์ ๋์ ๋๊ฒ ๋๊ฒ ์ค์ ํ์ญ์์ค. ๋น ๋๊ธฐํ ์์ ์์ ๊ฒฝ์ฐ ์์ ์ ํ๋ก์ธ์ค๊ฐ ์ฌ์ ํ ํต์ ์ค์ด๋ฉฐ ๋จ์ผ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๋ฐ ํ์ํ ์๊ฐ ๊ธธ์ด์ ๊ด๋ จ์ด ์์์ ์๋ฏธํฉ๋๋ค.
์ ๋ ์์ด๊ฐ ๋ชจ๊ตญ์ด๊ฐ ์๋๋ผ์ ์ดํดํ๊ธฐ ์ด๋ ต์ต๋๋ค. timeout
gthread
๋น๋๊ธฐ ์์
์์ ๋ํด ์ง์๋์ง ์๋๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๊น? )?
@tuukkamustonen --timeout
๋ ์์ฒญ ์๊ฐ ์ด๊ณผ๋ฅผ ์๋ฏธํ์ง ์์ต๋๋ค. ๊ทธ๊ฒ์ ๋
ธ๋์๋ฅผ ์ํ ์์กด ์ฒดํฌ๋ฅผ ์๋ฏธํฉ๋๋ค. ๋๊ธฐํ ์์
์์ ๊ฒฝ์ฐ ์์
์๊ฐ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๊ฒ ์ธ์๋ ์๋ฌด ๊ฒ๋ ํ ์ ์๊ธฐ ๋๋ฌธ์ ์์ฒญ ์๊ฐ ์ด๊ณผ๋ก ์๋ํฉ๋๋ค. ๋น๋๊ธฐ์ ์์
์๋ ์ฅ๊ธฐ ์คํ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๋์์๋ ํํธ๋นํธ์ด๋ฏ๋ก ์์
์๊ฐ ์ฐจ๋จ/๋๊ฒฐํ์ง ์๋ ํ ์ข
๋ฃ๋์ง ์์ต๋๋ค.
๋ค๋ฅธ ์ฌ๋๋ค์ด ์ด๊ฒ์ ํผ๋ํ๋ ๊ฒฝ์ฐ ์ด๋ฆ์ ๋ณ๊ฒฝํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
@tilgovi timeout
๋ ๊ด์ฐฎ์ง๋ง worker_timeout
์ ๊ฐ์ ๊ฒ์ด ๋ ์ค๋ช
์ ์ผ ์ ์์ต๋๋ค. timeout
๋ฐ graceful_timeout
๊ฐ ๋ฌธ์์์ ์๋ก ์์ ์ ์ธ๋์ด ์๊ธฐ ๋๋ฌธ์ ์ฒ์์๋ ํผ๋์ค๋ฌ์ ์ต๋๋ค. ๊ทธ๋์ ๋ด ๋๋๋ ๊ทธ๊ฒ๋ค์ด ๋ฐ์ ํ๊ฒ ์ฐ๊ฒฐ๋์ด ์๋ค๊ณ ๊ฐ์ ํ์ง๋ง ์ค์ ๋ก๋ ๊ทธ๋ ์ง ์์์ต๋๋ค.
๋๊ธฐํ ์์ ์์ ๊ฒฝ์ฐ ์์ ์๊ฐ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๊ฒ ์ธ์๋ ์๋ฌด ๊ฒ๋ ํ ์ ์๊ธฐ ๋๋ฌธ์ ์์ฒญ ์๊ฐ ์ด๊ณผ๋ก ์๋ํฉ๋๋ค. ๋น๋๊ธฐ์ ์์ ์๋ ์ฅ๊ธฐ ์คํ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๋์์๋ ํํธ๋นํธ์ด๋ฏ๋ก ์์ ์๊ฐ ์ฐจ๋จ/๋๊ฒฐํ์ง ์๋ ํ ์ข ๋ฃ๋์ง ์์ต๋๋ค.
timeout
๊ฐ ๋๊ธฐํ๋์ง ์์ ์์
์์ ํจ๊ป ์์๋๋ ๊ฒฝ์ฐ์ ์๊ฐ ์์ต๋๊น? ์ ๋๋ก ์ผ์ด๋์๋ ์ ๋๋ ์ผ์
๋๊น? ์์
์๋ฅผ ์ฐจ๋จ/์ ์ง์ํค๋ ๋ฒ๊ทธ๊ฐ ์๋ ๊ฒฝ์ฐ์๋ง ๊ฐ๋ฅํฉ๋๊น?
๋ง์ต๋๋ค. ์ด๋ฒคํธ ๋ฃจํ ์ฝ์ด์ ์์กดํ๋ ๋น๋๊ธฐ ์์ ์๋ ์ ํ ์๊ฐ ๋ด์ ์๋ณดํ์ง ์๋ CPU ์ง์ฝ์ ์ ์ฐจ๋ฅผ ์ํํ ์ ์์ต๋๋ค.
์ฆ, ๋ฒ๊ทธ๋ฟ๋ง์ด ์๋๋๋ค. ๊ทธ๋ฌ๋ ๋๋๋ก asyncio ํ๋กํ ์ฝ์ด ๋ ์ ์ ํ ๋ ์ฐจ๋จ I/O ํจ์์ ๋ํ ํธ์ถ๊ณผ ๊ฐ์ ๋ฒ๊ทธ๋ฅผ ๋ํ๋ผ ์ ์์ต๋๋ค.
CPU ์ง์ฝ์ ์ธ ์์ ์ ๊ฐํ ๊ฒ์ด ์ข์ ์์ ๋๋ค. ๊ฐ์ฌํฉ๋๋ค.
๋น๋๊ธฐ ์ฝ๋์์ ์ฐจ๋จ I/O๋ฅผ ํธ์ถํ๋ ๊ฒ๋ ํ๋์ง๋ง ์ด ์ปจํ
์คํธ์ ์ด๋ป๊ฒ ์ ์ฉ๋๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์ฐจ๋จ ์ฝ๋๊ฐ ์๋ ๊ธฐ์กด Flask ์ฑ์ โโ์คํํ๊ณ ์์ง๋ง ๋น๋๊ธฐ ์์
์( gthread
) ์ด๋ค ์ข
๋ฅ์ ์์ญ์ด ํจ์น๋ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ ์ ์๋ํฉ๋๋ค. ๋๋ ์ด๊ฒ์ด ๋ ์ด์ ์ด ํฐ์ผ์ ๋งฅ๋ฝ์ ์์ง ์๋ค๋ ๊ฒ์ ์๊ณ ์์ง๋ง ์ด์ ๊ฐ์ ๋น๋๊ธฐ/๋๊ธฐํ ์ฝ๋๋ฅผ ํผํฉํ๊ณ ์ผ์น์ํค๋ฉด ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์์ต๋๊น?
๋ํ ์ฌ์ฅ ๋ฐ๋ ๊ฐ๊ฒฉ์ ๋ฌด์์
๋๊น? ๋๊ธฐํ๋์ง ์์ ์์
์์ ํจ๊ป timeout
์ ์ฌ์ฉํ ์ ์์ ์ธ ๊ฐ์ ๋ฌด์์
๋๊น?
gthread ์์ ์๋ ๋น๋๊ธฐ์ ์ด์ง ์์ง๋ง ํํธ๋นํธ์ ๋ํ ๊ธฐ๋ณธ ์ค๋ ๋๊ฐ ์์ผ๋ฏ๋ก ์๊ฐ ์ด๊ณผ๋์ง ์์ต๋๋ค. ํด๋น ์์ ์์ ๊ฒฝ์ฐ ์์ ์๊ฐ ๋งค์ฐ ์ค๋ฒ๋ก๋๋๊ฑฐ๋ ๋ ๊ฐ๋ฅ์ฑ์ด ๋์ C ํ์ฅ ๋ชจ๋์ ํธ์ถํ์ฌ GIL์ ํด์ ํ์ง ์๋ ํ ์๊ฐ ์ด๊ณผ๊ฐ ํ์๋์ง ์์ต๋๋ค.
์์ ์ ์๊ฐ ์ด๊ณผ๊ฐ ํ์๋๊ธฐ ์์ํ์ง ์๋ ํ ์๊ฐ ์ด๊ณผ๋ฅผ ๋ณ๊ฒฝํ ํ์๊ฐ ์์ ๊ฒ์ ๋๋ค.
๊ด์ฐฎ์. ํ ๊ฐ์ง ๋:
gthread ์์ ์๋ ๋น๋๊ธฐ์์ด ์๋๋๋ค.
gthread
์์
์๊ฐ ๋น๋๊ธฐ๊ฐ ์๋๋ผ http://docs.gunicorn.org/en/stable/design.html#asyncio -workers์ "AsyncIO" ์์
์๋ก ๋์ด๋์ด ์๋ค๋ ๊ฒ์ด ์ฝ๊ฐ ํผ๋์ค๋ฌ์ธ ์ ์์ต๋๋ค. ๊ทธ ์ธ์ "์ค๋ ๋"๋ฅผ ์ฌ์ฉํ๋ฉด asyncio๊ฐ ํ์ํ์ง ์์ผ๋ฏ๋ก ๋
์์๊ฒ ์ง๋ฌธ์ ์ ๊ธฐํ๊ธฐ๋ ํฉ๋๋ค. ์์งํ ์ฌ์ฉ์์ ๊ด์ ์์ ์ด๊ฒ์ ๋งํ๋ ๊ฒ๋ง์ผ๋ก๋ ๊ธฐ์ ์ ์ผ๋ก ์ถฉ๋ถํ ๊ทผ๊ฑฐ๊ฐ ์๋ค๊ณ ํ์ ํฉ๋๋ค.
๊ฐ๋จํ ๋งํด์ gthread
์์
์๋ asyncio
lib๋ก ๊ตฌํ๋์ง๋ง ๋๊ธฐํ ์ฝ๋๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ค๋ ๋๋ฅผ ์์ฑํฉ๋๋ค. ํ๋ ธ๋ค๋ฉด ์ ์ ํด์ฃผ์ธ์.
๋ฌผ์ด๋ด์ฃผ์ ์ ๊ธฐ๋ป์!
์ค๋ ๋ ์์ ์๋ asyncio๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฉฐ ๊ธฐ๋ณธ ๋น๋๊ธฐ ์์ ์ ํด๋์ค์์ ์์ํ์ง ์์ต๋๋ค.
๋ฌธ์๋ฅผ ๋ช ํํ ํด์ผ ํฉ๋๋ค. ์์ ์ ์๊ฐ ์ด๊ณผ๊ฐ ๋์์ ์ฒ๋ฆฌ๋์ด ๊ธด ์์ฒญ ๋ฐ ๋์ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๊ธฐ๋ฅ๊ณผ ๊ด๋ จํ์ฌ ๋๊ธฐํ ์์ ์๋ณด๋ค ๋น๋๊ธฐ ์์ ์์ฒ๋ผ ์๋ํ๊ธฐ ๋๋ฌธ์ ๋น๋๊ธฐ๋ก ๋์ด๋์์ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ฌธ์๋ฅผ ๋ช ํํ ํ๊ณ ๋ชจ๋ ์์ ์๋ฅผ ๋ ์ ํํ๊ฒ ์ค๋ช ํ๋๋ก ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
์, gthreads ์์ ์๋ asyncio ์์ ์์ ๋์ด๋์ง ์์์ผ ํฉ๋๋ค. ๊ฐ ์์ ์์ ๋์์ธ์ ์ค๋ช ํ๋ ์น์ ์ด ์๋ ๊ฒ์ด ๋ ๋์๊น์?
์์ ์ ์ ํ ๋ฐ ์๊ฐ ์ด๊ณผ์ ๋ํ ์น์ ์ ๋ช ํํ ํ๊ธฐ ์ํด ์์ ์ผ๋ก ์ถ์ ํ ์ ์๋๋ก ์ด๊ฒ์ ๋ค์ ์ฝ๋๋ค.
@ํธ๊ณ ๋น
--timeout์ ์์ฒญ ์๊ฐ ์ด๊ณผ๋ฅผ ์๋ฏธํ์ง ์์ต๋๋ค. ๊ทธ๊ฒ์ ๋ ธ๋์๋ฅผ ์ํ ์์กด ์ฒดํฌ๋ฅผ ์๋ฏธํฉ๋๋ค. ๋๊ธฐํ ์์ ์์ ๊ฒฝ์ฐ ์์ ์๊ฐ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๊ฒ ์ธ์๋ ์๋ฌด ๊ฒ๋ ํ ์ ์๊ธฐ ๋๋ฌธ์ ์์ฒญ ์๊ฐ ์ด๊ณผ๋ก ์๋ํฉ๋๋ค. ๋น๋๊ธฐ์ ์์ ์๋ ์ฅ๊ธฐ ์คํ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๋์์๋ ํํธ๋นํธ์ด๋ฏ๋ก ์์ ์๊ฐ ์ฐจ๋จ/๋๊ฒฐํ์ง ์๋ ํ ์ข ๋ฃ๋์ง ์์ต๋๋ค.
๋น๋๊ธฐ ์์ ์์ ์ฌ์ฉํ ์ ์๋ ์์ฒญ ์๊ฐ ์ด๊ณผ ์ต์ ์ด ์์ต๋๊น? ์ฆ, Arbiter๊ฐ ์ง์ ๋ ์๊ฐ ๋ด์ ์์ฒญ์ ์ฒ๋ฆฌํ์ง ์์ ์์ ์๋ฅผ ์ฃฝ์ด๋ ๋ฐฉ๋ฒ์ ๋ฌด์์ ๋๊น?
@aschatten ๋ถํํ๋ ์์ต๋๋ค. #1658๋ ์ฐธ์กฐํ์ญ์์ค.
์ง์ ๋ ์๊ฐ ๋ด์ ์์ฒญ์ ์ฒ๋ฆฌํ์ง ์์ ์์ ์ ์ฃฝ์ด๊ธฐ
์์ ์๊ฐ ์ฌ๋ฌ ์์ฒญ์ ๋์์ ์ฒ๋ฆฌํ ์ ์์ผ๋ฏ๋ก ํ๋์ ์์ฒญ ์๊ฐ ์ด๊ณผ๋ก ์ธํด ์ ์ฒด ์์ ์๋ฅผ ์ฃฝ์ด๋ ๊ฒ์ ๋งค์ฐ ๊ทน๋จ์ ์ผ๋ก ๋ค๋ฆฝ๋๋ค. ๋ค๋ฅธ ๋ชจ๋ ์์ฒญ์ด ํ๋์ด ์ฃฝ์์ ๋นํ์ง ์์ต๋๊น?
uWSGI๊ฐ 2.1 ์ ๋์์ ์ค๋ ๋ ๊ธฐ๋ฐ ํฌ์ ๋์ ํ ๊ณํ์ด์๋ ๊ฒ์ ๊ธฐ์ตํฉ๋๋ค. ์๋ง๋ ๋๊ธฐํ/์ค๋ ๋ ์์ ์์๊ฒ๋ง ์ ์ฉ๋๋ ๊ฒ์ผ ์๋ ์์ง๋ง(๊ทธ๋ฆฌ๊ณ ์ด์ ๋ํ ์ ๊ธฐ์ต์ ๋ชจํธํฉ๋๋ค).
์์ ์๊ฐ ์ฌ๋ฌ ์์ฒญ์ ๋์์ ์ฒ๋ฆฌํ ์ ์์ผ๋ฏ๋ก ํ๋์ ์์ฒญ ์๊ฐ ์ด๊ณผ๋ก ์ธํด ์ ์ฒด ์์ ์๋ฅผ ์ฃฝ์ด๋ ๊ฒ์ ๋งค์ฐ ๊ทน๋จ์ ์ผ๋ก ๋ค๋ฆฝ๋๋ค. ๊ทธ๋ ๊ฒ ํ๋ฉด ๋ค๋ฅธ ๋ชจ๋ ์์ฒญ์ด ํ๋์ด ์ฃฝ๊ฒ ๋์ง ์์๊น์?
์ ๊ทผ ๋ฐฉ์์ max_request
์ ๋์ผํ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์ ๋ชจ๋ ์์
์ ์ ํ์ ๋ํด ๋ณ๋์ ๊ตฌํ์ด ์์ต๋๋ค.
์ฐ๋ฆฌ๋ ์ด๋ฒ ์ฃผ์ ๋ฆด๋ฆฌ์ค๋ฅผ ์์ ์ค์ด๋ฉฐ, ๊ทธ ์์ ์ด _์ด์ฉ๋ฉด_ R20์ผ๋ก ๋ถ๊ธฐํ ์๊ฐ์ด๋ฉฐ, ์ฌ๊ธฐ์ ๋ช ๊ฐ์ง ์ฃผ์ ์ฌํญ์ ๋ค๋ฃฐ ๊ณํ์ ๋๋ค. ํ์ฌ ์๊ฐ ์ด๊ณผ๋ฅผ ๋ชจ๋ ์์ ์ ์ ํ์ ๋ํ ์ ์ ํ ์์ฒญ ์๊ฐ ์ด๊ณผ๋ก ๋ง๋๋ ์ ์ ํ ์๊ฐ์ผ ์ ์์ต๋๋ค.
์๊ฐ ์ด๊ณผ๊ฐ ์ด๋ป๊ฒ ์๋ํ๋์ง ์ดํดํ๋ ค๊ณ ๋ ธ๋ ฅํ๊ณ ์๊ณ ์ด๊ฒ์ด ๋ฒ๊ทธ์ธ์ง ์๋์ง ํ์คํ์ง ์๊ธฐ ๋๋ฌธ์ ๋ณ๋์ ๋ฌธ์ ๋ฅผ ์ ์ถํ๋ ๋์ ์ฌ๊ธฐ์ ๋๊ธ์ ๋จ๊น๋๋ค.
๋ด๊ฐ๋ณด๊ณ ์๋ IMO ์๊ธฐ์น ์์ ๋์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๋ชจ๋ ์ต๋ ์์ฒญ์ ์์ฒญ(์ดํ ์์ ์๊ฐ ๋ค์ ์์๋จ)์ ์๊ฐ ์ด๊ณผ๋์ง๋ง ๋ค๋ฅธ ์์ฒญ์ ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋ฉ๋๋ค. ์๋ ์์์ 4๊ฐ์ ์์ฒญ์ด ์ํ๋๊ณ ์์ฒญ 1, 2, 4๋ ์ฑ๊ณตํ์ง๋ง ์์ฒญ 3์ ์คํจํฉ๋๋ค.
๊ด๋ จ ๊ตฌ์ฑ:
import time
def app(environ, start_response):
start_response('200 OK', [('Content-type', 'text/plain; charset=utf-8')])
time.sleep(5)
return [b"Hello World\n"]
์ด๊ฐ:
gunicorn --log-level debug -k gthread -t 4 --max-requests 3 "app:app"
...
[2018-02-08 10:11:59 +0200] [28592] [INFO] Starting gunicorn 19.7.1
[2018-02-08 10:11:59 +0200] [28592] [DEBUG] Arbiter booted
[2018-02-08 10:11:59 +0200] [28592] [INFO] Listening at: http://127.0.0.1:8000 (28592)
[2018-02-08 10:11:59 +0200] [28592] [INFO] Using worker: gthread
[2018-02-08 10:11:59 +0200] [28595] [INFO] Booting worker with pid: 28595
[2018-02-08 10:11:59 +0200] [28592] [DEBUG] 1 workers
[2018-02-08 10:12:06 +0200] [28595] [DEBUG] GET /
[2018-02-08 10:12:11 +0200] [28595] [DEBUG] Closing connection.
[2018-02-08 10:12:15 +0200] [28595] [DEBUG] GET /
[2018-02-08 10:12:20 +0200] [28595] [DEBUG] Closing connection.
[2018-02-08 10:12:23 +0200] [28595] [DEBUG] GET /
[2018-02-08 10:12:23 +0200] [28595] [INFO] Autorestarting worker after current request.
[2018-02-08 10:12:27 +0200] [28592] [CRITICAL] WORKER TIMEOUT (pid:28595)
[2018-02-08 10:12:27 +0200] [28595] [INFO] Worker exiting (pid: 28595)
[2018-02-08 10:12:28 +0200] [28595] [DEBUG] Closing connection.
[2018-02-08 10:12:28 +0200] [28599] [INFO] Booting worker with pid: 28599
[2018-02-08 10:12:32 +0200] [28599] [DEBUG] GET /
[2018-02-08 10:12:37 +0200] [28599] [DEBUG] Closing connection.
^C[2018-02-08 10:12:39 +0200] [28592] [INFO] Handling signal: int
๊ณ ๊ฐ:
[salonen<strong i="19">@mac</strong> ~]$ curl http://127.0.0.1:8000
Hello World
[salonen<strong i="20">@mac</strong> ~]$ curl http://127.0.0.1:8000
Hello World
[salonen<strong i="21">@mac</strong> ~]$ curl http://127.0.0.1:8000
curl: (52) Empty reply from server
[salonen<strong i="22">@mac</strong> ~]$ curl http://127.0.0.1:8000
Hello World
๊ฑฐ๊ธฐ์ ์ด๋ค ๊ณํ์ ์ธ์์ผ ํ ๊น์? ๋ค์ ์ฌํญ์ ์ผ๋์ ๋๊ณ ์์ต๋๋ค.
20.0์ด์ด์ผ ํฉ๋๊น ์๋๋ฉด ์ฐ๊ธฐํ ์ ์์ต๋๊น?
์ฐ๊ธฐ.
์ด๋ด, ๊ทธ๋์ ์ด๊ฒ์ 20.0์ ์ผ๋ถ๊ฐ ์๋๊ฐ?
ํ์ฌ ์๊ฐ ์ด๊ณผ๋ฅผ ๋ชจ๋ ์์ ์ ์ ํ์ ๋ํ ์ ์ ํ ์์ฒญ ์๊ฐ ์ด๊ณผ๋ก ๋ง๋๋ ์ ์ ํ ์๊ฐ์ผ ์ ์์ต๋๋ค.
๋ช ํํ ํ๋ค. @ lucas03 ์์ฒญ ์๊ฐ ์ด๊ณผ๊ฐ ๋ฌด์์ธ์ง ๋ช ํํ์ง ์์ต๋๋ค. ํน์ ํญ๋ชฉ์ด ํ์ํ ๊ฒฝ์ฐ ํฐ์ผ์ ์ด์ด์ฃผ์ธ์.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
@tuukkamustonen
--timeout
๋ ์์ฒญ ์๊ฐ ์ด๊ณผ๋ฅผ ์๋ฏธํ์ง ์์ต๋๋ค. ๊ทธ๊ฒ์ ๋ ธ๋์๋ฅผ ์ํ ์์กด ์ฒดํฌ๋ฅผ ์๋ฏธํฉ๋๋ค. ๋๊ธฐํ ์์ ์์ ๊ฒฝ์ฐ ์์ ์๊ฐ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๊ฒ ์ธ์๋ ์๋ฌด ๊ฒ๋ ํ ์ ์๊ธฐ ๋๋ฌธ์ ์์ฒญ ์๊ฐ ์ด๊ณผ๋ก ์๋ํฉ๋๋ค. ๋น๋๊ธฐ์ ์์ ์๋ ์ฅ๊ธฐ ์คํ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๋์์๋ ํํธ๋นํธ์ด๋ฏ๋ก ์์ ์๊ฐ ์ฐจ๋จ/๋๊ฒฐํ์ง ์๋ ํ ์ข ๋ฃ๋์ง ์์ต๋๋ค.๋ค๋ฅธ ์ฌ๋๋ค์ด ์ด๊ฒ์ ํผ๋ํ๋ ๊ฒฝ์ฐ ์ด๋ฆ์ ๋ณ๊ฒฝํ๋ ๊ฒ์ด ์ข์ต๋๋ค.