AWSã®Ubuntu14.04LTSã§å®è¡ãããŠããDockerã€ã¡ãŒãžå ã§gunicorn19.4.5ã䜿çšãããšã1ãè¶ ããåæã¯ãŒã«ãŒãšããã©ã«ãã®30ç§ã®ã¿ã€ã ã¢ãŠãæéã§å®è¡ãããšãäžå®ã®ã¯ãŒã«ãŒã¿ã€ã ã¢ãŠãã衚瀺ãããŸãã ããã¯ïŒ588ãŸãã¯ïŒ942ã«é¢é£ããŠããå¯èœæ§ããããŸãããããã¯gunicornã®éåžžã«æ°ããããŒãžã§ã³ã§ãããããã¯ã£ãããšã¯ããããŸããã
æ°åã®å®è¡ã«ãããç¶æ³èšŒæ ã¯ãã¯ãŒã«ãŒã®1人ã圱é¿ãåããŠããªãããšã瀺åããŠããããã§ããã倱æããŠåèµ·åãç¶ããã®ã¯æ®ãã®N-1ã¯ãŒã«ãŒã ãã§ãã ãã ããããã瀺åããããŒã¿ãã€ã³ãã¯ãããããååŸã§ããªãã£ãããã匷åãªã·ã°ãã«ãšã¯èŠãªããªãã§ãã ããã
ãããç§ããã§ãã¯ãããã®ã§ãïŒ
stat -L
ãèš±å¯ããŠããŸããããgunicornããã¡ã€ã«ã®ãªã³ã¯ã解é€ã§ããªãããã«ãããšã stat -L
ãçºçããctimeãéåžžã©ããæŽæ°ãããŠããããšã瀺ãããŸããworkertmp.py
ã«ã³ãŒããè¿œå ããŠãåãã§ãã¯ã®èªã¿åãctimeããã°ã«èšé²ããŸãããããã¯ããã®ãããªãã°ã®1ã€ã§ãïŒãã¹ãŠã®ã¯ãŒã«ãŒéã§ã€ã³ã¿ãŒãªãŒããããŠããŸãïŒã
[2016-01-29 00:21:38 +0000] [3238] [INFO] Starting gunicorn 19.4.0
[2016-01-29 00:21:38 +0000] [3238] [INFO] Listening at: http://0.0.0.0:5000 (3238)
[2016-01-29 00:21:38 +0000] [3238] [INFO] Using worker: sync
[2016-01-29 00:21:38 +0000] [3243] [INFO] Booting worker with pid: 3243
[2016-01-29 00:21:38 +0000] [3244] [INFO] Booting worker with pid: 3244
FOOBAR: modify /tmp/wgunicorn-RhAFmt time: 1454026899.74
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026899.03
FOOBAR: modify /tmp/wgunicorn-RhAFmt time: 1454026900.0
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026899.03
FOOBAR: modify /tmp/wgunicorn-RhAFmt time: 1454026900.0
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026899.03
FOOBAR: modify /tmp/wgunicorn-RhAFmt time: 1454026900.0
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026899.03
FOOBAR: modify /tmp/wgunicorn-RhAFmt time: 1454026900.0
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026899.03
FOOBAR: modify /tmp/wgunicorn-RhAFmt time: 1454026904.74
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026899.03
FOOBAR: modify /tmp/wgunicorn-RhAFmt time: 1454026904.74
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026905.0
FOOBAR: modify /tmp/wgunicorn-RhAFmt time: 1454026904.74
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026905.0
FOOBAR: modify /tmp/wgunicorn-RhAFmt time: 1454026904.74
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026905.0
FOOBAR: modify /tmp/wgunicorn-RhAFmt time: 1454026904.74
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026905.0
FOOBAR: modify /tmp/wgunicorn-RhAFmt time: 1454026904.74
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026909.74
FOOBAR: modify /tmp/wgunicorn-RhAFmt time: 1454026910.0
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026909.74
FOOBAR: modify /tmp/wgunicorn-RhAFmt time: 1454026910.0
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026909.74
FOOBAR: modify /tmp/wgunicorn-RhAFmt time: 1454026910.0
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026909.74
FOOBAR: modify /tmp/wgunicorn-RhAFmt time: 1454026910.0
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026909.74
FOOBAR: modify /tmp/wgunicorn-RhAFmt time: 1454026914.74
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026914.74
FOOBAR: modify /tmp/wgunicorn-RhAFmt time: 1454026915.0
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026914.74
FOOBAR: modify /tmp/wgunicorn-RhAFmt time: 1454026915.0
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026914.74
FOOBAR: modify /tmp/wgunicorn-RhAFmt time: 1454026915.0
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026914.74
FOOBAR: modify /tmp/wgunicorn-RhAFmt time: 1454026915.0
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026914.74
FOOBAR: modify /tmp/wgunicorn-RhAFmt time: 1454026915.0
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026914.74
FOOBAR: modify /tmp/wgunicorn-RhAFmt time: 1454026915.0
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026914.74
FOOBAR: modify /tmp/wgunicorn-RhAFmt time: 1454026915.0
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026914.74
FOOBAR: modify /tmp/wgunicorn-RhAFmt time: 1454026915.0
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026914.74
FOOBAR: modify /tmp/wgunicorn-RhAFmt time: 1454026915.0
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026914.74
FOOBAR: modify /tmp/wgunicorn-RhAFmt time: 1454026915.0
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026914.74
FOOBAR: modify /tmp/wgunicorn-RhAFmt time: 1454026915.0
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026914.74
FOOBAR: modify /tmp/wgunicorn-RhAFmt time: 1454026915.0
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026914.74
FOOBAR: modify /tmp/wgunicorn-RhAFmt time: 1454026915.0
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026914.74
FOOBAR: modify /tmp/wgunicorn-RhAFmt time: 1454026915.0
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026914.74
FOOBAR: modify /tmp/wgunicorn-RhAFmt time: 1454026915.0
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026914.74
FOOBAR: modify /tmp/wgunicorn-RhAFmt time: 1454026915.0
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026914.74
FOOBAR: modify /tmp/wgunicorn-RhAFmt time: 1454026915.0
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026914.74
FOOBAR: modify /tmp/wgunicorn-RhAFmt time: 1454026915.0
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026914.74
FOOBAR: modify /tmp/wgunicorn-RhAFmt time: 1454026915.0
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026933.73
FOOBAR: modify /tmp/wgunicorn-RhAFmt time: 1454026915.0
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026934.74
FOOBAR: modify /tmp/wgun[2016-01-29 00:22:25 +0000] [3238] [CRITICAL] WORKER TIMEOUT (pid:3243)
[2016-01-29 00:22:25 +0000] [3243] [INFO] Worker exiting (pid: 3243)
[2016-01-29 00:22:25 +0000] [3330] [INFO] Booting worker with pid: 3330
icorn-RhAFmt time: 1454026915.0
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026935.0
FOOBAR: modify /tmp/wgunicorn-RhAFmt time: 1454026915.0
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026935.0
FOOBAR: modify /tmp/wgunicorn-RhAFmt time: 1454026915.0
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026935.0
FOOBAR: modify /tmp/wgunicorn-RhAFmt time: 1454026915.0
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026935.0
FOOBAR: modify /tmp/wgunic54026934.74
FOOBAR: modify /tmp/wgun[2016-01-29 00:22:25 +0000] [3238] [CRITICAL] WORKER TIMEOUT (pid:3243)
[2016-01-29 00:22:25 +0000] [3243] [INFO] Worker exiting (pid: 3243)
[2016-01-29 00:22:25 +0000] [3330] [INFO] Booting worker with pid: 3330
icorn-RhAFmt time: 1454026915.0
FOOBAR: modify /tmp/wgunicorn-myjLwI time:fy] [3238] [CRITICAL] WORKER TIMEOUT (pid:3243)
[2016-01-29 00p/2:25 +0000] [3243] [INFO] Worker exiting (pid: 3243)
[2016-0ic29 00:22:25 +0000] [3330] [INFO] Booting worker with pid: 33myicorn-RhAFmt time: 1454026915.0
FOOBAR: modify /tmp/wgunicorntiyjLwI time: 1454026935.0
FOOBAR: modify /tmp/wgunicorn-RhAFmt45ime: 1454026915.0
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 915.0
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026945.0
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026945.8
FOOBAR: modify /tmp/wgunicorn-Mw64T1 time: 1454026945.82
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026945.8
FOOBAR: modify /tmp/wgunicorn-Mw64T1 time: 1454026946.01
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026945.8
FOOBAR: modify /tmp/wgunicorn-Mw64T1 time: 1454026946.01
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026945.8
FOOBAR: modify /tmp/wgunicorn-Mw64T1 time: 1454026946.01
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026945.8corn-myjLwI time:fy] [3238] [CRITICAL] WORKER TIMEOUT (pid:32BA)
[2016-01-29 00p/2:25 +0000] [3243] [INFO] Worker exiting (pdify /tmp/wgunicorn-Mw64T1 time: 1454026949.74
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026945.8
FOOBAR: modify /tmp/wgunicorn-Mw64T1 time: 1454026949.74
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026945.8
FOOBAR: modify /tmp/wgunicorn-Mw64T1 time: 1454026949.74
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026945.8
FOOBAR: modify /tmp/wgunicorn-Mw64T1 time: 1454026949.74
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026945.8
FOOBAR: modify /tmp/wgunicorn-Mw64T1 time: 1454026949.74
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026945.8
FOOBAR: modify /tmp/wgunicorn-Mw64T1 time: 1454026949.74
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026945.8
FOOBAR: modify /tmp/wgunicorn-Mw64T1 time: 1454026949.74
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026945.8
FOOBAR: modify /tmp/wgunicorn-Mw64T1 time: 1454026949.74
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026945.8
FOOBAR: modify /tmp/wgunicorn-Mw64T1 time: 1454026949.74
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026945.8
FOOBAR: modify /tAR: modify /tmp/wgunicorn-myjLwI time: 1454026945.8
FOOBAR: modify /tmp/wgunicorn-Mw64T1 time: 1454026949.74
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026945.8
FOOBAR: modify /tmp/wgunicorn-Mw64T1 time: 1454026949.74
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026945.8
FOOBAR: modify /tmp/wgunicorn-Mw64T1 time: 1454026949.74
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026945.8
FOOBAR: modify /tAR: modify /tmp/wgunicorn-myjLwI time: 1454026945.8
FOOBAR: modify /tmp/wgunicorn-Mw64T1 time: 1454026949.74
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026945.8
FOOBAR: modify /tmp/wgunicorn-Mw64T1 timeodify /tmp/wgunicorn-myjLwI time: 1454026964.74
FOOBAR: modify /tmp/wgunicorn-Mw64T1 time: 1454026949.74
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026965.0
FOOBAR: modify /tmp/wgunicorn-Mw64T1 time: 1454026949.74
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026965.0
FOOBAR: modify /tmp/wgunicorn-Mw64T1 time: 1454026949.74
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026965.0
FOOBAR: modify /tmp/wgunicorn-Mw64T1 time: 1454026949.74
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026965.0
FOOBAR: modify /tmp/wgunicorn-Mw64T1 time: 1454026949.74
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026969.74
FOO[2016-01-29 00:22:59 +0000] [3238] [CRITICAL] WORKER TIMEOUT (pid:3330)
[2016-01-29 00:22:59 +0000] [3330] [INFO] Worker exiting (pid: 3330)
icorn-RhAFmt time: 1454026915.0
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026935.0
FOOBAR: modify /tmp/wgunicorn-RhAFmt time: 1454026915.0
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026935.0
FOOBAR: modify /tmp/wgunicorn-RhAFmt time: 1454026915.0
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026935.0
FOOBAR: modify /tmp/wgunicorn-RhAFmt time: 1454026915.0
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026935.0
FOOBAR: modify /tmp/wgunicorn-RhAFmt time: 1454026915.0
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026939.74
FOOBAR: modify /tmp/wgunicorn-LwI time: 1454026965.0
FOOBAR: modify /tmp/wgunicorn-Mw64T1 tI time: 1454026940.0
FOOBAR: modify /tmp/wgunicorn-RhAFmt time: 1454026915.0
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026940.0
FOOBAR: modify /tmp/wgunicorn-RhAFmt time: 1454026915.0
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026940.0
FOOBAR: modify /tmp/wgunicorn-RhAFmt time: 1454026915.0
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026940.0
FOOBAR: modify /tmp/wgunicorn-RhAFmt time: 1454026915.0
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026944.74
FOOBAR: modify /tmp/wgunicorn-RhAFmt time: 1454026915.0
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026945.0
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026945.8
[2016-01-29 00:22:59 +0000] [3396] [INFO] Booting worker with pid: 3396
BAR: modify /tmp/wgunicorn-Mw64T1 time: 1454026949.74
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026970.0
FOOBAR: modify /tmp/wgunicorn-Mw64T1 time: 1454026949.74
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026970.0
FOOBAR: modify /tmp/wgunicorn-Mw64T1 time: 1454026949.74
FOOBAR: modify /tmp/wgunicorn-myjL26949.74
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026970.0
FOOBAR: modify /tmp/wgunicorn-Mw64T1 time: 1454026949.74
FOOBAR: modify /tmp/wgunicorn-myjL26949.74
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026970.0
FOOBAR: modify /tmp/wgunicorn-Mw64T1 time: 1454026949.74
FOOBAR: modify /tmp/wgunicorn-myjL26949.74
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026970.0
FOOBAR: modify /tmp/wgunicorn-Mw64T1 time: 1454026949.74
FOOBAR: modify /tmp/wgunicorn-myjL26949.74
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026970.0
FOOBAR: modify /tmp/wgunicorn-Mw64T1 time: 1454026949.74
FOOBAR: modify /tmp/wgunicorn-myjL26949.74
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026970.0
FOOBAR: modify /tmp/wgunicorn-Mw64T1 time: 1454026949.74
FOOBAR: modify /tmp/wgunicorn-myjL26949.74
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026970.0
FOOBAR: modify /tmp/w79.95
FOOBAR: modify /tmp/wgunicorn-k3uZLy time: 1454026979.97
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026979.95
FOOBAR: modify /tmp/wgunicorn-k3uZLy time: 1454026980.16
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026979.95
FOOBAR: modify /tmp/wgunicorn-k3uZLy time: 1454026980.16
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026979.95
FOOBAR: modify /tmp/wgunicorn-k3uZLy time: 1454026980.16
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026979.95
FOOBAR: modify /tmp/wgunicorn-k3uZLy time: 1454026980.16
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026979.95
FOOBAR: modify /tmp/wgunicorn-k3uZLy time: 1454026980.16
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026979.95
FOOBAR: modify /tmp/wgunicorn-k3uZLy time: 1454026980.16
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026979.95
FOOBAR: modify /tmp/wgunicorn-k3uZLy time: 1454026980.16
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026979.95
FOOBAR: modify /tmp/wgunicorn-k3uZLy time: 1454026980.16
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026979.95
FOOBAR: modify /tmp/wgunicorn-k3uZLy time: 1454026980.16
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026979.95
80.16
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026979.95
FOOBAR: modify /tmp/wgunicorn-k3uZLy time: 1454026980.16
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026979.95
FOOBAR: modify /tmp/wgunicorn-k3uZLy time: 1454026980.16
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026979.95
FOOBAR: modify /tmp/wgunicorn-k3uZLy time: 1454026980.16
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026979.95
FOOBAR: modify /tmp/wgunicorn-k3uZLy time: 1454026980.16
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026979.95
FOOBAR: modify /tmp/wgunicorn-k3uZLy time: 1454026980.16
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026979.95
FOOBAR: modify /tmp/wgunicorn-k3uZLy time: 1454026980.16
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026979.95
FOOBAR: modify /tmp/wgunicorn-k3uZLy time: 1454026980.16
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026979.95
FOOBAR: modify /tmp/wgunicorn-k3uZLy time: 1454026980.16
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026979.95
FOOBAR: modify /tmp/wgunicorn-k3uZLy time: 1454029.95
FOOBAR: modify /tmp/wgunicorn-k3uZLy time: 1454026980.16
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026979.95
FOOBAR: modify /tmp/wgunicorn-k3uZLy time: 1454026980.16
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026979.95
FOOBAR: modify /tmp/wgunicorn-k3uZLy time: 1454029.95
FOOBAR: modify /tmp/wgunicorn-k3uZLy time: 1454026980.16
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026979.95
FOOBAR: modify /tmp/wgunicorn-k3uZLy time: 1454026980.16
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026979.95
FOOBAR: modify /tmp/wgunicorn-k3uZLy time: 1454029.95
FOOBAR: modify /tmp/wgunicorn-k3uZLy time: 1454026980.16
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026979.95
FOOBAR: modify /tmp/wgunicorn-k3uZLy time: 1454026980.16
WORKER TIMEOUT (pid:3396)
[2016-01-29 00:23:31 +0000] [3396] [INFO] Worker exiting (pid: 3396)
BAR: modify /tmp/wgunicorn-Mw64T1 time: 1454026949.74
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026970.0
FOOBAR: modify /tmp/wgunicorn-Mw64T1 time: 1454026949.74
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026970.0
FOOBAR: modify /tmp/wgunicorn-Mw64T1 time: 1454026949.74
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026970.0
FOOBAR: modify /tmp/wgunicorn-Mw64T1 time: 1454026949.74
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026970.0
FOOBAR: modify /tmp/wgunicorn-Mw64T1 time: 1454026949.74
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026974.74
FOOBAR: modify /tmp/wgunicorn-Mw64T1 time: 1454026949.74
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026975.0
FOOBAR: modify /tmp/wgunicorn-Mw64T1 time: 1454026949.74
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026975.0
FOOBAR: modify /tmp/wgunicorn-Mw64T1 time: 1454026949.74
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026975.0
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026975.0
FOOBAR: modify /tmp/wgunicorn-Mw64T1 time: 1454026949.74
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026975.0
FOOBAR: modify /tmp/wgunicorn-Mw64T1 time: 1454026949.74
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026975.0
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026975.0
FOOBAR: modify /tmp/wgunicorn-Mw64T1 time: 1454026949.74
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026975.0
FOOBAR: modify /tmp/wgunicorn-Mw64T1 time: 1454026949.74
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026975.0
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026975.0
FOOBAR: modify /tmp/wgunicorn-Mw64T1 time: 1454026949.74
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454026975.0
FOOBAR: modify /tmp/wgunicorn-Mw6nicorn-k3uZLy time: 1454026980.16
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454027005.0
FOOBAR: modify /tmp/wgunicorn-k3uZLy time: 1454026980.16
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454027010.0
FOOBAR: modify /tmp/wgunicorn-k3uZLy time: 1454026980.16
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454027010.0
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454027011.06
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454027011.06
FOOBAR: modify /tmp/wgunicorn-ZmVaVS time: 1454027011.08
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454027011.06
FOOBAR: modify /tmp/wgunicorn-ZmVaVS time: 1454027011.28
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454027011.06
FOOBAR: modify /tmp/wgunicorn-ZmVaVS time: 1454027011.28
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454027011.06
FOOBAR: modify /tmp/wgunicorn-ZmVaVS time: 1454027011.28
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454027011.06
FOOBAR: modify /tmp/wgunicorn-ZmVaVS time: 1454027014.74
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454027011.06
FOOBAR: modify /tmp/wgunicorn-ZmVaVS time: 1454027014.74
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454027011.06
FOOBAR: modify /tmp/wgunicorn-ZmVaVS time: 1454027014.74
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454027011.06
FOOBAR: modify /tmp/wgunicorn-ZmVaVS time: 1454027014.74
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454027011.06
FOOBAR: modify /tmp/wgunicorn-ZmVaVS time: 1454027014.74
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454027011.06
FOOBAR: modify /tmp/wgunicorn-ZmVaVS time: 1454027014.74
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454027011.06
FOOBAR: modify /tmp/wgunicorn-ZmVaVS time: 1454027014.74
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454027011.06
FOOBAR: modify /tmprn-myjLwI time: 1454027011.06
FOOBAR: modify /tmp/wgunicorn-Znicorn-myjLwI time: 1454027011.06
FOOBAR: modify /tmp/wgunicorn-ZmVaVS time: 1454027014.74
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454027011.06
FOOBAR: modify /tmp/wgunicorn-ZmVaVS time: 1454027014.74
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454027011.06
FOOBAR: modify /tmp/wgunicorn-ZmVaVS time: 1454027014.74
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454027011.06
FOOBAR: modify /tmp/wgunicorn-ZmVaVS time: 1454027014.74
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454027011.06
FOOBAR: modify /tmp/wgunicorn-ZmVaVS time: 1454027014.74
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454027011.06
FOOBAR: modify /tmp/wgunicorn-ZmVaVS time: 1454027014.74
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454027028.98
FOOBAR: modify /tmp/wgunicorn-ZmVaVS time: 1454027014.74
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454027030.0
FOOBAR: modify /tmp/wgunicorn-ZmVaVS time: 1454027014.74
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454027030.0
FOOBAR: modify /tmp/wgunicorn-ZmVaVS time: 1454027014.74
FOOBAR: modify /tmp/wguicorn-ZmVaVS time: 1454027014.74
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454027030.0
FOOBAR: modify /tmp/wgunicorn-ZmVaVS time: 1454027014.74
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454027030.0
FOOBAR: modify /tmp/wgunicorn-ZmVaVS time: 1454027014.74
FOOBAR: modify /tmp/wguicorn-ZmVaVS time: 1454027014.74
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454027030.0
FOOBAR: modify /tmp/wgunicorn-ZmVaVS time: 1454027014.74
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454027030.0
FOOBAR: modify /tmp/wgunicorn-ZmVaVS time: 1454027014.74
FOOBAR: modify /tmp/wguicorn-ZmVaVS time: 1454027014.74
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454027030.0
FOOBAR: modify /tmp/wgunicorn-ZmVaVS time: 1454027014.74
FOOBAR: modify /tmp/wgunicorn--ZmVaVS time: 1454027014.74
FOOBAR: modify /tmp/wgunicorn-myjLwI time: 1454027035.0
FOOBAR: modify /tmp/wgunicorn-ZmVaVS time: 1454027014.74
FOOBAR: modify /t[2016-01-29 00:24:05 +0000] [3238] [CRITICAL] WORKER TIMEOUT (pid:3453)
[2016-01-29 00:24:05 +0000] [3453] [INFO] Worker exiting (pid: 3453)
äžèšã®ãã°ããhrmmmã¯ãæéã決ããŠå€åããŠããªãããšãããããŸãã ç§ããã§ãã¯ããŸã
ããããšããæè¬ããŸãïŒ
ãã®ãã°ã®åœ±é¿ãåããå¯èœæ§ããããŸãã
AWSïŒElastic Beanstalk + EC2 Container ServiceïŒã®Dockerã€ã¡ãŒãžå
ã§gunicornãå®è¡ããŠããŸãã
AWSã§Dockerã€ã¡ãŒãžãå®è¡ããŠããå Žåã«ã®ã¿ãåæåã®ã»ãŒçŽåŸã«çºçãå§ããäžå®ã®ã¯ãŒã«ãŒã¿ã€ã ã¢ãŠãããããŸãã
åãHTTPãªã¯ãšã¹ãã«ã¯ãæ°ããªç§ãå Žåã«ãã£ãŠã¯20ã30ç§ãããããšããããŸãã ååšããªãããŒãžãèªèšŒãããŠããªãåçŽãªãHello worldãæååããŒãžããŸãã¯ããŒã¿ããŒã¹ããã¬ã³ãŒãããã§ããããããŒãžã®ãããã§ãããã¯é¢ä¿ãããŸããã
è¿œå ã®è©³çŽ°ïŒ
圱é¿ãåããªãç°å¢ïŒ
Amazonã³ã³ãããã°ïŒ
[2016-06-15 16:46:15 +0000] [1] [DEBUG] Current configuration:
cert_reqs: 0
post_request: <function PostRequest.post_request at 0x7fb13e187c80>
worker_connections: 1000
tmp_upload_dir: None
enable_stdio_inheritance: False
timeout: 30
pre_fork: <function Prefork.pre_fork at 0x7fb13e1871e0>
worker_int: <function WorkerInt.worker_int at 0x7fb13e1876a8>
backlog: 2048
max_requests: 0
max_requests_jitter: 0
access_log_format: %(h)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s "%(f)s" "%(a)s"
logconfig: None
syslog_addr: udp://localhost:514
preload_app: False
pidfile: None
umask: 0
secure_scheme_headers: {'X-FORWARDED-PROTOCOL': 'ssl', 'X-FORWARDED-PROTO': 'https', 'X-FORWARDED-SSL': 'on'}
paste: None
proxy_protocol: False
worker_class: sync
on_starting: <function OnStarting.on_starting at 0x7fb13e414c80>
worker_abort: <function WorkerAbort.worker_abort at 0x7fb13e187840>
worker_exit: <function WorkerExit.worker_exit at 0x7fb13e187e18>
config: config/gunicorn.py
nworkers_changed: <function NumWorkersChanged.nworkers_changed at 0x7fb13e18a048>
daemon: False
accesslog: None
errorlog: -
loglevel: debug
syslog_prefix: None
ssl_version: 3
suppress_ragged_eofs: True
limit_request_field_size: 8190
reload: False
logger_class: gunicorn.glogging.Logger
statsd_host: None
keyfile: None
raw_env: []
threads: 1
django_settings: None
proc_name: None
proxy_allow_ips: ['127.0.0.1']
limit_request_fields: 100
ciphers: TLSv1
check_config: False
do_handshake_on_connect: False
post_worker_init: <function PostWorkerInit.post_worker_init at 0x7fb13e187510>
graceful_timeout: 30
worker_tmp_dir: None
certfile: None
sendfile: None
keepalive: 2
chdir: /app/testapp
when_ready: <function WhenReady.when_ready at 0x7fb13e187048>
ca_certs: None
on_exit: <function OnExit.on_exit at 0x7fb13e18a1e0>
spew: False
bind: [':8000']
post_fork: <function Postfork.post_fork at 0x7fb13e187378>
limit_request_line: 4094
syslog_facility: user
workers: 3
syslog: False
pre_request: <function PreRequest.pre_request at 0x7fb13e187b70>
user: 0
group: 0
forwarded_allow_ips: ['127.0.0.1']
pythonpath: None
on_reload: <function OnReload.on_reload at 0x7fb13e414e18>
pre_exec: <function PreExec.pre_exec at 0x7fb13e1879d8>
default_proc_name: config.wsgi
statsd_prefix:
[2016-06-15 16:46:15 +0000] [1] [INFO] Starting gunicorn 19.5.0
[2016-06-15 16:46:15 +0000] [1] [DEBUG] Arbiter booted
[2016-06-15 16:46:15 +0000] [1] [INFO] Listening at: http://0.0.0.0:8000 (1)
[2016-06-15 16:46:15 +0000] [1] [INFO] Using worker: sync
[2016-06-15 16:46:15 +0000] [8] [INFO] Booting worker with pid: 8
[2016-06-15 16:46:15 +0000] [9] [INFO] Booting worker with pid: 9
[2016-06-15 16:46:15 +0000] [10] [INFO] Booting worker with pid: 10
[2016-06-15 16:46:15 +0000] [1] [DEBUG] 3 workers
[2016-06-15 16:46:52 +0000] [1] [CRITICAL] WORKER TIMEOUT (pid:9)
[2016-06-15 16:46:52 +0000] [9] [INFO] Worker exiting (pid: 9)
[2016-06-15 16:46:52 +0000] [1] [CRITICAL] WORKER TIMEOUT (pid:10)
[2016-06-15 16:46:52 +0000] [10] [INFO] Worker exiting (pid: 10)
[2016-06-15 16:46:53 +0000] [20] [INFO] Booting worker with pid: 20
[2016-06-15 16:46:53 +0000] [1] [DEBUG] 2 workers
[2016-06-15 16:46:53 +0000] [21] [INFO] Booting worker with pid: 21
[2016-06-15 16:46:53 +0000] [1] [DEBUG] 3 workers
[2016-06-15 16:47:23 +0000] [1] [CRITICAL] WORKER TIMEOUT (pid:8)
(...)
`
ããããšãã
ç§ããããèŠãŠããŸãã ç§ã®çãã¯ãElastic LoadBalancerã§ãã 以åã®äŒç€Ÿã§ã¯paste
ã䜿çšããŠããŸãããããããELBã§åé¡ãåŒãèµ·ãããŠããŸããã ã©ããããããæ¥ç¶ãåå©çšããŠãããšæããŸããããããpaste
åé¡ãåŒãèµ·ãããŠããŸããã
ç§ã¯ä»ãgunicornã䜿çšããæ°ããä»äºã«å°±ããŠããããµãŒããŒãELBã®èåŸã«é 眮ãå§ãããŸã§ã¯ãã¹ãŠåé¡ãããŸããã§ããããWebã¢ããªãéåžžã«å¿çããªããªãããã³ã°ããŠããããã«èŠããŸãã
代ããã«gevent
ã¯ãŒã«ãŒã䜿çšããŠã¿ãŠãã ãããããã§ãåé¡ã¯è§£æ±ºããŸããã
ããã§ãããã¯æ¥ç¶ãç¶æããåæã¯ãŒã«ãŒãææããELBã®åé¡ã§ããïŒ åæã¯ãŒã«ãŒã§æ¥ç¶ãéããå¿ èŠãããããšãæå³çã«éç¥ãããããããã¯éåžžã«å¥åŠãªããšã«ãªããŸãïŒ https ïŒ
ãã ããæå³çã«æ¥ç¶ãéããããšã¯ã§ããŸãã client.close()
åŒã³åºããç¡æ¡ä»¶ã«ç§»åããããšããã¹ããããå Žåã¯ãèå³æ·±ããã¹ãã«ãªãå¯èœæ§ããããŸãïŒ //github.com/benoitc/gunicorn/blob/master/gunicorn/workers/sync.py#L199
ãŸããELBã®ã¢ã€ãã«ã¿ã€ã ã¢ãŠããã¯ãŒã«ãŒã¿ã€ã ã¢ãŠããããäœãããšã確èªããããšãã§ããŸããããã¯ããããåé¡ã®åå ã§ãããã©ãããè¿ éã«ç¢ºèªããããã§ãïŒ http ïŒ
@tilgovi the elbã¯ç§ã®çŸåšã®æè¯ã®æšæž¬ã§ãããªããªããaïŒgunicornãELBã®èåŸã«ããå Žåã«ã®ã¿çºçããbïŒ gevent
ã¯ãŒã«ãŒã䜿çšããŠåé¡ãä¿®æ£ãããããã§ãã ããããããäžåºŠã誰ãç¥ã£ãŠããŸããã
ELBã®èåŸã§ã®ã¿çºçãããããã³ã«HTTPãŸãã¯HTTPSãELBã«èšå®ãããŠããå Žåã«çºçããŸãã
ãããã³ã«ãTCPãŸãã¯SSLã«å€æŽãããšãåé¡ã¯è§£æ¶ãããŸãã
åæã¯ãŒã«ãŒã䜿çšããŠä¿®æ£ããæ¹æ³ãç¥ã£ãŠãã人ã¯ããŸããïŒ ãããŸã§èª¬æããä¿®æ£ïŒHTTPã§ã¯ãªãTCPïŒã䜿çšããŠãã¢ã¯ã»ã¹ãã°ãç£èŠããELBã®HTTP / HTTPSã§ã®ã¿æå¹ã«ãªã£ãŠããX-Forwarded-ForããããŒã確èªããŸãã:)
å¥åŠãªããšã«ãåãããŒãžã«ããããšã確èªããããã«ãããã¯ELBã§HTTP / HTTPSãªãã·ã§ã³ã䜿çšãããšãã«äœããã®æé©åãããããšãæå³ããŸããïŒ ãããŠããã®æé©åã¯åæã¯ãŒã«ãŒã«åé¡ãåŒãèµ·ãããŠããŸããïŒ
@ecs HTTP / HTTPSããŒããã©ã³ãµãŒã®å ŽåãåãTCPæ¥ç¶ãåå©çšããŸããããã¯ãELBã«ãã£ãŠé·æéåç¶ããŸã-ããçš®ã®ããšã§ãã ããããgeventã¯ãŒã«ãŒãæ£åžžã«æ©èœããçç±ã¯èª¬æãããŠããŸãã...ïŒgeventã¯ãŸã ãã¹ãããŠããŸãããããããã®ã³ã¡ã³ããèªãã§ãã ããïŒ
ãšããã§ã圱é¿ãäžããå¯èœæ§ã®ããèŠå ïŒgunicornããŒãžã§ã³ãã¯ãŒã«ãŒã¯ã©ã¹ãDockerå ãã©ãããELBãããã³ã«ïŒã¯ç¢ºãã«ããããããã®ã§ã誰ããELBã®TCPãããã³ã«ãHTTPãšã¯ç°ãªãåäœããããšããã¹ãããŠç¢ºèªããã®ã¯çŽ æŽãããããšã§ãã Ubuntu14.04ãšgunicornããŒãžã§ã³19.3.0ã§ãã¹ããããŠããDockerã§ãã¹ãããŠããŸã
ç§ã¯åãåé¡ãæ±ããŠããŸãïŒ
[2016-10-03 12:13:17 +0000] [6] [ã¯ãªãã£ã«ã«]ã¯ãŒã«ãŒã¿ã€ã ã¢ãŠãïŒpidïŒ16ïŒ
[2016-10-03 12:13:17 +0000] [16] [æ
å ±]ã¯ãŒã«ãŒãçµäºããŸãïŒpidïŒ16ïŒ
[2016-10-03 12:13:17 +0000] [6] [ã¯ãªãã£ã«ã«]ã¯ãŒã«ãŒã¿ã€ã ã¢ãŠãïŒpidïŒ20ïŒ
[2016-10-03 12:13:17 +0000] [20] [æ
å ±]ã¯ãŒã«ãŒãçµäºããŸãïŒpidïŒ20ïŒ
[2016-10-03 12:13:17 +0000] [33] [INFO] pidã§ã¯ãŒã«ãŒãèµ·åããŠããŸãïŒ33
ç§ã®ã»ããã¢ããã
kube-awsã䜿çšããŠãAWSã§core-osã䜿çšããŠkubernetesã¯ã©ã¹ã¿ãŒãã»ããã¢ããããŠããŸãïŒ https ïŒ
gunicornãšsyncã¯ãŒã«ãŒã䜿çšããPythonã¢ããªããããŸãã ãããã®ãµãŒãã¹ã¯ãç§ã®ãµã€ã蚌ææžã§HTTPSããŒããã©ã³ãµãŒã䜿çšããŸãã ãã¹ãŠã®ã¯ãŒã«ãŒã¯ãããã©ã«ãã®ã¿ã€ã ã¢ãŠãæéã§ãã30ç§åŸã«ã¿ã€ã ã¢ãŠããããšèŠãªãããŸãã æçµçã«ã¯ãã¹ãŠåèµ·åãããŸãã Kubernetesã¯ãã³ã³ãããçµäºãããšæçµçã«åèµ·åããŸãããããã®åèµ·åã¯ç¶ç¶çã«è¡ãããŸãã äžèšã®èª°ããgeventãåé¡ã解決ãããšèšã£ãã®ã§ãç§ã¯ãããè©ŠããŠã¿ããããããŸãããããªããããèµ·ãã£ãŠããã®ããæ¬åœã«ç解ããããšæããŸãã
çŸåšããã®åé¡ãçºçããŠããŸããæ©äŒãããã°ã詳现ãæçš¿ããŠã¿ãŸãã geventã«ç§»è¡ããããšã§å®éã«åé¡ã解決ãããããããã¯åæã¯ãŒã«ãŒã«é¢é£ããŠããŸãã ããã¯ãECSãšELBã䜿çšããAWSäžã«ãããŸãã
ç§ãã¡ã®ã¢ããªã®1ã€ã§ãåãå¥åŠãªåé¡ããããŸããã ãªã¹ããŒãHTTPããtcpã«å€æŽãããšãå®éã«åé¡ã解決ããŸãã
誰ããç§ã«åé¡ãåçŸããããã®æ®µéçãªæ¹æ³ãæäŸã§ããŸããïŒ ïŒèšå®æé ãªã©ïŒãŸãã¯ãå°ãªããšããã®ç°å¢ãã»ããã¢ããããç°¡åãªæ¹æ³ãæããŠãã ãã:)ä»é±ã¯ãããèŠãŠãããŸãã
ãã®ãããªãã©ã³ãµãŒãHTTPã«äŸåããã«ã¯ãéåžžãããŒãã¢ã©ã€ãããã€ã³ããåŠçããå¿ èŠããããŸãïŒtcpãé€ãïŒããã®ãããåæã¯ãŒã«ãŒããµããŒãã®ããã«æŽæ°ããããŸã§ãåæã¯ãŒã«ãŒã®äœ¿çšãåé¡ã«ãªãå¯èœæ§ããããŸãã
ãšã«ããç§ã«ç¥ãããŠãã ããã
åºæ¬çãªFlaskã¢ããªãã»ããã¢ããããAWSã®Dockerå ã§åæã¯ãŒã«ãŒã䜿çšããŠgunicornã§å®è¡ããHTTPè² è·åæ£ãšäžèšã®æ§æãå®è¡ããŸãã
AWSã®Ubuntu14.04LTSã§å®è¡ãããŠããDockerã€ã¡ãŒãžå ã§gunicorn19.4.5ã䜿çšãããšã1ãè¶ ããåæã¯ãŒã«ãŒãšããã©ã«ãã®30ç§ã®ã¿ã€ã ã¢ãŠãæéã§å®è¡ãããšãäžå®ã®ã¯ãŒã«ãŒã¿ã€ã ã¢ãŠãã衚瀺ãããŸãã
ã¢ããªã±ãŒã·ã§ã³ã«ãªã¯ãšã¹ããéä¿¡ããå¿ èŠã¯ãããŸããããã°ãç£èŠããã ãã§ãã¯ãŒã«ãŒãã¿ã€ã ã¢ãŠãããã®ã確èªã§ããŸãã
çŸåšãã¿ã€ã ã¢ãŠãæéã65ç§ã®geventã¯ãŒã«ãŒã䜿çšããŠããŸãïŒAWS ELBã¿ã€ã ã¢ãŠãã¯60ç§ãAFAIKã§ãïŒã 1人ã®ã¯ã©ã€ã¢ã³ãã ãããªã¯ãšã¹ããéä¿¡ããäžåºŠã«1ã€ã®ãªã¯ãšã¹ããåŠçãããŠããå Žåã§ãã504ãšã©ãŒãçºçããããšããããŸããããŸã çç±ãç¹å®ã§ããŸããã§ããã
@ obi1kenobiããŒãã¢ã©ã€ããELBã¿ã€ã ã¢ãŠããªãã·ã§ã³ãè¶ ããŠå¢ãããããšããŸãããïŒ
@lenucksiããŒãã¢ã©ã€ãã¯ãã§ã«ELBã¿ã€ã ã¢ãŠããã5ç§é«ããªã£ãŠããŸã-ãµãŒããŒã®ã¯ããã¯ãããã»ã©é§åããªãããšãé¡ã£ãŠããŸã:)
ELBã®èåŸã«ããEC2ã€ã³ã¹ã¿ã³ã¹ã®Dockerã³ã³ããå ã§gunicorn19.6ãå®è¡ããŠãããšãã«ããã®åé¡ãçºçããŸããïŒEC2ã€ã³ã¹ã¿ã³ã¹ãžã®ãªããŒã¹ãããã·ã«ããã©ã«ãã®HTTPãããã³ã«ã䜿çšïŒã
åã«ææ¡ããããã«ãworkerã¯ã©ã¹ãgeventã«èšå®ãããšããã®åé¡ã解決ããŸããïŒä»¥åã¯ããã©ã«ãã®sync
ã¯ãŒã«ãŒã¯ã©ã¹ã䜿çšããŠããŸããïŒã
åé¡ãåçŸããããã®æå°éã®äŸãææžåããŠã¿ãŸãã
ä»ã®äººãèšã£ãããšãè£ä»ããããã«ãELBã¯EC2ã€ã³ã¹ã¿ã³ã¹ãžã®æ¥ç¶ãéããgunicornãè¿œå ã®ãªã¯ãšã¹ããåŠçã§ããªãããã«éãããŸãŸã«ããŠããããã§ãã
gunicornãELBããã®ãªã¯ãšã¹ããã¿ã€ã ã¢ãŠãããããã«ãã®ããŒã«ããªãŒãã³æ¥ç¶ãçµäºãããšããã®èåŸã«ãã¥ãŒã€ã³ã°ããããã¹ãŠã®ä¿çäžã®ãªã¯ãšã¹ãã倱æããŸãïŒELBã®ãã«ã¹ãã§ãã¯ãå«ããããã€ã³ã¹ã¿ã³ã¹ãELBããåé€ããããããã°ãå°é£ã«ãªããŸã; ïŒïŒã
ãã®çç¶ã¯ããããDockerãšã¯é¢ä¿ã®ãªããã®åã®åé¡ã§èŠ³å¯ããããã®ãšéè€ããŠããããšã瀺åããŠããŸãïŒ //github.com/benoitc/gunicorn/issues/588
@jelisãããããã€ãã®kubernetesæ§æã«é¢é£ããŠãããã©ããç¥ã£ãŠããŸããïŒ åé¡ã¯è§£æ±ºããŸãããïŒ
ç§ã¯SSLã¿ãŒãããŒã·ã§ã³ãåããELBã«ãåå ããŠããŸãã ãã°ã«ããã衚瀺ãããŠããŸãã
[017-03-01 07:36:32 +0000] [1249] [DEBUG] GET /healthcheck
[01/Mar/2017:07:36:32 +0000] "GET /healthcheck HTTP/1.1" 200 22 "-" "ELB-HealthChecker/1.0"
[017-03-01 07:36:37 +0000] [12] [CRITICAL] WORKER TIMEOUT (pid:1203)
[017-03-01 07:36:37 +0000] [12] [CRITICAL] WORKER TIMEOUT (pid:1225)
[017-03-01 07:36:37 +0000] [12] [CRITICAL] WORKER TIMEOUT (pid:1234)
[017-03-01 07:36:37 +0000] [12] [CRITICAL] WORKER TIMEOUT (pid:1243)
[017-03-01 07:36:37 +0000] [1203] [INFO] Worker exiting (pid: 1203)
[017-03-01 07:36:37 +0000] [1225] [INFO] Worker exiting (pid: 1225)
[017-03-01 07:36:37 +0000] [1243] [INFO] Worker exiting (pid: 1243)
[017-03-01 07:36:37 +0000] [1234] [INFO] Worker exiting (pid: 1234)
[017-03-01 07:36:37 +0000] [1256] [INFO] Booting worker with pid: 1256
[017-03-01 07:36:37 +0000] [12] [DEBUG] 14 workers
[017-03-01 07:36:37 +0000] [1257] [INFO] Booting worker with pid: 1257
[017-03-01 07:36:37 +0000] [1262] [INFO] Booting worker with pid: 1262
[017-03-01 07:36:37 +0000] [1265] [INFO] Booting worker with pid: 1265
[017-03-01 07:36:37 +0000] [12] [DEBUG] 16 workers
[017-03-01 07:36:40 +0000] [1262] [DEBUG] GET /healthcheck
æŽæ°-gunicornããgeventïŒhttp://flask.pocoo.org/docs/0.12/deploying/wsgi-standalone/#geventïŒã«åãæ¿ãããšãããåé¡ã¯è§£æ±ºããŸããã ããã¯ç§ã®äžèšã®ã³ã¡ã³ããåç §ããŠããŸãhttps://github.com/benoitc/gunicorn/issues/1194#issuecomment-283269046
ç§ã¯ãã®åé¡ã«æ°æ¥éåãçµãã§ããŸããã ããã«ããã¿ããªã®ã¡ã¢ã¯çŽ æŽããããä¿®æ£/åé¿ç/ç·©åçãè¿œæ±ããããã®å€ãã®æ段ãç§ãã¡ã«äžããŠããŸãã ïŒç§ã®äœæ¥ã®ãã°ã¯ãããã§è¿œè·¡ããŠãããã°ã«ãããŸãïŒ
ã¯ãŒã«ãŒæ°ãå¢ãããŠgeventã®äœ¿çšãè©Šã¿ããšããããŸã£ãã圹ã«ç«ã¡ãŸããã§ãããå®éãé©ãã»ã©èŠæ ããæªããªããŸããã5人ã®geventã¯ãŒã«ãŒå šå¡ãåæã«æ»äº¡ããŸãããããã¯ãç§ãäžã§èªãã ãã®ïŒ
[2017-03-30 23:38:37 +0000] [5] [INFO] Starting gunicorn 19.7.1
[2017-03-30 23:38:37 +0000] [5] [INFO] Listening at: http://0.0.0.0:8000 (5)
[2017-03-30 23:38:37 +0000] [5] [INFO] Using worker: eventlet
[2017-03-30 23:38:38 +0000] [8] [INFO] Booting worker with pid: 8
[2017-03-30 23:38:40 +0000] [9] [INFO] Booting worker with pid: 9
[2017-03-30 23:38:41 +0000] [11] [INFO] Booting worker with pid: 11
[2017-03-30 23:38:42 +0000] [12] [INFO] Booting worker with pid: 12
[2017-03-30 23:38:42 +0000] [10] [INFO] Booting worker with pid: 10
[2017-03-30 23:40:08 +0000] [5] [CRITICAL] WORKER TIMEOUT (pid:8)
[2017-03-30 23:40:12 +0000] [5] [CRITICAL] WORKER TIMEOUT (pid:9)
[2017-03-30 23:40:12 +0000] [5] [CRITICAL] WORKER TIMEOUT (pid:10)
[2017-03-30 23:40:12 +0000] [5] [CRITICAL] WORKER TIMEOUT (pid:11)
[2017-03-30 23:40:12 +0000] [5] [CRITICAL] WORKER TIMEOUT (pid:12)
[2017-03-30 23:40:13 +0000] [8] [INFO] Worker exiting (pid: 8)
[2017-03-30 23:40:13 +0000] [10] [INFO] Worker exiting (pid: 10)
[2017-03-30 23:40:16 +0000] [16] [INFO] Booting worker with pid: 16
[2017-03-30 23:40:16 +0000] [17] [INFO] Booting worker with pid: 17
[2017-03-30 23:40:18 +0000] [18] [INFO] Booting worker with pid: 18
[2017-03-30 23:40:20 +0000] [19] [INFO] Booting worker with pid: 19
[2017-03-30 23:40:23 +0000] [20] [INFO] Booting worker with pid: 20
ããã¯ããããç§ã®åŽã®æ··ä¹±ã§ãããç§ã®ãããžã§ã¯ãã®å¯Ÿå¿ç©ã®1ã€ãšåãåäœã§ã¯ãããŸããã§ããïŒã»ãŒåäžã®AWS / CloudFormation / ALB / ECSãããã€ã¡ã³ãã§é¡äŒŒããŠãããåäžã§ã¯ãªãã³ãŒãããŒã¹ã䜿çšïŒã ãã ããALBãECSãDockerãgunicornã®éã®çžäºäœçšã«ã€ããŠæ°ããæŽå¯ãåŸãããå Žåã«åããŠãå ±åãããšæããŸããã
åæ§ã®èšå®ïŒELB-> ECS Docker Container-> Gunicorn-> Djangoãå®è¡ããŠããconvoxïŒãããã次ã®æ§æå€æŽã圹ç«ã£ãããã«èŠããããšã確èªã§ããŸãã
keepalive = 75 # needs to be longer than the ELB idle timeout
timeout = 90
worker_class = 'gevent'
ELBã¢ã€ãã«ã¿ã€ã ã¢ãŠãã60ç§ã«èšå®ããŸããã
ãããã®èšå®ãå€æŽããåã¯ãããŒãã¢ã©ã€ããã¿ã€ã ã¢ãŠããããã³åæã¯ãŒã«ãŒã®ããã©ã«ãã䜿çšããŠããŸããã
èå³æ·±ãããšã«ããã®åé¡ã¯4æ10æ¥åå4æïŒUTCïŒã«çºçãå§ããŸãããã¢ããªã¯ãåã®æšææ¥ããå€æŽãªãã§æ£åžžã«å®è¡ãããŠããŸããã
ç©ã¿éããã ãã§ãDockerã¯ãããŸãããã裞ã®awsã€ã³ã¹ã¿ã³ã¹ã§ELBã®èåŸã§åãåé¡ãçºçããŠããŸããã osxã§NPãåäœãããŸãããELBãšåãåé¡ã®ããubuntu16ãçºçããŸãã gevent
ã¯ãŒã«ãŒã¯ã©ã¹ã¯ãããä¿®æ£ããŠããããã§ã[ç§ã«ãšã£ãŠ]ã
ãã®ã¹ã¬ããã®èª°ããããããã§ãã¯ã§ããŸããïŒ
https://serverfault.com/questions/782022/keepalive-setting-for-gunicorn-behind-elb-without-nginx
@erikcwã¯ããã®ãœãªã¥ãŒã·ã§ã³ãæ©èœããããšãçºèŠããããã§ãã ç§ã¯ãã®åé¡ãçµããããããšæããŸãã Gunicornã¯ãŒã«ãŒã®ã¿ã€ã ã¢ãŠããšããŒãã¢ã©ã€ãã®ã¿ã€ã ã¢ãŠããäžããåŸã誰ãããããåçŸã§ããå Žåã¯ããã®ããã«èšã£ãŠãã ããã
ãŸãã¯ãELBã®ã¢ã€ãã«ã¿ã€ã ã¢ãŠããäžããŸãã
éçã®ã¯ã©ã€ã¢ã³ãïŒãŸãã¯æªæã®ããã¯ã©ã€ã¢ã³ãïŒã¯ELBã®ããã«æ¯ãèããåãåé¡ãåŒãèµ·ããããšãã§ããŸããã§ãããïŒ
@ six8ã¯ãã ELBãããããããªããä¿è·ããŸããã ããã¥ã¡ã³ãã§ã¯ããã«ã€ããŠèª¬æããŠããŸãïŒ http ïŒ
äžéšã®äººã ã¯ãã®è åšãæ°ã«ãããELBã®ç«¯ãŸãã¯åŸãã«Gunicornããããã€ãããã ãã§ãã ããã§èª¬æããåé¡ã¯ãELBèªäœã«ãã£ãŠåŒãèµ·ããããã¯ãŒã«ãŒã®ã¿ã€ã ã¢ãŠãã§ãã åæã¯ãŒã«ãŒã䜿çšããè¿œå ã®ãªããŒã¹ãããã·ã䜿çšããã«ãgunicornãELBã®èåŸã§æ©èœããããã«ããæšå¥šæ§æãæäŸããããšæããŸãã
ç§ã¯ã«gunicornã®åŒã³åºããå€æŽããããšã§ãåæ§@erikcwã®è§£æ±ºçãè©ŠããŠã¿ãŸããïŒ
CMD [ "gunicorn", "-k", "gevent", "--timeout", "10", "--keep-alive", "75", "--paste", "/etc/jzoo/app.ini" ]
æ®å¿µãªãããããã¯åœ¹ã«ç«ã¡ãŸããïŒ
[2017-07-04 08:36:23 +0000] [1] [CRITICAL] WORKER TIMEOUT (pid:24)
[2017-07-04 08:38:11 +0000] [1] [CRITICAL] WORKER TIMEOUT (pid:28)
[2017-07-04 08:39:39 +0000] [1] [CRITICAL] WORKER TIMEOUT (pid:29)
[2017-07-04 08:44:14 +0000] [1] [CRITICAL] WORKER TIMEOUT (pid:25)
[2017-07-04 08:44:55 +0000] [1] [CRITICAL] WORKER TIMEOUT (pid:31)
Gunicornåæã¯ãŒã«ãŒãåããALBã®èåŸã«ããECSã§å®è¡ãããŠããã¢ããªã±ãŒã·ã§ã³ããããŸãã ãŸã åé¡ã¯çºçããŠããŸããã
誰ã§ãåçŸå¯èœãªå±éãæäŸã§ããŸããïŒ
åæ§ã«ç©ã¿éããŸãã ELBã䜿çšããŠAWSã§Kubernetesã䜿çšãããšãã®åé¡ãçºçããŸãã çŸåšã8人ã®ã¯ãŒã«ãŒãå®è¡ãããŠããŸãã https://serverfault.com/questions/782022/keepalive-setting-for-gunicorn-behind-elb-without-nginx/ããšã«ã keepalive
ãŸã§äžæãããã®ã¹ã¬ããããšã«è©ŠããŠã¿ãŸã代ããã«gevent
ã¯ãŒã«ãŒã䜿çšããŸãã ããããçŸæç¹ã§å€±æããŠããã®ã¯ãããèªäœã§ã¿ã€ã ã¢ãŠãããããã¯/åŒãèµ·ãããŠã¯ãªããªãAPIåŒã³åºãã®ããã©ãŒãã³ã¹ãã¹ãã§ãã sync
åŽåè
ãããã§äœãèµ·ãã£ãŠããã®ãç¥ãããã§ãã ãã®ã¹ã¬ããã®ããã€ãã®åªããã¬ã€ãã©ã€ã³ã«åŸã£ãŠãããæ©èœããããã«ãªã£ããšããŠããæ¬çªç°å¢ã«ãããã€ããåã«äœãèµ·ãã£ãŠãããã«ã€ããŠããå°ãèªä¿¡ãæã£ãŠã»ãããšæããŸãã
--worker-classã--worker-class gevent
èšå®ãããšããŸããããŸããã ã³ã¡ã³ããšå©ããŠãããŠããããšãïŒ
@wichertããã¯éåžžã«å¥åŠã§ãã geventã¯ãŒã«ãŒã®å Žåãã¯ãŒã«ãŒã¯ãæ¥ç¶ãšã¯å¥ã®ã°ãªãŒã³ã¬ããã§ãã¢ãŒãã¿ãŒã«èªåã®ã©ã€ããã¹ãéç¥ããå¿ èŠããããŸãã ããŒãã¢ã©ã€ãèšå®ã¯ãããã«ãŸã£ãã圱é¿ãäžããªãã¯ãã§ãã geventãèšèšã©ããã«æ©èœããŠããªããªã©ãã¢ããªã±ãŒã·ã§ã³ã«åé¡ãããããã»ããã¢ããã«é¢ããåé¡ãããããããã®ä»ã®ã·ããªãªã«å ±éããŠããå¯èœæ§ããããŸãã
ãã®ã¹ã¬ããã®å šå¡ãããã®åé¡ãåçŸããã¢ããªã±ãŒã·ã§ã³ãæäŸããŠãã ããã åçŸã§ããŸããã§ããã åçŸããæé ããªããã°ãç§ã¯éããããªããŸãã ãããã®ã³ã¡ã³ãã«ã¯ãããŸããŸãªæšå¥šäºé ããããããããéåžžã«ç°ãªãåé¡ãåã蟌ãŸããŠããŸãã ãã®åé¡ãã©ãããããç¥ãã®ã¯é£ããã§ãã
@tilgovi geventã«ã¯ãŒã«ãŒã¯ã©ã¹ãæå®ããªãå ŽåïŒããšãã°ãããã©ã«ãã®åæã¯ãŒã«ãŒã䜿çšããå ŽåïŒã«ãã®åé¡ãçºçããŸããã ç§ã®ã»ããã¢ããã¯ãpypy3ïŒPyPy 5.8.0-beta0ïŒãfalcon 1.2ãªã©ã䜿çšããvirtualenvã§ãïŒFalconãç解ããããšã¯pypy3ã§å ¬åŒã«ãµããŒããããŠããŸããïŒã https://github.com/7ideas/cookiecutter-falconã®cookiecutterã䜿çšãããã¹ãŠã®ææ°ããã±ãŒãžã«ã¢ããã°ã¬ãŒãããŸããããã©ãŠã¶ã«sample_resourceãèªã¿èŸŒãããšããŠãhttpieã§äœåºŠãããããããšãã¯ãŒã«ãŒã®ã¯ã©ãã·ã¥ãšã©ãŒãæç¶çã«è¡šç€ºãããŸããïŒããšãã°ããªã¯ãšã¹ããé ãããšãšã©ãŒã衚瀺ãããŸãããªã¯ãšã¹ãããã£ã³ã»ã«ããªãã£ãå Žåã¯ãæçµçã«å¿çããŸãïŒã ããã¯ãããã©ã«ãã®ã¯ãŒã«ãŒã¯ã©ã¹ã®åæã§ã®ã¿çºçããŸããã geventã䜿çšããããã«æå®ãããšããã¹ãŠãæ©èœããŸããã
ããããšãã @ jhillhouse92 ãè©ŠããŠã¿ãŸãã
@tilgoviãã¿ã€ã ã¢ãŠãã®åé¡ãåŒãç¶ãçºçããŸãã ç§ã¯ããããã£ãšææ¥ãã©ãã«ã·ã¥ãŒãã£ã³ã°ããããæ£ç¢ºãªæ å ±ã§ã¢ããããŒããæçš¿ããŸãã ãã®åé¡ã¯éãããŸãŸã«ããŠãã ããã ããŸããŸãªåé¡ãçºçããŠããå¯èœæ§ããããŸãããäžè¬çãªããŒãã¯ãAWS / ELBã䜿çšããŠãããã€ãããã¢ããªã±ãŒã·ã§ã³ã§gunicornã䜿çšãããšãgunicornã¯ãŒã«ãŒïŒããããsyncã¯ãŒã«ãŒã¯ã©ã¹tbdã®ã¿ïŒã§ã¿ã€ã ã¢ãŠãã®åé¡ãçºçããããšã§ãã æ£ç¢ºãªåé¡ãç¹å®ããŠããªããŠããããã«äœãåé¡ããããŸãã ããã«æãäžãã䟡å€ããããŸãã ææ¥æŽæ°ããŸãã
泚ç®ã«å€ããã®ã¯ãäžèšã®ã¹ã¿ãã¯ã§Docker / AWS / ELBå ã§ã¯ãªããããŒã«ã«ã§ãã®åé¡ãçºçããããšã§ãã
ãã®ãããgeventã䜿çšããŠãã¢ã¯ã»ã¹ãã°ããã£ããã£ããAWS / ELBã䜿çšããŠã¢ããªããããã€ããããšããŠããŸãã
dockerfileã³ãã³ãïŒ
FROM cortex/base
CMD ["gunicorn", "-w", "8", "-b", "0.0.0.0:5000", "--capture-output", "--enable-stdio-inheritance", "--access-logfile", "-", "--worker-class", "gevent", "-t", "60", "--log-level", "debug", "app:app"]
å¶éãäœã«èšå®ãããã«é¢ä¿ãªãããšã©ãŒã³ãŒã14ã«é¢é£ããŠã¯ã¬ã€ãžãŒãªOOMãšã©ãŒãçºçããŸãã ãã®åé¡ã®æèã§ä»ã®èª°ãããããèŠãããšããããŸããïŒ ä»¥åã¯ãã¯ãŒã«ãŒã®ã¿ã€ã ã¢ãŠãã確èªã§ããŸããã ç§ã®çŸåšã®èšå®ã§ã¯ãã¿ã€ã ã¢ãŠããåçŸããããšã¯ã§ããŸãã/ãããŸã§å°éããããšã¯ã§ããŸããã
[2017-07-19 18:27:39 +0000] [34] [ERROR] Exception in worker process
Traceback (most recent call last):
File "/usr/local/lib/python3.5/site-packages/gunicorn/arbiter.py", line 578, in spawn_worker
worker.init_process()
File "/usr/local/lib/python3.5/site-packages/gunicorn/workers/ggevent.py", line 190, in init_process
super(GeventWorker, self).init_process()
File "/usr/local/lib/python3.5/site-packages/gunicorn/workers/base.py", line 126, in init_process
self.load_wsgi()
File "/usr/local/lib/python3.5/site-packages/gunicorn/workers/base.py", line 135, in load_wsgi
self.wsgi = self.app.wsgi()
File "/usr/local/lib/python3.5/site-packages/gunicorn/app/base.py", line 67, in wsgi
self.callable = self.load()
File "/usr/local/lib/python3.5/site-packages/gunicorn/app/wsgiapp.py", line 65, in load
return self.load_wsgiapp()
File "/usr/local/lib/python3.5/site-packages/gunicorn/app/wsgiapp.py", line 52, in load_wsgiapp
return util.import_app(self.app_uri)
File "/usr/local/lib/python3.5/site-packages/gunicorn/util.py", line 376, in import_app
__import__(module)
File "/code/app/__init__.py", line 2, in <module>
from flask_alchy import Alchy
File "/usr/local/lib/python3.5/site-packages/flask_alchy.py", line 8, in <module>
from flask_sqlalchemy import SQLAlchemy
File "/usr/local/lib/python3.5/site-packages/flask_sqlalchemy/__init__.py", line 18, in <module>
import sqlalchemy
File "/usr/local/lib/python3.5/site-packages/sqlalchemy/__init__.py", line 9, in <module>
from .sql import (
File "/usr/local/lib/python3.5/site-packages/sqlalchemy/sql/__init__.py", line 8, in <module>
from .expression import (
File "/usr/local/lib/python3.5/site-packages/sqlalchemy/sql/expression.py", line 34, in <module>
from .functions import func, modifier, FunctionElement, Function
File "/usr/local/lib/python3.5/site-packages/sqlalchemy/sql/functions.py", line 11, in <module>
from . import sqltypes, schema
File "<frozen importlib._bootstrap>", line 969, in _find_and_load
File "<frozen importlib._bootstrap>", line 958, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 673, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 658, in exec_module
File "<frozen importlib._bootstrap_external>", line 763, in get_code
File "<frozen importlib._bootstrap_external>", line 816, in get_data
OSError: [Errno 14] Bad address
ç¹°ãè¿ãã«ãªããŸãããDockerãªãã§ã¯ããã¯ããŒã«ã«ã§ã¯èŠãããŸããã ããã¯Dockerã§ã¯ããŒã«ã«ã«ã¯è¡šç€ºãããŸããã ãããšã¿ã€ã ã¢ãŠãã®åé¡ã¯ãæããã«Docker / AWS / ELBã¹ã¿ãã¯ã§ã®ã¿çºçããŸãïŒç§ã«ãšã£ãŠïŒã
@tilgoviæåã«ééã£ãããšã®1ã€ã¯ïŒäžèšã®ã¹ããããã«èŠãããããã«ïŒãã¿ã€ã ã¢ãŠãã誀ã£ãŠ10ç§ã«èšå®ãããŠããããšã§ãã ããã75ç§ã«å€æŽããåŸãã¯ãŒã«ãŒã®ã¿ã€ã ã¢ãŠãæ°ã¯å€§å¹ ã«æžå°ãããããã1æ¥ãããæ°åã«ãªããŸããã å®å šãæãããã«ãããã¯ç§ãã¢ããªãèµ·åããããã«äœ¿çšããŠããæ£ç¢ºãªã³ãã³ãã§ãã
gunicorn -k gevent --timeout 90 --keep-alive 75 --paste /etc/jzoo/app.ini "$@"
.iniãã¡ã€ã«ã¯æ¬¡ã®ããã«ãªããŸãã
[DEFAULT]
sqlalchemy.url = postgresql://XXXX
[app:main]
use = egg:jzoo.api.admin
[server:main]
use = egg:gunicorn#main
bind = 0.0.0.0:5000
workers = 4
preload_app = true
loglevel = warning
# Logging configuration
[loggers]
keys = root,sqlalchemy,alembic,jzoo
# .. more logging configuration
ãã©ãã£ãã¯ã®éã¯èŠå ã§ã¯ãªãããã§ããããã¯ããã©ãã£ãã¯ãã»ãšãã©ãªãQAç°å¢ã§çºçããŠããããã§ãã
ãããã©ã®ãããã®é »åºŠã§çºçããããèŠãŠããããã¢ããªã®åèµ·åã«é¢é£ããŠããå¯èœæ§ããããã©ããçåã«æã£ãŠããŸããïŒ
ç§ã¯ãã䌌ããããªåé¡ãæ±ããŠããŸãã 調æ»ã®çµæããããããããã¯ãŒã¯æ¥ç¶ãšã©ãŒã§ãããgunicornã®ãšã©ãŒã§ã¯ãªããšæããŸãã
ãããç§ã®èšå®ã§ãïŒ
ããããªããšã«ãã¢ããªãµãŒããŒããpostgresãµãŒããŒãžã®ã»ãšãã©ã®ãªã¯ãšã¹ãã¯1ã€ãé€ããŠOKã§ããã ãã®ã¯ãšãªã¯æ°žä¹ ã«å®è¡ãããããã§ãgunicornã¯ãŒã«ãŒãã¿ã€ã ã¢ãŠãããŸãã
ã¢ããªãããŒã«ã«ã§äœ¿çšããã°ãåé¡ã¯è§£æ±ºããŸããã
ã¢ããªãµãŒããŒããããã³ã°ããªãå Žåããåé¡ã¯è§£æ±ºããŸãã
ç§ã®äžæçãªä¿®æ£ã¯ãAWSã»ãã¥ãªãã£ã°ã«ãŒãèšå®ãä»ããŠã¢ããªãµãŒããŒãšpostgresãµãŒããŒéã®ãã¹ãŠã®æ¥ç¶ãéãããšã§ãã ããã§ããã¹ãŠãåã³æ£åžžã«æ©èœããŸãã
Pythonã³ã³ãããšAWSã®éã«æ¥ç¶ã®åé¡ããããšæããŸãã AWSãã°ã¹ããªãŒã ã培åºçã«èª¿ã¹ãåŸãæŽæ°ããŸãã
ããããšãããããŸããïŒïŒ ELBãšã€ã³ã¹ã¿ã³ã¹ãããã³ã«ãHTTPããTCPã«å€æŽããããšã¯åé¡ãªãæ©èœããŸããð
ãã®åé¡ã¯AWSã«åºæã®åé¡ã§ã¯ãªããGunicornãšçµã¿åãããå Žåã®Dockerèªäœã«åºæã®åé¡ã®ããã§ãã å°ãªããšãæ¬çªç°å¢ã§ã¯ãããã¯gevent
ã§ãèŠãããŸãã
@tilgoviããã¯ããã®ãšã©ãŒãåçŸããããã®ç°¡åãªã¢ããªã§ãïŒ
app.pyïŒ
import falcon
class HelloResource:
def on_get(self, req, resp):
resp.media = {'info': 'hello world'}
app = falcon.API()
app.add_route('/', HelloResource())
DockerfileïŒ
FROM python:3.6
WORKDIR /code
RUN pip install gunicorn falcon
COPY app.py .
CMD ["gunicorn", "app:app", "--bind", "0.0.0.0:8000"]
å®è¡ããã«ã¯ïŒ docker build -t gunicorn-and-docker . && docker run -p 8000:8000 -it --rm gunicorn-and-docker
ãã°ã¯æ¬¡ã®ããã«ãªããŸãïŒå°ãªããšããDocker17.06.2-ce-mac27ïŒ19124ïŒã䜿çšããŠããmacOS Sierraã§ã¯ïŒïŒ
[2017-09-23 22:31:00 +0000] [1] [INFO] Starting gunicorn 19.7.1
[2017-09-23 22:31:00 +0000] [1] [INFO] Listening at: http://0.0.0.0:8000 (1)
[2017-09-23 22:31:00 +0000] [1] [INFO] Using worker: sync
[2017-09-23 22:31:00 +0000] [9] [INFO] Booting worker with pid: 9
[2017-09-23 23:22:45 +0000] [1] [CRITICAL] WORKER TIMEOUT (pid:9)
[2017-09-23 23:22:45 +0000] [9] [INFO] Worker exiting (pid: 9)
[2017-09-23 23:22:45 +0000] [11] [INFO] Booting worker with pid: 11
[2017-09-23 23:39:46 +0000] [1] [CRITICAL] WORKER TIMEOUT (pid:11)
[2017-09-23 23:39:46 +0000] [11] [INFO] Worker exiting (pid: 11)
[2017-09-23 23:39:46 +0000] [13] [INFO] Booting worker with pid: 13
[2017-09-23 23:41:10 +0000] [1] [CRITICAL] WORKER TIMEOUT (pid:13)
[2017-09-23 23:41:10 +0000] [13] [INFO] Worker exiting (pid: 13)
[2017-09-23 23:41:10 +0000] [15] [INFO] Booting worker with pid: 15
[2017-09-23 23:42:27 +0000] [1] [CRITICAL] WORKER TIMEOUT (pid:15)
[2017-09-23 23:42:27 +0000] [15] [INFO] Worker exiting (pid: 15)
[2017-09-23 23:42:27 +0000] [17] [INFO] Booting worker with pid: 17
[2017-09-23 23:43:44 +0000] [1] [CRITICAL] WORKER TIMEOUT (pid:17)
[2017-09-23 23:43:44 +0000] [17] [INFO] Worker exiting (pid: 17)
[2017-09-23 23:43:44 +0000] [19] [INFO] Booting worker with pid: 19
[2017-09-24 18:37:12 +0000] [1] [CRITICAL] WORKER TIMEOUT (pid:19)
[2017-09-24 18:37:12 +0000] [19] [INFO] Worker exiting (pid: 19)
[2017-09-24 18:37:12 +0000] [21] [INFO] Booting worker with pid: 21
[2017-09-24 19:49:20 +0000] [1] [CRITICAL] WORKER TIMEOUT (pid:21)
[2017-09-24 19:49:20 +0000] [21] [INFO] Worker exiting (pid: 21)
[2017-09-24 19:49:20 +0000] [23] [INFO] Booting worker with pid: 23
[2017-09-24 19:50:37 +0000] [1] [CRITICAL] WORKER TIMEOUT (pid:23)
[2017-09-24 19:50:37 +0000] [23] [INFO] Worker exiting (pid: 23)
[2017-09-24 19:50:37 +0000] [25] [INFO] Booting worker with pid: 25
[2017-09-24 20:25:48 +0000] [1] [CRITICAL] WORKER TIMEOUT (pid:25)
[2017-09-24 20:25:48 +0000] [25] [INFO] Worker exiting (pid: 25)
[2017-09-24 20:25:48 +0000] [27] [INFO] Booting worker with pid: 27
ããã
ç§ã¯æè¿åãåé¡ã«ã¶ã€ãããŸããã
ç§ã®å ŽåïŒECS + gunicorn 19.7.1 + Django 1.11.5ïŒãã¿ã¹ã¯å®çŸ©ã®ã³ã³ãããŒå°çšã®ã¡ã¢ãªéãå¢ããã ãã§ïŒã©ãããïŒããã解決ã§ããŸããïŒ128ãã256mbïŒã
ãã以äžã®ãšã©ãŒã¯ãããŸããã ãããåã³èµ·ãããªãã°ãç§ã¯ããã§å ±åããŸãã
ããã§å°ãã³ãŒã©ã¹ãè¿œå ããŸãããgeventã«åãæ¿ããã ãã§ããã解決ããããšãã§ããŸããã
éãæªãã£ãã®ã§ãåæã¯ãŒã«ãŒã§ã¿ã€ã ã¢ãŠãã90ã«ãããŒãã¢ã©ã€ãã75ã«å¢ãããããšããŸããã
ãŸããèå³æ·±ãããšã«ããã®ã·ããªãªã®ç§ã®ELBã¯ãHTTPã§ã¯ãªãTCPã¬ãã«ã®è»¢éã®ã¿ãè¡ã£ãŠããŸãã
ããŠãç§ã¯ããã説æããããã€ãã®åèæç®ãèŠã€ããŸããã [1]
GunicornåŽã®å°ããªå€æŽã§è§£æ±ºã§ããŸãã åæã¯ãŒã«ãŒã§ãæ°ããæ¥ç¶ãåãå
¥ããåŸãçãã¿ã€ã ã¢ãŠãã§select()
ãåŒã³åºããå Žåããããã®æ¥ç¶ãåŠçã§ããŸãã ç¹ã«è€æ°ã®ãªã¹ãã³ã°ãœã±ããã䜿çšãããšãå°ãè€éã«ãªãå¯èœæ§ããããŸãã æãç°¡åãªããšã¯ãæåã®ãã€ãã«ã¿ã€ã ã¢ãŠããèšå®ããããšã§ãã ãããSSLãšã©ã®ããã«çžäºäœçšããããããããŸããã
[1] https://cloudavail.com/2013/12/21/aws-elb-pre-open-connection-expose-part-1/
ãããçºçããŠããŠãgevent / eventlet / asyncioã䜿çšããããªãå Žåã¯ãã¹ã¬ããã¯ãŒã«ãŒã«åãæ¿ããããšããå§ãããŸãïŒ --threads
èšå®ãæå®ããŠãã ããïŒã
@tilgoviäžèšã®ç§ã®äŸãèŠããšããã®åé¡ã¯
@jmagnussonããªãã®äŸïŒãã®ã³ã¡ã³ãããïŒhttpsïŒ//github.com/benoitc/gunicorn/issues/1194#issuecomment-331740187ïŒã¯åæã¯ãŒã«ãŒã䜿çšããŠããããã§ãã
[2017-09-23 22:31:00 +0000] [1] [æ å ±]ã¯ãŒã«ãŒã®äœ¿çšïŒåæ
@tilgoviæ¬åœã§ãããç§ã¯ãããgevent
ã¯ãŒã«ãŒã§ãå®çšŒåç°å¢ã§çµéšããŸããã geventã§åçŸããæéãèŠã€ããããšæããŸãã
ããã¯ç§ïŒã°ãããŠããïŒãããããŸããããEC2ã»ãã¥ãªãã£ã°ã«ãŒã->ã€ã³ããŠã³ãã«ãŒã«ã«ã¯ãåäžã®IPïŒç§ã®IPïŒXX.XX.XX.XXïŒã®ã¿ãèš±å¯ããããŒã5000ïŒããã§ã¯gunicornïŒã®ã«ã¹ã¿ã TCPã«ãŒã«ããããŸã/ 32ïŒãããããã¹ãŠã®IPã«å€æŽãããšåœ¹ç«ã¡ãŸãã
ç§ãå°ã£ãŠããŸãã
[2018-01-02 16:38:03 +0800] [24355] [INFO] Starting gunicorn 19.7.1
[2018-01-02 16:38:03 +0800] [24355] [DEBUG] Arbiter booted
[2018-01-02 16:38:03 +0800] [24355] [INFO] Listening at: http://0.0.0.0:8080 (24355)
[2018-01-02 16:38:03 +0800] [24355] [INFO] Using worker: gevent
[2018-01-02 16:38:03 +0800] [24358] [INFO] Booting worker with pid: 24358
[2018-01-02 16:38:03 +0800] [24355] [DEBUG] 1 workers
[2018-01-02 16:38:03 +0800] [24358] [INFO] worker pid 24358 notify
[2018-01-02 16:38:04 +0800] [24358] [INFO] worker pid 24358 notify
[2018-01-02 16:38:05 +0800] [24358] [INFO] worker pid 24358 notify
[2018-01-02 16:38:06 +0800] [24358] [INFO] worker pid 24358 notify
[2018-01-02 16:38:07 +0800] [24358] [INFO] worker pid 24358 notify
[2018-01-02 16:38:08 +0800] [24358] [INFO] worker pid 24358 notify
[2018-01-02 16:38:09 +0800] [24358] [INFO] worker pid 24358 notify
[2018-01-02 16:38:10 +0800] [24358] [INFO] worker pid 24358 notify
[2018-01-02 16:38:10 +0800] [24358] [DEBUG] GET /v1/bj2/CC/uuid
[2018-01-02 16:38:10 +0800] [24358] [DEBUG] Closing connection.
[2018-01-02 16:38:41 +0800] [24355] [CRITICAL] WORKER TIMEOUT (pid:24358)
[2018-01-02 16:38:41 +0800] [24358] [INFO] Worker exiting (pid: 24358)
[2018-01-02 16:38:41 +0800] [24381] [INFO] Booting worker with pid: 24381
[2018-01-02 16:38:41 +0800] [24381] [INFO] worker pid 24381 notify
[2018-01-02 16:38:42 +0800] [24381] [INFO] worker pid 24381 notify
[2018-01-02 16:38:43 +0800] [24381] [INFO] worker pid 24381 notify
[2018-01-02 16:38:44 +0800] [24381] [INFO] worker pid 24381 notify
[2018-01-02 16:38:45 +0800] [24381] [INFO] worker pid 24381 notify
[2018-01-02 16:38:46 +0800] [24381] [INFO] worker pid 24381 notify
[2018-01-02 16:38:47 +0800] [24381] [INFO] worker pid 24381 notify
......
[2018-01-02 16:48:20 +0800] [24381] [INFO] worker pid 24381 notify
[2018-01-02 16:48:51 +0800] [24355] [CRITICAL] WORKER TIMEOUT (pid:24381)
[2018-01-02 16:48:51 +0800] [24381] [INFO] Worker exiting (pid: 24381)
[2018-01-02 16:48:51 +0800] [24703] [INFO] Booting worker with pid: 24703
[2018-01-02 16:48:51 +0800] [24703] [INFO] worker pid 24703 notify
[2018-01-02 16:48:51 +0800] [24703] [DEBUG] GET /v1/bj2/CC/uuid
[2018-01-02 16:48:51 +0800] [24703] [DEBUG] Closing connection.
ãããã°ãã°worker pid {WORKER_PID} notify
ãè¿œå ããŸããã
ãããã°ãã°ã«ãããšã
SIGTERM
ãªã©ã®ãã¹ã¿ãŒããã®ã·ã°ãã«ãåä¿¡ããŸããã ã°ã¬ãŒã¹ãã«ã¿ã€ã ã¢ãŠãã«éãããšããã¹ã¿ãŒã¯ãããSIGKILL
匷å¶çã«æ®ºããŸããPython: 3.6.3
Gevent: 1.2.2
Gunicorn: 19.7.1
RUN CMD: gunicorn --worker-class gevent --log-level debug --bind 0.0.0.0:8080 app
泚æïŒã¯ãŒã«ãŒãšããŠeventlet
ã䜿çšããå Žåã¯ãåé¡ãããŸããã
ã¡ãã£ãšæ代é ãã ãšæãã®ã§ããã®å·ãç· ãããããŸãã ç§ãå€æã§ããæåã®æ¹æ³ãšããŠã芳å¯ãããåäœã¯ãAWSã¯ã©ã·ãã¯ããŒããã©ã³ãµãŒããã¬ãªãŒãã³æé©åãå®è¡ããŠããããã§ãã ãã®æé©åã¯ãããŒããã©ã³ã·ã³ã°ã®ä»çµã¿ã«é¢ããããã¥ã¡ã³ãã«ãããšãClassic LoadBalancerã«ãã£ãŠã®ã¿å®è¡ããã®ããã°æçš¿ã«èšèŒãããŠ
@tilgovi FWIWALBã§ãããèŠãŸããã åŸæ¥ã®ããŒããã©ã³ãµãŒã䜿çšããããšã¯ãããŸããã
@tilgoviç§ãALBã®ã¿ã®ç°å¢ã§ãããç¹°ãè¿ã芳å¯ããã¯ã©ã·ãã¯ã䜿çšããããšã¯ãããŸããã§ããã ã¯ãŒã«ãŒã®ã¿ã€ã ã¢ãŠãã調æŽããŠããããã¯åŒãç¶ãçºçããŸããã
@tilgoviç§ã¯ããã«äŒããŸããã AWSã䜿çšããããšã¯ãããŸããã
誰ãããããåçŸããã®ãæäŒã£ãŠãããããããã°ããããšããªããã°ãªããŸããã ALBã§åçŸã§ãããAWS以å€ã§åçŸããæ¹æ³ãããããŸããã
@xgfoneç¬èªã®åé¡ãéãããšãã§ããŸãããã®åé¡ã®ã¿ã€ãã«ã¯ããdocker + AWSãã§ãã
誰ããAWSããŒããã©ã³ãµãŒã§ãããçµéšããŸããããDockerã¯ãããŸããã§ãããïŒ ç§ã¯å°ãæ··ä¹±ããŠããŸããç§ã¯èªããªããã°ãªããŸãã:)
ç§ã®å°è±¡ã§ã¯ããã®åé¡ã¯å®éã«ã¯Dockerã«é¢é£ããŠããããã§ãããå°ãªããšããããŒã«ã«ãã·ã³ã®Dockerå ã§è€æ°ã®gunicornåæã¯ãŒã«ãŒãå®è¡ããã®ãšãŸã£ããåãåé¡ããããŸããã
ãã®æ§æã¯ããã¢ã¡ã¿ã«ã§ãããDigital Oceanã§ä»®æ³åãããŠãããUbuntuããã³RHELãã·ã³ã§DockerããªããŠãæ£åžžã«æ©èœããŸããã
workers = 2
worker_class = 'sync'
worker_connections = 1000
timeout = 30
keepalive = 2
DockerïŒRHELããä»ã¯ãã¹ãŠåãïŒã®å éšã§ã¯ãã¯ãŒã«ãŒã¯åžžã«ã¿ã€ã ã¢ãŠãã«ãªããæ°žç¶çã«åèµ·åãç¶ããŸããã ãã®ã¹ã¬ããããã®æšå¥šäºé ãåèã«ããŠãããã«åãæ¿ããŸãããããã¯å®å šã«æ£åžžã«æ©èœããŸãã
workers = 1
threads = 8
worker_class = 'sync'
worker_connections = 1000
timeout = 30
keepalive = 2
ããããã®ã¹ã¬ãããšã¯ç¡é¢ä¿ã ãšæãããå Žåã¯ãããããåé€ããŠå¥ã®å Žæã«é 眮ããŠãã ãã;-)
æé«ãããªã¹
@tilgovi
ãã®ãšã©ãŒã¯ãarbiter.pyã murder_workers
ãŸãã murder_workers
é¢æ°ã¯ã SIG_QUEUE
ã空ã®å ŽåïŒã·ã°ãã«ã®åŸ
æ©äžãªã©ïŒã«åŒã³åºãããŸãã
次ã«ãã¿ã€ã ã¢ãŠãã«æ¯ç§å°éãããã©ããã確èªããŸãã self.alive
ããã¡ã€ã«ãæŽæ°ããself.notify
ãåŒã³åºããŠããéãgeventã¯ãŒã«ãŒã¯å¶åŸ¡ãããç¡éã«ãŒãã«ãããããæ®ãæéã¯åžžã«1ç§ãŸãã¯0ç§
ãããã£ãŠã murder_workers
é¢æ°ã®åç¶æéãã§ãã¯ã倱æããïŒããšãã°ãã¢ã€ãã«ç¶æ
ãé·ããããšèšãïŒå¯äžã®æ¹æ³ã¯ãgeventaliveããããã£ãå€æŽãããå Žåã§ãã 次ã®ã¡ãœããããããå¶åŸ¡ããŸãã
handle_quit
handle_request
ïŒæ倧ãªã¯ãšã¹ããåä¿¡ããå Žåãããã©ã«ãã§ã¯ãããã¯ãªã¯ãšã¹ãæ°ã®2 ^ 64ãããããŸãã¯32ãããOSã®å Žåã¯2 ^ 32ã§ãïŒ
changed
ïŒãã¡ã€ã«ãå€æŽãããå Žåã«ãªããŒããŒããåŒã³åºãããŸãïŒ
handle_exit
handle_abort
ãããã®ã¡ãœããã¯ã·ã°ãã«ããåŒã³åºãããŸã
handle_quit
-SIGQUITãSIGINT
handle_exit
-SIGTERM
handle_abort
-SIGABRT
ãããã£ãŠãç§ãèŠã2ã€ã®èããããåé¡ããããŸãã
ããå¯èœæ§ã®é«ãåå ã¯2çªç®ã®ãã®ã ãšæããŸãã ã·ã°ãã«ã®äž»ãªãœãŒã¹ã¯ã¢ãŒãã¿ãŒãã¡ã€ã«å ã«ããã次ã®äŸå€ã«ãã£ãŠããªã¬ãŒãããŸãã
StopIteration
KeyboardInterrupt
HaltServer
Exception
ïŒæªåŠçã®äŸå€ïŒStopIterationäŸå€ã¯ã req = six.next(parser)
ã®async.pyãã¡ã€ã«ã§ããªã¬ãŒãããåå ã§ããå¯èœæ§ãé«ããšæããŸãã ãã®æ¬¡ã®ã¡ãœããã¯ãparser.nextïŒïŒãåŒã³åºããŠããã ãã®ããã§ãã
Parser.next()
ã¯ã次ã®2ã€ã®æ¡ä»¶ã§StopIteration
äŸå€ãçºçãããŸãã
1. If the message indicates it should close:
1. http Connection close (and keep-alive false)
2. WSGI - request method not HEAD, response_length is none, and status code is > 200 (but not 204, or 304)
2. If self.mesg (Request message) is falsey
äœãæå³ããã«ãããåŒãèµ·ãããŠããã®ãæ£ç¢ºã«ã¯ããããŸãããããã®åé¡ãè€æ°ã®ã¢ããªãç°å¢ã§èŠããã62ã®ã³ã¡ã³ãã®ãã¡ãããã¯ããã«èª¿æ»ãã䟡å€ããããšæããŸããããäžåºŠéãããã¿ã€ãã«ãæ°ã«å ¥ããªãå Žåã¯ãåŽåè ãæ¹å€çã«ã¿ã€ã ã¢ãŠããããšããæ°ããå°çèŠæš¡ã®åé¡ãäœæããŸãã
ãããå床éããŠããããã®çµã¿åããããã¹ãããŠã¿ãŸãã
誰ãããããåçŸã§ãããªããžããªãäœæãããã®ã§ããã°ãããã¯åœ¹ã«ç«ã¡ãŸãããç§ã¯ããããä»é±æ«ã«ãããè¡ãããšãã§ããŸãã
ãã®åé¡ãçºçããŠããŠãAWSã䜿çšããŠããŸããã
ç§ã®ã»ããã¢ããã¯NGINX-> Dockerã³ã³ããïŒgeventã¯ãŒã«ãŒ+ DjangoãåããGunicornïŒã§ãã Gunicornã®ããã©ã«ãã®ã¿ã€ã ã¢ãŠãã䜿çšããŠããŸãã
ä»»æã®ãã³ãïŒ
ããããšãã
ããã«ã¡ã¯@davidmir ã
ç§ãåãåé¡ãæ±ããŠããŸãããã¯ãŒã«ãŒã¿ã€ããå€æŽããŠãå¹æã¯ãããŸããã§ããã è€æ°ã®ã¹ã¬ãããæã€åäžã®åæã¯ãŒã«ãŒã«åãæ¿ãããšãç§ã«ãšã£ãŠã¯ããŸããããŸããã
workers = 1
threads = 8
worker_class = 'sync'
worker_connections = 1000
timeout = 30
keepalive = 2
æé«ãããªã¹
äžèšã§ããã€ãèšåããŸãããããã®åé¡ã®ç§èªèº«ã®ãããã°ããæ確ã«ããããã«ããããã®ããã€ãã¯ã¡ã¢ãªäžè¶³ãšã©ãŒã§ãã ç¹ã«ãã¯ââãŒã«ãŒã«ãŠã³ãã1ã«å€æŽããããšã§è§£æ±ºããå Žåã
èšå®ã«æ¬¡ã®ãããªãã®ãããå Žåãããã¯Dockerã§ç¹ã«åé¡ã«ãªããŸãã
workers = multiprocessing.cpu_count() * 2 + 1
ããããã³ã³ããã§äœ¿çšã§ããã¡ã¢ãªãå¶éãããŠããŸãã åæã¯ãŒã«ãŒã¯ãè€æ°ã®æœåšçã«éãPythonã€ã³ã¿ãŒããªã¿ãŒãèµ·åããŸãã CPUæ°ã¯ã䜿çšããDockerã³ã³ãããŒãããããžã§ãã³ã°ãããã®ã§ã¯ãªãããã·ã³ã®å šäœçãªCPUæ°ã«åºã¥ããŠããããšã«æ³šæããŠãã ããã éãããã³ã³ãããŒãå®è¡ããŠããå Žåã¯ã代ããã«ããã«åºã¥ããŠã¯ãŒã«ãŒæ°ã決å®ããå¿ èŠããããŸãã
ã¢ããªã±ãŒã·ã§ã³ã«ãã£ãŠç°ãªããŸãããç§ã®ç®å®ã¯ãç¡é§ã®ãªãæ§æã§ã¯ã¯ãŒã«ãŒããã256ã¡ã¬ãã€ããå®å šã§ã¯512ã¡ã¬ãã€ãã§ãã
ã¯ã©ã·ãã¯ELBHTTPS => HTTP GunicornSyncã¯ãŒã«ãŒã䜿çšããŠåãåé¡ã«çŽé¢ããŸãã
ä»ã®äººãè¿°ã¹ãããã«ãæãç°¡åãªä¿®æ£ã¯ãããã©ã«ãã®åæã¯ãŒã«ãŒã®ä»£ããã«-k gevent
åŒæ°ã䜿çšããããš
ãããšåãåé¡ããŸã£ããæ°ããDockerã³ã³ãããŒïŒALBã®èåŸã«ããECSã§ãã¹ããããŠããïŒã§åã³çºçããã®ã確èªãããŸã£ããç°ãªãïŒããããåŸããèãããšãæããã§ããã¯ãã®ïŒè§£æ±ºçãèŠã€ããŸããïŒCloudFormationã®ã³ã³ãããŒã«ããå€ãã®ã¡ã¢ãªãå²ãåœãŠãŸãã¬ã³ãã¬ãŒãã
æšå¹Žãã®åé¡ã«æ©ãŸãããç
ãåãéã®æ ¹æ¬åå ãèŠã€ããããšã¯ã§ããŸããã§ããããä»å€ãæ°ããã³ã³ããã§ãããèŠã€ããã³ã³ãããå²ãåœãŠããããã¹ãŠã®ã¡ã¢ãªã䜿ãæãããŠããããšã«æ°ã¥ããŸããã å²ãåœãŠã2åã«ãããšããã«ãã³ã³ãããŒã¯ãã®ãšã©ãŒã®ã¹ããŒãåæ¢ããŸããïŒæçµçã«æ¶è²»ãããããå€ããå²ãåœãŠãåã§ãïŒã
https://github.com/hackoregon/civic-devops/issues/157
ããã§åæ§ã®åé¡ã«çŽé¢ããŠããŸãã ã³ãŒãã¯æ¬¡ã®ããã«åçŽã§ã
while true:
sleep(10)
ã¯ãŒã«ãŒãæ»ã¬å¯èœæ§ããããŸãïŒãã®ã³ãŒãããªããšããããã€ã¯æ£åžžã§ãïŒ
ããã¯éåžžã«äžå¯è§£ã§ããb / c sleep
ã¯ãã§ã«ããŒãããŒããéä¿¡ããã¯ãã§ãã
ãŸãããã§ã«geventã«å€æŽãããŠããã圹ã«ç«ã¡ãŸããã§ããã 誰ããäœãèããæã£ãŠããã®ã ãããïŒ
ãµã³ãã«åºåïŒ
[2018-06-16 16:00:16 +0000] [136] [CRITICAL] WORKER TIMEOUT (pid:521)
[2018-06-16 16:00:16 +0000] [136] [CRITICAL] WORKER TIMEOUT (pid:522)
[2018-06-16 16:00:16 +0000] [136] [CRITICAL] WORKER TIMEOUT (pid:523)
[2018-06-16 16:00:16 +0000] [136] [CRITICAL] WORKER TIMEOUT (pid:524)
[2018-06-16 16:00:16 +0000] [136] [CRITICAL] WORKER TIMEOUT (pid:525)
[2018-06-16 16:00:16 +0000] [524] [INFO] Worker exiting (pid: 524)
[2018-06-16 16:00:16 +0000] [521] [INFO] Worker exiting (pid: 521)
[2018-06-16 16:00:16 +0000] [523] [INFO] Worker exiting (pid: 523)
[2018-06-16 16:00:16 +0000] [522] [INFO] Worker exiting (pid: 522)
[2018-06-16 16:00:16 +0000] [525] [INFO] Worker exiting (pid: 525)
[2018-06-16 16:00:17 +0000] [531] [INFO] Booting worker with pid: 531
/usr/local/lib/python3.6/site-packages/gunicorn/workers/ggevent.py:65: MonkeyPatchWarning: Monkey-patching ssl after ssl has already been imported may lead to errors, including RecursionError on Python 3.6. Please monkey-patch earlier. See https://github.com/gevent/gevent/issues/1016
monkey.patch_all(subprocess=True)
[2018-06-16 16:00:17 +0000] [136] [DEBUG] 1 workers
[2018-06-16 16:00:17 +0000] [532] [INFO] Booting worker with pid: 532
[2018-06-16 16:00:17 +0000] [533] [INFO] Booting worker with pid: 533
/usr/local/lib/python3.6/site-packages/gunicorn/workers/ggevent.py:65: MonkeyPatchWarning: Monkey-patching ssl after ssl has already been imported may lead to errors, including RecursionError on Python 3.6. Please monkey-patch earlier. See https://github.com/gevent/gevent/issues/1016
monkey.patch_all(subprocess=True)
[2018-06-16 16:00:17 +0000] [534] [INFO] Booting worker with pid: 534
/usr/local/lib/python3.6/site-packages/gunicorn/workers/ggevent.py:65: MonkeyPatchWarning: Monkey-patching ssl after ssl has already been imported may lead to errors, including RecursionError on Python 3.6. Please monkey-patch earlier. See https://github.com/gevent/gevent/issues/1016
monkey.patch_all(subprocess=True)
[2018-06-16 16:00:17 +0000] [535] [INFO] Booting worker with pid: 535
[2018-06-16 16:00:17 +0000] [136] [DEBUG] 5 workers
ããã§æ°Žãæ¿ããŠç³ãèš³ãããŸããããç§ã®çµéšãå
±æãããã£ãã ãã§ããç§ã®ã¹ã¿ãã¯ã¯HTTP ELB > Nginx > gunicorn/gevent on EC2
ãããã»ã¹ã¯circusdã䜿çšããŠå®è¡ãããŸã
ç§ãèŠã€ããåé¡ã¯ãç§ã®djangoã¢ããªã«elastic-apmãã€ã³ã¹ãã«ã¡ã³ãããåŸãHTTPãã«ã¹ãã§ãã¯ãã»ãŒããã«å€±æãå§ããgunicornãæ°ç§åŸã«å¿çããªããªãããšã§ããã
ãã«ã¹ãã§ãã¯ã«å¯ŸããŠããã€ãã®ããŒã«ã«wrk
ãã³ãããŒã¯ãè©ŠããŸããããåæã¯1ã5人ã®ã¯ãŒã«ãŒã§çŽ300rpsãååŸããŠããŸããããgeventã¯1rpsãååŸããŸããã apmããªãã«ãããšãgeventã¯æ倧çŽ50rpsã«ãªããåæã®å¢å ã¯ç¡èŠã§ããŸãã
valgrindã§ã®å¥åŠãªã¡ã¢ãªäœ¿çšéã«æ°ã¥ããŸããã§ãããéåžžã¯gunicornã§çŽ4MBãã¯ãŒã«ãŒããã40MBã§ãã
ãšã«ããã gunicorn 19.6.0 > 19.9.0
ãšgevent 1.2.2 > 1.3.6
æŽæ°ãããšãELBãã«ã¹ãã§ãã¯ãåã³å®å®ããããŒã«ã«ã§æ倧300rpsã«ãªããŸãã APMã®ãã°ãèšé²ãããŸã§ãæå³çã«gunicorn / geventãæŽæ°ããŠããŸããã§ããããããããããšã§å¶ç¶ãçãŸããããã§ãã åœç¶ã®ããšãªãããgeventãæŽæ°ãããšæ倧ã®ããŒã¹ããåŸãããŸããããgunicornãæŽæ°ãããšããã«10ïŒ
çšåºŠè¿œå ãããããã§ããã
å€æŽãã°ããŸã 詳现ã«èª¿ã¹ãŠããŸããããããããã¡ã³ããã¯æãå¯èœæ§ã®é«ãåå ã«å ãåœãŠãããšãã§ããŸããïŒ
ãšã«ãããgunicorn 19.6.0> 19.9.0ãšgevent1.2.2> 1.3.6ãæŽæ°ãããšãELBãã«ã¹ãã§ãã¯ãåã³å®å®ããããŒã«ã«ã§ã300rpsã«ãªããŸããgeventãæŽæ°ãããšæ倧ã®ããŒã¹ããåŸãããŸããã
ãããŒãããã¯ããªãã¯ãŒã«ã§ãïŒ
ã¯ããŒãžã³ã°åé¡ã ãã°ããã®é掻åã¯ãããŸããã
FWIWãç§ã¯ãŸã ãã®åé¡ãæ±ããŠããŸã
Django 2.1.5
gunicorn 19.8.1
gevent 1.2.2
5ããŒãã®AKS1.15.7ïŒæšæºB2-2ã€ã®vcoreãš2GBã®ã¡ã¢ãªïŒ
3ã€ã®ããã/ Dockerã³ã³ãããããããã«æ¬¡ã®ãã®ããããŸãã
spec:
containers:
- name: web-container
command: ["newrelic-admin"]
args: [
"run-program",
"gunicorn",
"--limit-request-field_size=16380", # limit also specified in nginx
"--workers=3", # (2 x vcpu) + 1. vcpu < limit defined in resources
"-k=gevent",
"-b=0.0.0.0:8000",
"ourapp.wsgi",
"--timeout 60",
"--log-level=debug",
]
resources:
requests:
memory: "200Mi"
cpu: "250m"
limits:
memory: "3000Mi"
cpu: "2000m"
ããã§ããEKSãNginxãããã³NLBã§åãåé¡ãçºçããŸãã
@salmicrosoft @sinkr OKã§ãããæ°ããåé¡ãéããŠãäœãèµ·ãã£ãŠããã®ããç解ããã®ã«åœ¹ç«ã€ãã°ãæäŸããŠãã ããã ãŸããããªãã®ã¢ããªã¯äœã§ããïŒ é·ãèŠæã¯ãããŸããïŒ
ECS Fargateã§ãåãåé¡ãçºçããŸããããDocker /gunicorn.conf.pyã®ããŒãã¢ã©ã€ã/ã¿ã€ã ã¢ãŠãèšå®ãæ£ãããªãããšã«é¢é£ããŠããŸããã
ããŒãã¢ã©ã€ãïŒæªèšå®ïŒ
ã¿ã€ã ã¢ãŠã= 2
ä¿®æ£ããåã¯ãããŒã«ã«ã§å®è¡ãããŠããã³ã³ããã§æ£åžžã«æ©èœããŸãããECS Fargateã§å€±æããŸããããçŸåšã¯äž¡æ¹ã®ç°å¢ã§æ£ããæ©èœããŸãã
æãåèã«ãªãã³ã¡ã³ã
代ããã«
gevent
ã¯ãŒã«ãŒã䜿çšããŠã¿ãŠãã ãããããã§ãåé¡ã¯è§£æ±ºããŸããã