๋ฆฌ๋ ์ค ์๋ฒ์ TCP ๋คํธ์ํฌ ์ฑ๋ฅ์ ๊ฒฐ์ ์ง๋ ์ปค๋ ํ๋ผ๋ฏธํฐ ์ด์ผ๊ธฐ - 2ํธ
๋ฆฌ๋ ์ค ์๋ฒ์ TCP ๋คํธ์ํฌ ์ฑ๋ฅ์ ๊ฒฐ์ ์ง๋ ์ปค๋ ํ๋ผ๋ฏธํฐ ์ด์ผ๊ธฐ - 2ํธ ๊ด๋ จ
4. ๋คํธ์ํฌ capacity ๊ด๋ จ ํ๋ผ๋ฏธํฐ
4.1 maximum file count
๋ฆฌ๋ ์ค๋ฅผ ๋น๋กฏํ ์ผ๋ฐ์ ์ธ ์ ๋์ค์์ ์์ผ์ ๋ง์น ํ์ผ๊ณผ ๊ฐ์ ์ทจ๊ธ์ ๋ฐ์ต๋๋ค. ์ ์ฒด ์์คํ ์์ ๊ฐ์ง ์ ์๋ ํ์ผ ๊ฐ์๊ฐ ์ ํ์ด ์๋ค๋ฉด, ๋น์ฐํ ์์ผ์ ์ ์ฒด ๊ฐ์์ ์ํฅ ๋ฏธ์น ๊ฒ ์ ๋๋ค.
๋ฆฌ๋
์ค์์ ์ ์ฒด ์์คํ
์ด ๊ฐ์ง ์ ์๋ ์ต๋ ํ์ผ ๊ฐ์ ์ ํ์ 'fs.file-max
' ์ปค๋ ํ๋ผ๋ฏธํฐ์์ ์ค์ ๋ฉ๋๋ค.
ํ์ฌ ์ค์ ๊ฐ์ ํ์ธํ๋ ค๋ฉด, ์๋์ ๊ฐ์ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํฉ๋๋ค.
sysctl fs.file-max
#
# fs.file-max = 775052
์ด ๊ฐ์ ์ผ๋ฐ์ ์ผ๋ก ์ ๋นํ ํฐ ๊ฐ์ด ์ค์ ๋์ด ์์ผ๋ฏ๋ก, ์ฌ๋งํ๋ฉด ์ ๋ณผ ์ผ์ด ์์ ๊ฒ์
๋๋ค. ๋ค๋ง, ์์คํ
์ด ๊ต์ฅํ ๋ง์ ํ์ผ๊ณผ ์์ผ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ, ์ด ๊ฐ์ ์ํด ์์คํ
์ด ์ค๋์ ํ ์ ์์ผ๋ ์ฐธ๊ณ ๋ฐ๋๋๋ค. (์ด ๊ฐ์ ๋์ด๊ฐ๋ฉด open()
์์คํ
์ฝ์์ 'Too many open files
'์ ๊ฐ์ ์๋ฌ๊ฐ ๋ฐ์ ๋ ๊ฒ ์
๋๋ค.)
๋ค์ ๋งํ์๋ฉด, ์์คํ
์ ์ฒด์ ๋ํ ํ์ฉ ์์ผ ๊ฐ์๋ 'fs-file-max
' ์ปค๋ ํ๋ผ๋ฏธํฐ ์ค์ ๊ฐ์ด ์ ๋นํ ๋๊ฒ ์ค์ ๋์ด ์์ผ๋ฏ๋ก ํฐ ๋ฌธ์ ๊ฐ ์๋ฉ๋๋ค. ์ฌ์ค, ์ด๋ค ํ๋ก์ธ์ค๊ฐ ๊ฐ์ง ์ ์๋ ์์ผ ๊ฐ์ ์ ์ฝ์ ๊ทธ๋ณด๋ค๋ ํ๋ก์ธ์ค๋ณ ์ ํ ์ค์ ์ธ user limit ๊ฐ์ ์ดํด๋ด์ผ ํ ๊ฒ ์
๋๋ค. ๋ค์๊ณผ ๊ฐ์ ๋ช
๋ น์ด๋ก ์ด๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
ulimit -a
#
# core file size (blocks, -c) 0
# data seg size (kbytes, -d) unlimited
# scheduling priority (-e) 0
# file size (blocks, -f) unlimited
# pending signals (-i) 30473
# max locked memory (kbytes, -l) 64
# max memory size (kbytes, -m) unlimited
# open files (-n) 1024
# pipe size (512 bytes, -p) 8
# POSIX message queues (bytes, -q) 819200
# real-time priority (-r) 0
# stack size (kbytes, -s) 8192
# cpu time (seconds, -t) unlimited
# max user processes (-u) 30473
# virtual memory (kbytes, -v) unlimited
# file locks (-x) unlimited
์ฌ๊ธฐ์ open files๊ฐ ํ๋ก์ธ์ค๊ฐ ๊ฐ์ง ์ ์๋ ์์ผ ํฌํจ ํ์ผ ๊ฐ์์ ๋๋ค. ์ ๋น๋ ์ฆ๊ฐ์ํค๊ธฐ ์ํด์๋ ๋ค์๊ณผ ๊ฐ์ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํฉ๋๋ค.
ulimit -SHn 65535
๋ง์ ๊ฐ์์ ์์ผ์ ์ฌ์ฉํ๋ ์๋ฒ ํ๋ก๊ทธ๋จ์ ๊ตฌ๋ํ๊ธฐ ์ , ulimit
๋ช
๋ น์ด๋ก ํ๋ก์ธ์ค ๋น ์ต๋ ํ์ผ ๊ฐ์๋ฅผ ์ฆ๊ฐ์์ผ์ฃผ์ด์ผ ํ ๊ฒ ์
๋๋ค. (ํน์, ํด๋น ์ ํ๋ฆฌ์ผ์ด์
๋ก์ง๋ด์์ setrlimit()
์์คํ
์ฝ๋ก ์ด๋ฅผ ์ฆ๊ฐ์ํค๋ ๋ฐฉ๋ฒ๋ ์์ต๋๋ค.)
'fs.file-max
'์ ์ ์ฌํ ์ด๋ฆ์ 'fs.file-nr
'์ด๋ผ๋ ์ปค๋ ํ๋ผ๋ฏธํฐ๊ฐ ์๋๋ฐ, ์ฌ์ค ์ด ํ๋ผ๋ฏธํฐ๋ ์ผ๋ฐ์ ์ธ ํ๋ผ๋ฏธํฐ๊ฐ ์๋๋ผ ํ์ฌ ์ด๋ ค ์๋ ํ์ผ ํํฉ์ ๋ํ๋
๋๋ค. ์๋์ ๊ฐ์ ๋ช
๋ น์ด๋ก ํ์ฌ ํํฉ์ ์ ์ ์์ต๋๋ค.
sysctl fs.file-nr
#
# fs.file-nr = 5024 0 775052
์ธ ๊ฐ์ ๊ฐ๊ฐ ํ์ฌ ์ด๋ ค ์๋ ํ์ผ์ ์, ํ์ฌ ์ด๋ ค ์์ผ๋ ์ฌ์ฉ๋์ง ์๋ ํ์ผ์ ์, ์ด ์ ์๋ ํ์ผ์ ์ต๋ ๊ฐ์๋ฅผ ๋ปํฉ๋๋ค. ๋ฌผ๋ก ์์คํ ์ ์ฒด์ ๋ํ ์์น์ ๋๋ค.
4.2 backlogs
๋คํธ์ํฌ ํจํท์ ๊ทธ ์์ฑ๊ฐ ์ ๋ฌ, ๊ทธ๋ฆฌ๊ณ ์๋ชจ์ ์ด๋ฅด๊ธฐ๊น์ง ๋ง์ ์ฒ๋ฆฌ ๊ณผ์ ์ ๊ฑฐ์น๊ฒ ๋ฉ๋๋ค. ๊ฐ๊ฐ์ ์ฒ๋ฆฌ ๊ณผ์ ์ ํ์ดํ๋ผ๊ณ ๋ณธ๋ค๋ฉด, ๋ชจ๋ ์ฒ๋ฆฌ ๊ณผ์ ์์๋ ๊ฐ๊ฐ queue๊ฐ ์กด์ฌํ๋ค๊ณ ํ ์ ์์ ๊ฒ ์ ๋๋ค. ๋คํธ์ํฌ ํจํท ์ฒ๋ฆฌ๋์ด ๊ฐ์๊ธฐ ๊ธ์ฆํ์ ๋, ์ด queue์ ํฌ๊ธฐ๊ฐ ์ด๋ณด๋ค ์๋ค๋ฉด ๋์น๋ ํจํท์ ๋ํด์๋ ์ฒ๋ฆฌ๋์ง ์๊ณ ๋ฒ๋ ค์ง ๊ฒ ์ ๋๋ค.
์๋ฒ ์ปค๋ ์ค์ ๊ฐ์ ์์ด out-bound queue ๋ณด๋ค๋ in-bound queue๊ฐ ๋ ๋ฏผ๊ฐํ๋ฐ, ์๋ํ๋ฉด out-bound๋ก ๋ณด๋ด์ง๋ ํจํท๋์ ์๋ฒ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์กฐ์ ํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. (๊ฐ๊ฐ์ ์์ฒญ์ ๊ทธ ์ฒ๋ฆฌ ์๊ฐ์ด ๋ค๋ฅด๊ธฐ์ out-bound์ ์ ๋นํ ๋๋คํ๊ฒ ๋ถ๋ฐฐ๋๋ ํจ๊ณผ๋ ์์ต๋๋ค.) ๋, in-bound queue๊ฐ ๋์ฒ์ ๋ฒ๋ ค์ง๋ ํจํท์ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ ํ ์ ์ ์๊ธฐ ๋๋ฌธ์ ๋๊ท๋ชจ ํจํท ์ฒ๋ฆฌ๊ฐ ํ์ํ ์๋ฒ์์๋ ์ ๋นํ in-bound queue ๊ธธ์ด๋ฅผ ์ฆ๊ฐ์์ผ์ผ ํฉ๋๋ค.
๋จผ์ 'net.core.netdev_max_backlog
' ์ปค๋ ํ๋ผ๋ฏธํฐ์ ๋ํด ์์๋ด
์๋ค. ์ด ํ๋ผ๋ฏธํฐ๋ ๊ฐ ๋คํธ์ํฌ ์ฅ์น ๋ณ๋ก ์ปค๋์ด ์ฒ๋ฆฌํ๋๋ก ์์๋๋ queue์ ํฌ๊ธฐ๋ฅผ ์ค์ ํฉ๋๋ค. ์ปค๋์ ํจํท ์ฒ๋ฆฌ ์๋๊ฐ ์ด queue์ ์ถ๊ฐ๋๋ ํจํท์ ์ธ์
์๋๋ณด๋ค ๋จ์ด์ง๋ค๋ฉด ๋ฏธ์ฒ queue์ ์ถ๊ฐ๋์ง ๋ชปํ ํจํท๋ค์ ๋ฒ๋ ค์ง ๊ฒ์
๋๋ค.
์ด ์ปค๋ ํ๋ผ๋ฏธํฐ๋ trade-off ๊ด๊ณ๊ฐ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ๋ฐ์ ์์ผ๋ฏ๋ก, ์ ๋นํ ์ฆ๊ฐ์์ผ๋๋ ๊ฒ๋ ๊ด์ฐฎ์ต๋๋ค. ๋ค์๊ณผ ๊ฐ์ ๋ช ๋ น์ด๋ก ์ค์ ๊ฐ์ ์ ๋นํ ์ฆ๊ฐ ์ํฌ ์ ์์ต๋๋ค.
sysctl -w net.core.netdev_max_backlog="30000"
๊ตฌ๊ธ์์ ์ฐพ์ ์ ์๋ ๋ช ์ปค๋ ํ๋ฆฌ๋ฏธํฐ ํ๋ ๊ด๋ จ ๊ธ์๋, ์ด ์ปค๋ ํ๋ผ๋ฏธํฐ๊ฐ listen backlog๋ผ๊ณ ์๋ชป ์๊ฐ๋๊ธฐ๋ ํ๋ ๊ฒ ๊ฐ์ต๋๋ค. listen backlog, ์ฆ listen()์ผ๋ก ๋ฐ์ธ๋ฉ ๋ ์๋ฒ ์์ผ์์ accept()๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ์์ผ ๊ฐ์์ ๊ด๋ จ๋ ์ปค๋ ํ๋ผ๋ฏธํฐ๋ 'net.core.somaxconn
'์
๋๋ค. ์ด ๊ฐ์ listen() ์์คํ
์ฝ์ ๋งค๊ฐ๋ณ์๋ก ์ค์ ํ๋ backlog ๊ฐ์ hard limit์
๋๋ค. ์๋ฒ ์ ํ๋ฆฌ์ผ์ด์
์์ listen()์ ์ ๋นํ ์ค์ ํด์ผ๊ฒ ์ง๋ง, ๋จผ์ ์ด hard limit์ ์ฆ๊ฐ์์ผ์ผ ํ ๊ฒ์
๋๋ค.
๋ค์๊ณผ ๊ฐ์ ๋ช ๋ น์ด๋ก ์ด ์ค์ ๊ฐ์ ์ฆ๊ฐ ์ํฌ ์ ์์ต๋๋ค.
sysctl -w net.core.somaxconn="1024"
์ฐธ๊ณ ๋ก, ์ผ๋ฐ์ ์ธ ๋ฆฌ๋
์ค ๋ฐฐํฌํ์ ๊ธฐ๋ณธ ์ค์ ๊ฐ์ 128์
๋๋ค. ๊ทธ๋ฐ๋ฐ, ์ํ์น ์น ์๋ฒ์ ๊ฒฝ์ฐ listen()
์ ์ง์ ๋๋ backlog์ ๊ธฐ๋ณธ๊ฐ์ด 511์
๋๋ค. ํ์ง๋ง ์ด ์ปค๋ ํ๋ผ๋ฏธํฐ๊ฐ hard limit์ด๊ธฐ์ ์ ํ๋ฆฌ์ผ์ด์
์์ 511์ผ๋ก ์ง์ ๋์๋๋ผ๋ ์ค์ ๋ก ํ ๋น๋๋ listen backlog์ ์๋ 128๊ฐ๊ฐ ๋ ๊ฒ ์
๋๋ค.
๋, 'net.ipv4.tcp_max_syn_backlog
'๋ผ๋ listen backlog์ ์ฐ๊ด๋ ์ปค๋ ํ๋ผ๋ฏธํฐ๊ฐ ์์ต๋๋ค. 'net.core.somaxconn
'์ด accept()์ ๊ธฐ๋ค๋ฆฌ๋ ESTABLISHED ์ํ์ ์์ผ(์ฆ, connection completed)์ ์ํ queue๋ผ๋ฉด, 'net.ipv4.tcp_max_syn_backlog
'๋ SYN_RECEIVED ์ํ์ ์์ผ(์ฆ, connection incompleted)์ ์ํ queue์
๋๋ค.
์ด ์ค์ ๊ฐ๋ ์๋์ ๊ฐ์ด ์ ๋นํ ์ฆ๊ฐ ์ํต๋๋ค.
sysctl -w net.ipv4.tcp_max_syn_backlog="1024"
ํ๊ฐ์ง ์ ์ํ ์ ์ ์ปค๋ ํ๋ฆฌ๋ฏธํฐ ์ค์ ๊ฐ์ ์ํฅํ๋๋ผ๋, ์ค์ ์๋ฒ ์ ํ๋ฆฌ์ผ์ด์
์์ listen backlog๋ฅผ ์ฆ๊ฐ์ํค๋ ค๋ฉด listen()
์์คํ
์ฝ ํธ์ถ์ ๋งค๊ฐ๋ณ์ backlog์ ํ์ํ ๊ฐ์ ์ ๋ฌํด์ผ ํฉ๋๋ค.
4.3 port range
TCP ์ฐ๊ฒฐ์ ๋งบ์๋, ํด๋ผ์ด์ธํธ ์์ผ์ ํ๋์ ํฌํธ๋ฅผ ์ ์ ํด์ผ ํฉ๋๋ค. TCP ์ฐ๊ฒฐ์ ์ถ๋ฐ์ง(source) ์ฃผ์, ์ถ๋ฐ์ง ํฌํธ, ๋ชฉ์ ์ง(destination) ์ฃผ์, ๋ชฉ์ ์ง ํฌํธ๋ฅผ ๊ทธ ๊ตฌ๋ถ์๋ก ํ๊ธฐ ์๊ธฐ ๋๋ฌธ์
๋๋ค. ํด๋ผ์ด์ธํธ์์ ์๋ฒ๋ก ์ฐ๊ฒฐ์ ๋งบ์๋, ํน๋ณํ bind()
์์คํ
์ฝ๋ก ์ถ๋ฐ์ง ํฌํธ๋ฅผ ์ง์ (bind)ํ์ง ์๋๋ค๋ฉด, ์ปค๋์ ์์์ ํฌํธ๋ฅผ ํ ๋นํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ฌํ ํฌํธ๋ฅผ ephemeral port๋ผ๊ณ ํต์นญํฉ๋๋ค.
์ฆ, ํด๋ผ์ด์ธํธ ์์ผ์ ์๋ฒ์ ์ฐ๊ฒฐ์ ๋งบ์๋ ํฌํธ๋ผ๋ ์์์ ํ๋ ์๋ชจํ๋ฉฐ, ํฌํธ๋ ์ ํํ ์์์ด๊ธฐ์ ํ ์์คํ ์์ ๋์์ ๊ฐ์ง ์ ์๋ ํด๋ผ์ด์ธํธ ์์ผ์ ์๋ ํ์ ์ ์ ๋๋ค.
๋ฐ๋๋ก, listen()
์ผ๋ก ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๊ธฐ๋ค๋ฆฌ๊ณ ์๋ ์๋ฒ ํฌํธ๋ TCP ์ฐ๊ฒฐ์ ๋งบ์ ๋ ์ถ๊ฐ์ ์ธ ํฌํธ๋ฅผ ์๋ชจํ์ง ์์ต๋๋ค. ๋๋ฌธ์ ์ผ๋ฐ์ ์ธ ์๋ฒ์์๋ ๊ฐ์ง ์ ์๋ ํฌํธ ์์ ์๋ฒ์ ํด๋ผ์ด์ธํธ ๋์ ์ฐ๊ฒฐ ์๋ ํฌ๊ฒ ๊ด๊ณ๊ฐ ์์ต๋๋ค.
๋ค๋ง, ์๋ฒ์ ์ ํ ์ค proxy ์๋ฒ์ ๋ํด์ ์๊ฐํด ๋ณผ ํ์๊ฐ ์์ต๋๋ค. ์ฌ์ฉ์(ํด๋ผ์ด์ธํธ)๋ก ๋ถํฐ ์์ฒญ์ ๋ฐ์, ์ด๋ฅผ ๋ค๋ฅธ ๋ฐฑ์๋ ์๋ฒ์ ์ ๋ฌํ๋ ์ ํ์ ์๋ฒ๋ฅผ ๋งํ๋๋ฐ์. ์ด ๊ฒฝ์ฐ ํด๋น ์๋ฒ๋ ๋ค๋ฅธ ๋ฐฑ์๋ ์๋ฒ์ ์ฐ๊ฒฐํ๊ธฐ ์ํ ํด๋ผ์ด์ธํธ ์์ผ์ด ํ์ํฉ๋๋ค. ๋ง์ฝ, ์ฌ์ฉ์ ์์ฒญ์ด ๋์์ ๊ฐ ๋ค์ด์ค๋๋ฐ ํด๋น ์๋ฒ๊ฐ ๊ฐ์ง ์ ์๋ ํด๋ผ์ด์ธํธ ์์ผ ์๊ฐ ๋์์ ๊ฐ๋ผ๋ฉด ๊ฐ์ ์์ฒญ์ ์ฒ๋ฆฌ๋์ง ๋ชปํ๊ณ ๋๊ธฐํด์ผ ํ ๊ฒ ์ ๋๋ค.
์ด๋ค ์์คํ
์ ๋์์ ๊ฐ์ง ์ ์๋ ํด๋ผ์ด์ธํธ ์์ผ ์๋ฅผ ๊ฒฐ์ ํ๋ ์ปค๋ ํ๋ผ๋ฏธํฐ๋ 'net.ipv4.ip_local_port_range
' ์
๋๋ค. ์ปค๋์ ephemeral port๋ฅผ ์์ฑํ ๋ ์ด ๋ฒ์๋ด ์ฌ์ฉํ์ง ์๋ ํฌํธ๋ฅผ ๊ณจ๋ผ ํ ๋นํ๊ฒ ๋ฉ๋๋ค.
๋ค์๊ณผ ๊ฐ์ ๋ช ๋ น์ด๋ฅผ ํตํด ํ์ฌ ์ค์ ๊ฐ์ ํ์ธํ ์ ์์ต๋๋ค.
sysctl net.ipv4.ip_local_port_range
#
# net.ipv4.ip_local_port_range = 32768 61000
์์์ ๋ ๊ฐ์ ๊ฐ๊ฐ ์ฌ์ฉํ ํฌํธ ๋ฒ์์ ์์๊ณผ ๋์ ๋ํ๋ ๋๋ค. ์ด ์์คํ ์์๋ ์ต๋ ๊ฐ์ ephemeral port๋ฅผ ํ ๋นํ ์ ์์ต๋๋ค. ์ต๋ํ ๋์ ephemeral port ๋ฒ์๋ฅผ ๊ฐ์ง๋ ค๋ฉด ์๋์ ๊ฐ์ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. (well-known port๋ ์ ์ธ)
sysctl -w net.ipv4.ip_local_port_range="1024 65535"
๊ทธ๋ฐ๋ฐ, ์ด๋ ๊ฒ ์ค์ ํ๋๋ผ๋ ์ค์ ์์คํ ์์ ๋์์ ๊ฐ์ง ์ ์๋ ํด๋ผ์ด์ธํธ ์์ผ ์๋ ์ด์ ๋ฏธ์น์ง ๋ชปํ ์ ์์ต๋๋ค.
TCP ์ฐ๊ฒฐ์ ๊ต์ฅํ ๊ฒฐํฉ๋๊ฐ ๋ฎ์ ๋คํธ์ํฌ ํ๊ฒฝ์ ๊ฐ์ ํ๊ณ ์์ต๋๋ค. ๋๋ฌธ์ ๋คํธ์ํฌ ์ํฉ์ ์ํด ํจํท ์์๊ฐ ๋ค๋ฐ๋๊ฑฐ๋ ์ ์ค ๋๋ ๋ฑ์ ์ฒ๋ฆฌ๋ฅผ ์ํด, ์์ผ ์ข ๋ฃ์์๋ ๋๋๋ก ์ฐ์ํ๊ฒ ์ข ๋ฃ(gracefully shutdown)ํ๋๋ก ๋์ด ์๋๋ฐ์. ์ด ์๊ธฐ์ธ ์ฆ์จ, ์์ผ์ด ์ฌ์ฉํ๋ ์์์ ๋๋๋ก ๋ฆ๊ฒ ๋ฐํํ๋ค๋ ๊ฒ์ ๋๋ค. ephemeral port๋ฅผ ํฌํจํด์์.
ํนํ, ํด๋ผ์ด์ธํธ ์์ผ์์ close()
์์คํ
์ฝ๋ก ๋จผ์ ์์ผ์ ๋ซ๋ ๊ฒฝ์ฐ ์์ผ์ TIME_WAIT
์ํ์ ๋จธ๋ฌด๋ฅด๊ฒ ๋ฉ๋๋ค. ์ด ๋์ ์ด ์์ผ์ ํ ๋น๋์ด ์๋ ephemeral port๋ ์ฌ์ฉ๋ ์ ์๊ณ ๊ทธ๋งํผ ๋์์ ๊ฐ์ง ์ ์๋ ํด๋ผ์ด์ธํธ ์์ผ ์๋ ์ ํ๋๊ฒ ์ฃ .