Gunicorn: timeout ๋ฐ graceful_timeout ์ž‘๋™ ๋‚ด์šฉ/๋ฐฉ๋ฒ•์„ ๋ช…ํ™•ํžˆ ํ•ฉ๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2017๋…„ 04์›” 03์ผ  ยท  30์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: benoitc/gunicorn

(์—ฌ๊ธฐ์„œ ๋…๋ฐฑ์— ๋Œ€ํ•ด ์œ ๊ฐ์Šค๋Ÿฝ๊ฒŒ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•œ ์ผ์ด ๋ณต์žกํ•ด์ ธ์„œ ๊ฒฐ๊ตญ ์Šคํƒ์„ ํŒŒํ—ค์ณค์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚ด๊ฐ€ ๋ฌธ์„œํ™”ํ•œ ๋‚ด์šฉ์ด ๋…์ž์—๊ฒŒ ๋„์›€์ด ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.)

๋‚ด๊ฐ€ ์ดํ•ดํ–ˆ๋“ฏ์ด ๊ธฐ๋ณธ์ ์œผ๋กœ :

  • ์š”์ฒญ ์ฒ˜๋ฆฌ 30 ์ดˆ( timeout ๋กœ ๊ตฌ์„ฑ ๊ฐ€๋Šฅ) ํ›„ gunicorn ๋งˆ์Šคํ„ฐ ํ”„๋กœ์„ธ์Šค๋Š” SIGTERM ๋ฅผ ์ž‘์—…์ž ํ”„๋กœ์„ธ์Šค์— ์ „์†กํ•˜์—ฌ ์ •์ƒ์ ์ธ ์žฌ์‹œ์ž‘์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
  • ์ž‘์—…์ž๊ฐ€ ๋‹ค๋ฅธ 30 ์ดˆ ๋™์•ˆ ์ข…๋ฃŒ๋˜์ง€ ์•Š์œผ๋ฉด( graceful_timeout ๋กœ ๊ตฌ์„ฑ ๊ฐ€๋Šฅ) ๋งˆ์Šคํ„ฐ ํ”„๋กœ์„ธ์Šค๋Š” SIGKILL ๋ฅผ ๋ณด๋ƒ…๋‹ˆ๋‹ค. graceful_timeout ๊ธฐ๊ฐ„(https://github.com/benoitc/gunicorn/commit/d1a09732256fa8db900a1fe75a71466cf2645ef9) ๋™์•ˆ ์ž‘์—…์ž๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ข…๋ฃŒ _does_ํ•  ๋•Œ๋„ ์ด ์‹ ํ˜ธ๊ฐ€ ์ „์†ก๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์งˆ๋ฌธ:

  • ์‹ ํ˜ธ๊ฐ€ ์ •ํ™•ํ•ฉ๋‹ˆ๊นŒ?
  • gunicorn(๋™๊ธฐํ™”) ์ž‘์—…์ž๊ฐ€ ์ด๋Ÿฌํ•œ ์‹ ํ˜ธ๋ฅผ ์ˆ˜์‹ ํ•˜๋ฉด ์‹ค์ œ๋กœ ์–ด๋–ป๊ฒŒ ๋ฉ๋‹ˆ๊นŒ? ์‹ ํ˜ธ๊ฐ€ ํฌ์ฐฉ๋˜์—ˆ๊ณ  ์–ด๋–ค ์ผ์ด ์ผ์–ด๋‚˜์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ WSGI ์•ฑ์— ์–ด๋–ป๊ฒŒ ์•Œ๋ฆฝ๋‹ˆ๊นŒ?
  • ์˜ˆ๋ฅผ ๋“ค์–ด Flask๋Š” SIGTERM ์‹ ํ˜ธ๋ฅผ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๊นŒ? ์‹ค์ œ๋กœ ์š”์ฒญ ์ฒ˜๋ฆฌ ์ค‘์— ์–ด๋–ค ์ผ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๊นŒ? ์š”์ฒญ ์ฒ˜๋ฆฌ๊ฐ€ ์™„๋ฃŒ๋œ ํ›„ ์ข…๋ฃŒํ•ด์•ผ ํ•˜๋Š” WSGI ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ(werkzeug ์ˆ˜์ค€์—์„œ) ํ”Œ๋ž˜๊ทธ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด SIGTERM ๊ฐ€ ์ด๋ฏธ ์ง„ํ–‰ ์ค‘์ธ ์š”์ฒญ ์ฒ˜๋ฆฌ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? IO ์—ฐ๊ฒฐ์„ ์ข…๋ฃŒํ•˜๊ฑฐ๋‚˜ ์š”์ฒญ ์ฒ˜๋ฆฌ ์†๋„๋ฅผ ๋†’์ด๊ธฐ ์œ„ํ•œ ๊ฒƒ...?

SIGKILL ์—์„œ ์š”์ฒญ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ•์ œ๋กœ ์ค‘๋‹จ๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์„ ์ดํ•ดํ•˜๋ฉด ์ด์— ๋Œ€ํ•œ ๋ฌธ์„œ๋ฅผ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ์ž‘์€ PR์„ ์ œ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Discussion Documentation

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

@tuukkamustonen --timeout ๋Š” ์š”์ฒญ ์‹œ๊ฐ„ ์ดˆ๊ณผ๋ฅผ ์˜๋ฏธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋…ธ๋™์ž๋ฅผ ์œ„ํ•œ ์ƒ์กด ์ฒดํฌ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋™๊ธฐํ™” ์ž‘์—…์ž์˜ ๊ฒฝ์šฐ ์ž‘์—…์ž๊ฐ€ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ ์™ธ์—๋Š” ์•„๋ฌด ๊ฒƒ๋„ ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์š”์ฒญ ์‹œ๊ฐ„ ์ดˆ๊ณผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋น„๋™๊ธฐ์‹ ์ž‘์—…์ž๋Š” ์žฅ๊ธฐ ์‹คํ–‰ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋™์•ˆ์—๋„ ํ•˜ํŠธ๋น„ํŠธ์ด๋ฏ€๋กœ ์ž‘์—…์ž๊ฐ€ ์ฐจ๋‹จ/๋™๊ฒฐํ•˜์ง€ ์•Š๋Š” ํ•œ ์ข…๋ฃŒ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ์ด๊ฒƒ์„ ํ˜ผ๋™ํ•˜๋Š” ๊ฒฝ์šฐ ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  30 ๋Œ“๊ธ€

ํ , 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์€ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

๊ด€๋ จ ๊ตฌ์„ฑ:

  • gthread ์ž‘์—…์ž
  • ์š”์ฒญ์„ ์ œ๊ณตํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„ ์ดˆ๊ณผ๋ณด๋‹ค ์˜ค๋ž˜ ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค.
  • ์ตœ๋Œ€ ์š”์ฒญ์ด 0์ด ์•„๋‹™๋‹ˆ๋‹ค.
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 ์š”์ฒญ ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํŠน์ • ํ•ญ๋ชฉ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ํ‹ฐ์ผ“์„ ์—ด์–ด์ฃผ์„ธ์š”.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰