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ã€ã¡ãŒãžã§ããããããŸã£ããåãã¢ãŒããã¯ãã£ã§ãŸã£ããåãã³ãŒããå®è¡ããŠããã®ã§ããããäœã§ãããã¯æ¬åœã«æ··ä¹±ããŠããŸãïŒãã°ïŒïŒã ã©ããªå©ãã§ã倧æè¿ã§ãïŒ
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
ãã ãã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
ã¡ã¢ãªãšã©ãŒã®åå ãã©ã®ããã«ç¹å®ããŸãããïŒ
@ 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å ã§ãåãåé¡ã«çŽé¢ããŠããŸãã
ç»åã§ãããããã«ãç§ã¯6人ã®ã¯ãŒã«ãŒã䜿çšããŠããŸãïŒ3人ã§è©ŠããŠããŸããïŒã
ãããã®ã¡ã¢ãªãå¢ãããŸããããæ©èœããŸããã
BuildConfigïŒ
äœãæ¡ãïŒ
ããããšã
ãšã«ãã®åŸãã§ããã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ã䜿çšããŠãµãŒãã«ã¢ã¯ã»ã¹ãããšã
倧ããªã¢ãã«ãã¡ã¢ãªã«ããŒãããŠããªãã®ã§ãã¡ã¢ãªã¯ç§ã«ãšã£ãŠåé¡ã§ã¯ãªãããã§ãã ã¯ãŒã«ãŒãã¯ã©ãã·ã¥ãç¶ããã ãã§ããšã©ãŒã¡ãã»ãŒãžã衚瀺ãããŸããã ããã«å¯Ÿããä¿®æ£ã¯ãããŸããïŒ
ç§ã«ãšã£ãŠåãåé¡ãä¿®æ£ããã¢ã€ãã¢ã¯ãããŸããïŒ 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ïŒã³ã³ããåãããŠããªãïŒã§çªç¶èµ·ãããŸããã
ç§ãå©ããã®ã¯ïŒ
brew install openssl
~/.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ãå¢ãããªããç¡éã«åèµ·åããŠããŸããã
åé¡ã¯ç§ã«ãšã£ãŠã¡ã¢ãªé¢é£ã§ãããDockerã«èš±å¯ãããã¡ã¢ãªãå¢ãããšãã¯ãŒã«ãŒãå¹æçã«çæãããŸããã
@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ããã®æ§è³ªã®æ¥éãªã¯ã©ãã·ã¥ã«ãŒããæ€åºãã
ããããmax_consecutive_startup_crashes
ãããã©ã«ãã¯num_workers * 10ã§ããïŒ
ïŒ2504ã§ã¯ã©ãã·ã¥ã«ãŒãæ©èœã®ãªã¯ãšã¹ãã远跡ããŸãããã ïŒ2315ã«è¿œå ã§ãã°ã€ã³ããããã®PRããããŸãã 誰ããåé¡ããããã°ããããã§ãå°æ¥çã«ä»ã®äººãå©ããããã«ããã€ãã®æ©èœèŠæ±ãšæ¹åããããŸãã®ã§ããã®åé¡ãéããŸãã ã¿ããªãããããšãïŒ
æãåèã«ãªãã³ã¡ã³ã
åãªãæŽæ°ã§ãããç§ã«ãšã£ãŠã®åé¡ã¯å®éã«ã¯ã¡ã¢ãªãšã©ãŒã§ãããã¡ã¢ãªã®åé¡ãä¿®æ£ããããšãã«ä¿®æ£ãããŸããã