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μ μ무 κ²λ κΈ°λ‘νμ§ μκ³ μ’ λ£νκ±°λ μ€μ¬μκ° μμ μλ₯Ό 무νλλ‘ μμ±ν μ μμ΅λκΉ?
κ·Έκ²λ€μ λμΌν λ컀 μ΄λ―Έμ§μ΄κΈ° λλ¬Έμ μ νν λμΌν μν€ν μ²μμ μ νν λμΌν μ½λλ₯Ό μ€ννκ³ μμΌλ―λ‘ μ΄κ²μ΄ 무μμΈμ§(λ²κ·Έ?) μ λ§ νΌλμ€λ½μ΅λλ€. μ΄λ€ λμμ΄λ λλ¨ν κ°μ¬ν©λλ€!
ssh
-Docker 컨ν
μ΄λμ μ
λ ₯νλ©΄ λ€μ μ€λ₯κ° λ°κ²¬λμμ΅λλ€.
Illegal instruction (core dumped)
μλ§λ gunicornμ μ€λ₯λ₯Ό μΌν€λ λμ μ΄μ κ°μ μ€λ₯λ₯Ό νλ©΄νν΄μΌ ν κΉμ, μλλ©΄ λ€λ₯΄κ² μ²λ¦¬ν΄μΌ ν κΉμ? νμ€νμ§ μμ΅λλ€. λ€λ₯Έ μ¬λμκ² λμμ΄ λ μ μκΈ° λλ¬Έμ μ΄κ²μ μ¬λ¦΄ κ²μ΄λΌκ³ μκ°νμ΅λλ€!
λ¬Έμ λ₯Ό μ κ³ ν΄ μ£Όμ μ κ°μ¬ν©λλ€!
μ΄λμ μ΄λ° μΌμ΄ λ°μνλμ§ μ μ μλ€λ©΄ λ§€μ° λμμ΄ λ κ²μ λλ€.
μμ μκ° μ’ λ£ν λ λ‘κΉ μ μΆκ°ν μ μμ΅λλ€. μΌλ°μ μΌλ‘ μμ μ μ체λ κΈ°λ‘νμ§λ§ λ§€μ° κ°μκΈ° μ’ λ£λλ©΄ κΈ°λ‘λμ§ μμ΅λλ€.
κ±±μ λ§!
μ΄ μ€λ λμ λ°©κΈ μΆκ°ν Spacyμ λ¬Έμ κ° μλ κ² κ°μ΅λλ€. https://github.com/explosion/spaCy/issues/1589
μ΄μ¨λ strace
νμΈνλ λλ‘ SIGILL
strace
κ° λ°μν©λλ€.
--- 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
μ’μ μ리! λν μ’ λ£ μ½λκ° μμ½λ μ’ λ£ μ½λ(μ: μ΄ κ²½μ°)κ° μλ κ²½μ° μ€λͺ μμ΄ κΈ°λ‘λ μ μμΌλ©΄ λ©μ§ κ²μ΄λ―λ‘ μμ μκ° μ€μ λ‘ μ’ λ£λκ³ μμμ΄ λΆλͺ ν©λλ€.
λλ λΉμ·ν λ¬Έμ κ° μμ΅λλ€. gunicornμ http μμ²μ ν λ νμ μλ‘μ΄ μμ μλ₯Ό λΆν ν©λλ€. λλ μ΄λ€ μλ΅λλ°μ§ λͺ»νκ³ νμ μλ‘μ΄ μμ μλ₯Ό μ¬λΆν ν©λλ€. λ http μμ²μ μΆμ λ‘κ·Έ:
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
λ‘ μ€μ ν΄λ λμμ΄ λμ§ μμ΅λλ€.
μμ μ λ‘λμμ AWS S3μμ λ°μ΄ν°λ₯Ό λ€μ΄λ‘λνκ³ μμ΅λλ€. λ€μν νμΌμ λ€μ΄λ‘λνλ λ° μ½ 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 κ°μ¬ν©λλ€.
μ΄μ μμ μκ° μ€μ λ‘ μ’ λ£λ©λκΉ, μλλ©΄ μ¨λΌμΈ μνλ‘ μ μ§λκ³ μ μμ μκ° μμ±λ©λκΉ? λλ²κ·Έ λ‘κ·Έλ λν 무μμ 보μ¬μ€λκΉ?
λ‘κ·Έλ botocore λ‘κ·Έμ νΌν©λμ΄ μμ§λ§ μ΄λ μ΅λλ€.
[INFO] Booting worker with pid: a
[INFO] Booting worker with pid: b
[INFO] Booting worker with pid: c
κ·Έλ¬λ λ
Έλμλ μ£½μμ λΉνμ΅λκΉ? ps ax|grep gunicorn
λͺ
λ Ήμ λ°ννλ κ²μ 무μμ
λκΉ?
@benoitc
κ·Έλ¬λ ν κ°μ§ μ§λ¬Έμ μμ
μ μ νμ΄ 1λ‘ μ€μ λμ΄ μμ λ 2κ°μ gunicorn
νλ‘μΈμ€κ° νμλλ μ΄μ μ
λλ€. μ£ΌμΈμ ν μ¬λμ΄κ³ μΌκΎΌμ ν μ¬λμ
λκΉ?
1κ°μ μ€μ¬μ νλ‘μΈμ€(λ§μ€ν°)μ Nκ°μ μμ μ νλ‘μΈμ€κ° μμ΅λλ€.
κ·Έλμ μμ μκ° λΆν ν λλ§λ€ λͺ λ Ήμ μ€νν©λκΉ? κ·Έλ λ€λ©΄ μ΄μ μμ μκ° μ£½κ³ μ μμ μκ° μμ±λλ κ² κ°μ΅λλ€. μ‘°μ¬νκ² μ΅λλ€.
@ sara-02 λ§μ§λ§μΌλ‘ λ컀μμλ λ°μν©λκΉ?
@benoitc on docker-compose
μμλλ‘ μλνμ§λ§ Openshift
μ λμΌν μ½λλ₯Ό μ
λ ₯νλ©΄ μ΄ μ€λ₯κ° νμλ©λλ€. λ©λͺ¨λ¦¬ μꡬ μ¬νμ λ리면 μμ λμμ§λ§ docker-compose
λ₯Ό ν΅ν΄ μμ© νλ‘κ·Έλ¨μ μ€νν λ limited
λ―Έλ§μ λ©λͺ¨λ¦¬λ₯Ό μ¬μ©νκ³ μμ΅λλ€.
κ·Έλ₯ μ λ°μ΄νΈ, λμκ² λ¬Έμ λ μ€μ λ‘ λ©λͺ¨λ¦¬ μ€λ₯μμΌλ©° λ©λͺ¨λ¦¬ λ¬Έμ κ° μμ λλ©΄ μμ λμμ΅λλ€.
@benoitc
λ컀μμ 5κ°μ gunicorn μμ
μλ₯Ό μμ±νλ λμ λμΌν λ¬Έμ μ μ§λ©΄νκ³ μμ΅λλ€.
@sara-02
λ©λͺ¨λ¦¬ μ€λ₯μ μμΈμ μ΄λ»κ² μλ³νμ΅λκΉ?
@gulshan-gaurav 2κ°μ§ λμμ΄ λμμ΅λλ€.
λ΄ Podμ ν λΉλ λ©λͺ¨λ¦¬λ₯Ό λλ¦¬κ³ μΆ©λμ λ©μ·μ΅λλ€. λμ§Έ, Openshift Zabbix λ‘κ·Έλ₯Ό νμΈνμ΅λλ€.
@sara-02
λ΄ μ€ν
μ΄μ§ ν¬λμμλ λ©λͺ¨λ¦¬μ λ‘λνλ νμΌ + λͺ¨λΈμ΄ 50Mbμ΄λ―λ‘ 2GBμ λ©λͺ¨λ¦¬λ 5λͺ
μ μμ
μμκ² μΆ©λΆν΄μΌ ν©λλ€.
@gulshan-gaurav μ΄λ€ λ¬Έμ μ μ§λ©΄ν΄ μμ΅λκΉ? κ±°κΈ°μ 5 κ°μ νλ‘μΈμ€κ° μμΌλ©΄ μ’μ 보μ λλ€ ....
λλ κ°μ λ¬Έμ κ° μμλ€. μ νν λ¬Έμ λ₯Ό μ°Ύμ§ λͺ»νμ§λ§ python 3.5μμ 3.6μΌλ‘ μ κ·Έλ μ΄λνλ©΄ ν΄κ²°λμμ΅λλ€.
Docker 컨ν μ΄λμμ λμΌν λ¬Έμ μ μ§λ©΄νκ³ μμ΅λλ€. Gunicornμ μ€ν¨λ₯Ό μ λ°νμ§λ§ μμΈ λλ μ€λ₯κ° μλ μλν¬μΈνΈλ₯Ό νΈμΆν λλ§λ€ Gunicornμ λ‘κ·Έ νμΌμ μΆλ ₯ν λλ§λ€ μ μμ μλ₯Ό κ³μ 보ν ν©λλ€. λ΄κ° μΈμνλλ‘ μ νν νλͺ©μ΄ κΈ°λ‘λ λ€μ κ°μκΈ° λ‘κ·Έ νμΌμ "Booting worker with pid..."λΌκ³ νμλ©λλ€.
λμμ΄ λ ν λ¨κ³λ νκ²½ λ³μ PYTHONUNBUFFEREDλ₯Ό μΆκ°νλ κ²μ λλ€. κ·Έ μ μλ μΈμλ¬Έμ‘°μ°¨λ μ¬λΌμ§κ³ 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 λλ²κ·Έ
μ΄λ―Έ Python 3.6μ μ€ν μ€μ΄κ³ λ©λͺ¨λ¦¬μ λ¬Έμ κ° μλμ§ νμΈνμ΅λλ€.
νΈμ§: Gunicornμ μλͺ»μ΄ μλλΌ Python λ¬Έμ μΈ κ² κ°μ΅λλ€. μΌλΆ λ²μ λΆμΌμΉλ‘ μΈν΄ νΉμ μμ μ μννλ λμ Pythonμ΄ νμ μμ΄ μ£½μμ΅λλ€.
μμ
μ λ
Έλκ° κ³μ λμ€λ λΉμ·ν λ¬Έμ μ μ§λ©΄νκ³ μμ΅λλ€.
Booting worker with pid: 17636
. μ΄μ μμ
μ λ
Έλλ₯Ό μ£½μ΄κ³ μλμ§ λλ μ΄μ μμ
μ λ
Έλκ° μ¬μ ν μ‘΄μ¬νλμ§ λͺ¨λ₯΄κ² μ΅λλ€. κ·Έλ¬λ gunicorn λͺ
λ Ήμ€ μΈμμ μΈκΈλ μμ
μμ μλ 3 - -workers=3
ν©λλ€. λν νμ΄μ¬ λ²μ 3.7μ μ¬μ©νκ³ μμ΅λλ€.
scikit-learn μ’ μμ±μ΄ μΌμΉνμ§ μμμ§λ§ μ΄λ₯Ό ν΄κ²°ν νμλ μ¬μ ν λμΌν 무ν μμ μκ° λ°μν©λλ€. μ΄λ€ μ’ λ₯μ python λ²μ λΆμΌμΉλ₯Ό μ°Ύκ³ μλ³νλ λ°©λ²μ 무μμ λκΉ?
OpenShift λ΄μμ λμΌν λ¬Έμ μ μ§λ©΄νκ³ μμ΅λλ€.
μ΄λ―Έμ§μμ λ³Ό μ μλ―μ΄ μ λ 6λͺ
μ μμ
μλ₯Ό μ¬μ©νκ³ μμ΅λλ€(3κ°λ‘ μλνμ΅λλ€).
ν¬λμ λ©λͺ¨λ¦¬λ₯Ό λλ Έλλ° μλνμ§ μμ΅λλ€.
λΉλ ꡬμ±:
μ΄λ€ μμ΄λμ΄λΌλ?
κ°μ¬ ν΄μ
elb λ€μ awsμμ μ΄κ²μ μ€ννκ³ μμ΅λκΉ? elbμ gunicorn μ¬μ΄μ nginx ingressλ₯Ό λ£μ΄ κ·Έ λ¬Έμ λ₯Ό ν΄κ²°νμ΅λλ€.
κ°μ λ¬Έμ κ° μμ΅λλ€.
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
μ΄λ€ λ컀 μ΄λ―Έμ§λ₯Ό μ¬μ©ν©λκΉ?
@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 μμ€μμλ§ 'Worker exiting'μ΄ λ°μνλ μ΄μ λ 무μμ λκΉ? μ€λ₯κ° λ°μν κ²½μ°λ₯Ό μ μΈνκ³ μμ μκ° μ’ λ£λλ μ΄μ λ 무μμ λκΉ? λ΄ μμ μ μ€λ λκ° μμ€ν OOM ν¬λ¬μ μν΄ μ£½μμ λΉνκ³ μλ€λ μ¬μ€μ νμΈνλ λ° μ€λ μκ°μ΄ κ±Έλ Έμ΅λλ€. μμ λ€λ₯Έ μ¬λλ€μ΄ λ³΄κ³ ν κ²μ²λΌ λλλ‘ 'pidλ‘ μμ μ λΆν 'μ μ μΈνκ³ λ‘κ·Έμλ μ무 κ²λ μμ΅λλ€.
μμ
μκ° μ’
λ£νλ κ²μ΄ λ°λμ μ€λ₯λ μλκΈ° λλ¬Έμ --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
λͺ¨λ κ²μ λ λ°°λ‘ λ리면 λ¬Έμ κ° ν΄κ²°λμμ΅λλ€.
ν κ°μ§ ν₯λ―Έλ‘μ΄ μ μ νΈμ€νΈ μμ€ν
μμ dmesg
λ₯Ό λ³Ό λ SSLμ μ¬μ©νμ¬ μλ²μ μ‘μΈμ€ν λ segfault
-ing at libcrypto
μμ μ μ μλ€λ κ²μ
λλ€.
λ©λͺ¨λ¦¬μ ν° λͺ¨λΈμ λ‘λνμ§ μκΈ° λλ¬Έμ λ©λͺ¨λ¦¬λ λ¬Έμ κ° λμ§ μλ κ² κ°μ΅λλ€. μμ μκ° κ³μ μΆ©λνκ³ μ€λ₯ λ©μμ§κ° νμλμ§ μμ΅λλ€. μ΄μ λν μμ μ¬νμ΄ μμ΅λκΉ?
λμκ² κ°μ λ¬Έμ , κ³ μΉ μκ°μ΄ μμ΅λκΉ? gunicorn 19.9.0μ΄ ν¬ν¨λ python 3.6.3
@MrKiven λΉμ μ μ±μ 무μμ ν©λκΉ? μμ²κ³Ό κ°μ κ²μ μ¬μ©νκ³ μμ΅λκΉ?
λκ΅°κ° λ¬Έμ λ₯Ό μ¬ννλ λ°©λ²μ μ 곡ν μ μμ΅λκΉ?
νμ΄νλΌμΈμμ μ€νλλ μ¬λ¬ κ΅¬μ± μμμ κ΄λ¦¬μμ λλ€. κ·Έλ€ μ€ μΌλΆλ λμΌν μμ€ν λλ μ격 μμ€ν μ λ€λ₯Έ κ΅¬μ± μμμ λν HTTP μμ²μ μμν μ μμ΅λλ€. νμ΄νλΌμΈμ μΌλΆ λͺ¨λμ λ³λ ¬λ‘ μ€νν μ μμ§λ§ ThreadPoolExecutorλ₯Ό μ¬μ©νμ¬ μ€νλ©λλ€. 곡μ κ°μ²΄λ₯Ό μ¬μ©νμ§ μμ§λ§ λμ€μ λ¨μΌ κ²°κ³Όλ‘ μ§κ³λλ λ°μ΄ν° κ΅¬μ‘°λ§ μμ±ν©λλ€.
λΆννλ μ°λ¦¬κ° κ°μ§κ³ μλ μμ€ν μ λ ΈμΆνμ§ μκ³ μ΅μνμ μλ₯Ό λ§λ€ μ μλμ§ νμ ν μ μμ΅λλ€.
μμ²μ λλλ‘ μ νλ‘μΈμ€λ₯Ό λΆκΈ°νλ μ€λ λλ‘ λ§μ μμ νμ§ μμ μμ μ μνν©λλ€. λ€λ₯Έ ν΄λΌμ΄μΈνΈλ₯Ό μ¬μ©νλ κ²μ΄ μ’μ΅λλ€. μμ²μ μννλ λ° μ¬μ©νλ μ΅μν μ€μ λΆμ¬λ£μ μ μμ΅λκΉ? μκ° μ΄κ³Ό κΈ°λ₯μ μ¬μ©νκ³ μμ΅λκΉ?
κ·Έ μ€ νλλ λ€μκ³Ό κ°μ΅λλ€.
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μ 보λ΄μ΄ μ€μ λ‘ μ¬λ°λ₯Έ κ²μ μμ νκ³ μλμ§ νμΈν μ μλ€λ©΄ μ λ§ μ’μ κ²μ λλ€.
λκ΅°κ°λ₯Ό λμΈ μ μλμ§ νμ€νμ§ μμ§λ§ dockerized flask webappμ μ€ννλ λμ λμΌν λ¬Έμ κ° λ°μνμ¬ dockerfileμ κΈ°λ³Έ μ΄λ―Έμ§λ₯Ό python:3.6.9-alpine
μ
λ°μ΄νΈνμ¬ ν΄κ²°νμ΅λλ€.
νΈμ€νΈμ Dmesgλ lilibpython3.6m.so.1.0μμ segfaultλ₯Ό νμνμ΅λλ€.
[626278.653010] gunicorn[19965]: segfault at 70 ip 00007f6423e7faee sp 00007ffc4e9a2a38 error 4 in libpython3.6m.so.1.0[7f6423d8a000+194000]
λ΄ λ컀 μ΄λ―Έμ§λ python:3.6-alpine
κΈ°λ°μΌλ‘ apk update
λ₯Ό μννμ΅λλ€.
λ§νλ―μ΄ κΈ°λ³Έ μ΄λ―Έμ§λ₯Ό 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
λΉμ·ν λμ μ νκ³ μκ³ λκ΅°κ°κ° λλ₯Ό λμΈ μ μλ€λ©΄ κ°μ¬ν κ²μ
λλ€.
μ΄κ²μ΄ λ΄κ° κ°μ§ κ²μ
λλ€.
" 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/djangoproject /bin/gunicorn - ββ4868 /home/bright/djangoprojectdir/djangoprojectenv/bin/python /home/bright/djangoprojectdir/djangoprojectenv/bin/gunicorn - ββ4869 /home/bright/djangoprojectdir/djangoprojectenv/home/bin/pyth /bright/djangoprojectdir/djangoprojectenv/bin/gunicorn - 2μ 24μΌ 07:48:04 ubuntu-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:05 ubuntu-s-1vcpu-1gb-nyc1-01 gunicorn[4846]: [2020-02-24 07:48:05 +0000] [4846] [INFO] gunicorn μμ 20.0.4 2μ 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:05 ubuntu-s-1vcpu-1gb-nyc1-01 gunicorn[4846]: [2020-02-24 07:48:05 +0000] [4846] [INFO] μμ μ μ¬μ©: sync 2μ 24 07:48:05 ubuntu-s-1vcpu-1gb-nyc1-01 gunicorn[4846]: [2020-02-24 07:48:05 +0000] [4866] [INFO] pidλ‘ μμ μ λΆν : 4866 Feb 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 λΌμΈ 1-20/20(μ’ λ£)" μ΄ λ¬Έμ λ₯Ό ν΄κ²°νλ λ° λμμ μ€ μ μλ μ¬λμ΄ μμ΅λκΉ?
@BrightNana dmesg
μ μ£Όκ³ gunicorn μ€λ₯κ° μλμ§ νμΈν μ μμ΅λκΉ?
dmesg | grep gunicorn
λ λ€λ₯Έ μ€λ₯λ₯Ό νν°λ§νλ λ° λμμ΄ λ μ μμ΅λλ€.
μλ
νμλκΉ,
λλ gunicornμ systemd μλΉμ€λ‘ μ 곡νκ³ μΆμ λ λ°λΉμ 9μ κ°μ λ²κ·Έκ° μμ΅λλ€. 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]
μ κ²½μ°μλ segfaultκ° geventμ μν΄ λ°μνλ κ²μ λ³Ό μ μμ΅λλ€. μ΄μν μ μ μ΄ μ»¨ν μ΄λκ° 5μΌ μ μ μ λλ‘ μλνμΌλ©° κ·Έ μ΄νλ‘ μ½λκ° λ³κ²½λμ§ μκ³ λΌμ΄λΈλ¬λ¦¬μ λ²μ μ΄ λ³κ²½λμ§ μκ³ λͺ¨λ νΉμ 릴리μ€λ‘ μ€μ λμλ€λ κ²μ λλ€. λ€λ₯Έ μ’ μμ±μ λ²μ μ μ½κ° λ³κ²½νμ μ μλ μ’ μμ±μΌλ‘ flask-mailμ μ κ±°νμ΅λλ€.
gevent==1.5.0μμ gevent==20.9.0μΌλ‘ μ λ°μ΄νΈνλ©΄ λ¬Έμ κ° ν΄κ²°λμμ΅λλ€.
@ifiddes κ·νμ λ¬Έμ λ κ΄λ ¨μ΄ μμ μ μμ΅λλ€. μ΅μ λ²μ μ greenletκ³Ό μ΄μ λ²μ μ gevent κ°μ ABI νΈνμ± λ¬Έμ κ° λ°μνμ΅λλ€. https://github.com/python-greenlet/greenlet/issues/178 μ°Έμ‘°
μ, κ°μ¬ν©λλ€ @jamadden. μ΄ κ²μλ¬Όμ λΆν μμ μμ 무ν μμ±μ κ²μν λ μ°Ύμ μ μλ μ λΆμμ§λ§ ν΄λΉ λ¬Έμ μ ν΄λΉ λ¬Έμ μ νμ΄λ°μ΄ λ΄ λ¬Έμ μ λ§μ΅λλ€.
Ubuntu 20.04 Server κ° μλ μ 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μ μ΅μ λ²μ μΌλ‘ μ λ°μ΄νΈνμ¬ ν΄κ²°λμμ΅λλ€.
μ΄λ¬ν μ νμ μμΈλ νμ΄μ¬ λ‘κ·Έλ₯Ό μμ±νμ§ μκ³ μ‘μ μ μμΌλ©° μ’ λ£ μ½λ 0μ λ°ννκ³ λ°μ μ μμ€ν μ μ€λ¨μν¬ μ μμΌλ―λ‘ κ΄λ¦¬νκΈ°κ° μλΉν μ΄λ ΅μ΅λλ€.
λλ gunicornμ΄ μ΄λ¬ν νΉμ±μ λΉ λ₯Έ μΆ©λ λ°λ³΅μ κ°μ§νκ³
μλ§λ max_consecutive_startup_crashes
μ΄κ³ κΈ°λ³Έκ°μ num_workers * 10 μ
λκΉ?
#2504μμ ν¬λμ 루ν κΈ°λ₯ μμ²μ μΆμ ν΄ λ³΄κ² μ΅λλ€. #2315μ μΆκ° λ‘κ·ΈμΈμ μν PRλ μμ΅λλ€. λͺ¨λ μ¬λμ΄ λ¬Έμ λ₯Ό λλ²κΉ ν κ² κ°κΈ° λλ¬Έμ μ΄ λ¬Έμ λ₯Ό λ«κ² μ΅λλ€. μ΄μ μμΌλ‘ λ€λ₯Έ μ¬λλ€μ λκΈ° μν λͺ κ°μ§ κΈ°λ₯ μμ²κ³Ό κ°μ μ¬νμ΄ μμ΅λλ€. κ°μ¬ν©λλ€!
κ°μ₯ μ μ©ν λκΈ
κ·Έλ₯ μ λ°μ΄νΈ, λμκ² λ¬Έμ λ μ€μ λ‘ λ©λͺ¨λ¦¬ μ€λ₯μμΌλ©° λ©λͺ¨λ¦¬ λ¬Έμ κ° μμ λλ©΄ μμ λμμ΅λλ€.