Thread
Process์ ์์
์ Thread ๋จ์๋ก ๋๋ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ CPU Core๊ฐ Thread ๋จ์๋ก ์์
์ ์ฒ๋ฆฌํ๊ฒ ๋๋ค.
๊ฒฐ๋ก ์ ์ผ๋ก Thread๋ CPU Core์ ์คํ ๋จ์์ด๋ค.
Thread๋ฅผ ์ฌ์ฉํจ์ผ๋ก์ ํ๋์ Process์์ ๋ ๊ฐ์ง ์ด์์ ์์ ์ ๋์์ ์คํ ๊ฐ๋ฅํ๊ฒ ๋๋ค.
Thread๋ฅผ ๋จ์ํ๊ฒ ์ฌ์ฉํ ๋ ๋ฌธ์ ์
์๋ก์ด ์์ฒญ์ด ๋ค์ด์ฌ ๋๋ง๋ค ์๋ก์ด Thread๋ฅผ ์์ฑํ๋ค๊ณ ๊ฐ์ ํ๊ณ ๋ฌธ์ ์ ์ ์๊ฐํด๋ณด์.
์์ฑ ๋น์ฉ์ด ํฐ Thread
Thread๋ ์์ฑ ๋น์ฉ์ด ํฌ๋ค. ๋ฐ๋ผ์ ํด๋น ๋ฐฉ์์ผ๋ก๋ ์์ฒญ์ ๋ํ ์๋ต์๊ฐ์ด ๋์ด๋ ์ ๋ฐ์ ์๋ค.
์๋ ๊ทธ๋ฆผ์ ๋ณด๋ฉด์ ๋ ์์ธํ๊ฒ ์์๋ณด์.
- Java๋ One-to-One Threading-Model๋ก Thread๋ฅผ ์์ฑํ๋ค.
- User Thread(Process์ ์ค๋ ๋) ์์ฑ์ OS Thread(OS ๋ ๋ฒจ์ ์ค๋ ๋)์ ์ฐ๊ฒฐํ๋ค.
- ์๋ก์ด Thread๋ฅผ ์์ฑํ ๋ ๋ง๋ค OS Kernel์ ์์ ์ด ํ์ํ๋ค.
- Thread๋ ์์ฑ ๋น์ฉ์ด ํฌ๋ค.
- ์์ ์์ฒญ์ด ๋ค์ด์ฌ ๋ ๋ง๋ค Thread๋ฅผ ์์ฑํ๋ฉด ์ต์ข ์ ์ธ ์์ฒญ ์ฒ๋ฆฌ ์๊ฐ์ด ์ฆ๊ฐํ๋ค.
Thread๊ฐ ๋๋ฌด ๋ง์ผ๋ฉด ์ฌ๋ฌ ๋ณตํฉ์ ์ธ ๋ฌธ์ ๋ฐ์
๋ง์ฝ Process์ ์ฒ๋ฆฌ ์๋๋ณด๋ค ๋น ๋ฅด๊ฒ ์์ฒญ์ด ๋ค์ด์ค๋ฉด ์๋ก์ด Thread๊ฐ ๋ฌด์ ํ์ ์ผ๋ก ๊ณ์ ์์ฑ๋ ๊ฒ์ด๋ค.
๊ทธ๋ฆฌ๊ณ Thread๊ฐ ๋ง์ ์ง์๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ง์ด ์ฐจ์งํ๊ณ Context-Switching์ด ๋ ์์ฃผ ๋ฐ์ํ๋ค.
์ด๋ฌํ ๋ฌธ์ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ฑฐ๋ CPU ์ค๋ฒํค๋๊ฐ ๋ฐ์ํ ์ ์๋ค.
Thread Pool๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด๋ณด์
Thread Pool์ด๋ Thread๋ฅผ ํ์ฉ๋ ๊ฐ์ ์์์ ์ฌ์ฉํ๋๋ก ์ ํํ๋ ์์คํ ์ด๋ค.
ํ๋ฒ ์ฌ์ฉ๋ Thread๋ ์์ ์ด ๋๋๊ณ ์์ด์ง์ง ์๊ณ ์ฌ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค๋ ํน์ง์ด ์๋ค.
์ค๋ ๋ ํ์ ํฌ๊ฒ ์ค๋ ๋, ์์ ํ ๋๊ฐ์ง๋ก ์ด๋ฃจ์ด์ ธ ์๋ค.
๊ฐ๋จํ๊ฒ ์์ ํ๋ฆ์ ๋ณด์.
- ์ค๋ ๋ํ์ ์์ ์ฒ๋ฆฌ๋ฅผ ์์ฒญ
- ์์ ํ์ offer
- ์์ ํ์์ pollํ์ฌ ๊ฐ ์ค๋ ๋๋ก ์์ ์ ๋ณด๋ด๊ณ , ์ค๋ ๋๋ ์์ ์ ์ฒ๋ฆฌํจ
- ๊ฒฐ๊ณผ ์ ๋ฌ
๊ทธ๋์ Thread Pool์ด ์์ ๋งํ๋ ๋จ์ํ๊ฒ Thread๋ฅผ ์ด์ฉํ์ ๋์ ๋ฌธ์ ๋ฅผ ์ด๋ป๊ฒ ํด๊ฒฐํ๋์ง ์์๋ณด์.
1. ์์ ์์ฒญ์ด ๋ค์ด์ฌ ๋๋ง๋ค Thread๋ฅผ ์์ฑํจ์ผ๋ก์จ ์ต์ข ์์ฒญ ์ฒ๋ฆฌ ์๊ฐ์ด ์ฆ๊ฐํ๋ค๋ ๋ฌธ์
-> โ ํด๊ฒฐ: ๋ฏธ๋ฆฌ ๋ง๋ค์ด ๋ Thread๋ฅผ ์ฌ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ ์๋ก์ด Thread๋ฅผ ์์ฑํ๋ ๋น์ฉ์ ์ค์ผ ์ ์๋ค.
2. ๋ฉ๋ชจ๋ฆฌ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ฑฐ๋ CPU ์ค๋ฒํค๋๊ฐ ๋ฐ์ํ๋ ๋ฌธ์
-> โ ํด๊ฒฐ: ์ฌ์ฉํ Thread ๊ฐ์๋ฅผ ์ ํํ๊ธฐ ๋๋ฌธ์ ๋ฌด์ ํ์ ์ผ๋ก ์ค๋ ๋๊ฐ ์์ฑ๋์ง ์์ผ๋ฏ๋ก ๋ฐฉ์ง ๊ฐ๋ฅํ๋ค.
๋ฐ๋ผ์, ์ฌ๋ฌ๊ฐ์ ์์ ์ ๋์์ ์ฒ๋ฆฌํ๋ฉด์ ์์ ์ ์ผ๋ก ์ฒ๋ฆฌํ๊ณ ์ถ์ ๋ Thread Pool์ด ํจ๊ณผ์ ์ด๋ค.
Java์ Thread Pool์ ๊ตฌ์ฑ
Java๋ ThreadPoolExecutor ํด๋์ค๋ฅผ ์ด์ฉํด์ Thread Pool์ ๊ตฌํํ๊ณ ์๋ค.
maximumPoolSize, keepAliveTime, corePoolSize ์ธ๊ฐ์ง ํน์ง์ด ์๋ค.
Thread Pool์๋ ํญ์ maximumPoolSize๊ฐ์ ์ต๋ ๊ฐ์๋ก Thread๋ฅผ ๋ง๋ค์ด ๋์ง ์๋๋ค. ์๋ํ๋ฉด ์์ฒญ์ด ์ ์ ๋๋ ๋ง์ ์์ ์ฐ๋ ๋๋ฅผ ๊ฐ์ง๊ณ ์์ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ด๋ค.
์ด๋ฅผ ์ต์ ํํ๋ ๊ธฐ๋ฅ์ด ๋ค์ด์๋ค.
โญ๏ธ ๋ง์ฝ ์์ ์ด ์๋๋ฐ ์ค๋ ๋ ๊ฐ์๊ฐ ์ต๋๋ก ์๊ณ keepAliveTime ์ดํ๋ก๋ ๊ณ์ ์์ฒญ์ด ์์ผ๋ฉด ์์ Queue์๋ ์์ ์ด ์๋ ๊ฒ์ด๋ฏ๋ก ์ค๋ ๋๋ฅผ corePoolSize ๊น์ง๋ง ์์ค๋ค.
์ด๋ฌํ Thread Pool์ด ์ด์ธ๋ฆด ๋งํ ๊ณณ์ Web Server๋ฅผ ์๋ก ๋ค ์ ์๋ค.
Thread Pool์ ์ฌ์ฉํ๋ Web Server
๋์์ ์ธ ์์ฒญ์ ๋์์ ์ผ๋ก ์ฒ๋ฆฌํด์ผ ํ๋ฏ๋ก ๋ง์ ์น ์๋ฒ๋ค์ด Thread Pool์ ์ฌ์ฉํ๋ค.
SpringBoot์ ๋ด์ฅ Servlet Container ์ค ํ๋์ธ Tomcat์ ์น ์๋ฒ ์์๋ก ๋ค ์ ์๋ค.
Tomcat์ Java ๊ธฐ๋ฐ์ WAS ๋ก์ Java์ Thread Pool ํด๋์ค์ ๋งค์ฐ ์ ์ฌํ ์์ฒด Thread Pool ๊ตฌํ์ฒด๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
MaxConnection
MaxConnection์ Tomcat์ด ์ต๋๋ก ๋์์ ์ฒ๋ฆฌํ ์ ์๋ Connection ๊ฐ์๋ฅผ ์๋ฏธํ๋ค.
Web ์์ฒญ์ด ๋ค์ด์ค๋ฉด Tomcat์ Connector๊ฐ Connection์ ์์ฑํ๋ฉด์ ํด๋ผ์ด์ธํธ์ ์ปค๋ฅ์
์ ์ฐ๊ฒฐํ๊ฒ ๋๋๋ฐ, ๊ทธ๋ ์์ฒญ๋ ์์
์ Thread Pool์ ์ฐ๊ฒฐํ๋ค. ์ด๋ ๋์์ ์ปค๋ฅ์
์ ์ฐ๊ฒฐํด์ ์ฒ๋ฆฌํ ์ ์๋ ์ปค๋ฅ์
์ ๊ฐ์๊ฐ MaxConnections์ด๋ค.
AcceptCount
Max-Connections ์ด์์ ์์ฒญ์ด ๋ค์ด์์ ๋ ์ฌ์ฉํ๋ ๋๊ธฐ์ด Queue์ ์ฌ์ด์ฆ๋ฅผ ์๋ฏธํ๋ค.
MAX-Connections์ Accept-Count ์ด์์ ์์ฒญ์ด ๋ค์ด์์ ๋ ์ถ๊ฐ์ ์ผ๋ก ๋ค์ด์ค๋ ์์ฒญ์ ๊ฑฐ์ ๋ ์ ์๋ค.
SpringBoot ์ค์ ์ผ๋ก Tomcat Thread Pool ์ค์
# application.yml (์ ์ด๋์ ๊ฐ์ default)
server:
tomcat:
threads:
max: 200 # ์์ฑํ ์ ์๋ thread์ ์ด ๊ฐ์
min-spare: 10 # ํญ์ ํ์ฑํ ๋์ด์๋(idle) thread์ ๊ฐ์
max-connections: 8192 # ์๋ฆฝ๊ฐ๋ฅํ connection์ ์ด ๊ฐ์
accept-count: 100 # ์์
ํ์ ์ฌ์ด์ฆ
connection-timeout: 20000 # timeout ํ๋จ ๊ธฐ์ค ์๊ฐ, 20์ด
port: 8080 # ์๋ฒ๋ฅผ ๋์ธ ํฌํธ๋ฒํธ
SpringBoot์์ ๋ด์ฅ ํฐ์บฃ Thread Pool์ ๋ํ ์ค์ ์ ํ ์ ์๋ค.
server.tomcat.threads.max
Thread Pool์์ ์ฌ์ฉํ ์ต๋ ์ค๋ ๋ ๊ฐ์์ด๊ณ ๊ธฐ๋ณธ ๊ฐ์ 200์ด๋ค.
์๋ฒ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋์์ ์ฒ๋ฆฌํ ์ ์๋ ์์ฒญ ๊ฐ์์ ๊ด๋ จ๋์ด ์๋ค.
์์ฒญ ์์ ๋นํด ๋๋ฌด ๋ง๊ฒ ์ค์ ํ๋ฉด -> ๋๊ณ ์๋ ์ค๋ ๋๊ฐ ๋ง์์ ธ์ ๋นํจ์จ์ด ๋ฐ์ํ๋ค.
๋๋ฌด ์ ๊ฒ ์ค์ ํ๋ฉด -> ๋์ ์ฒ๋ฆฌ ์์ฒญ์๊ฐ ์ค์ด๋ค์ด ํ๊ท ์๋ต์๊ฐ๊ณผ TPS๊ฐ ๊ฐ์ํ๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก Thread๊ฐ ๋ง์์ง์๋ก CPU ์ค๋ฒํค๋์ ๋ฉ๋ชจ๋ฆฌ์์ ๋ฌธ์ ๊ฐ ์๊ธธ ์ ์๋ค๋ ๊ฒ์ ๊ณ ๋ คํด์ผ ํ๋ค.
server.tomcat.threads.min-spare
Thread Pool์์ ์ต์ํ์ผ๋ก ์ ์งํ Thread ๊ฐ์, ๊ธฐ๋ณธ ๊ฐ์ 10์ด๋ค.
๋๋ฌด ๋ง์ด ์ค์ ํ๋ฉด -> Thread Pool์ด ํญ์ ์ ์งํด์ผ ํ Thread ์๊ฐ ๋๋ฌด ๋ง์์ง๋ค.
์ ์ ํ๊ฒ ์ค์ ํ๋ฉด -> ์ ์ ์์ ์์ฒญ์์ ์๋ก์ด ์ค๋ ๋๋ฅผ ๋ง๋ค ํ์์์ด ์์ฒญ์ ํจ๊ณผ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋ค.
์๋ชป ์ค์ ํ์ ๊ฒฝ์ฐ ์ฌ์ฉํ์ง ์๋ Thread๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฐจ์งํ๋ฉด์ ๋นํจ์จ์ ๋ฐ์์ํจ๋ค๋ ๊ฒ์ ๊ณ ๋ คํด์ผ ํ๋ค.
server.tomcat.max-connections
๋์์ ์ฒ๋ฆฌํ ์ ์๋ ์ต๋ Connection์ ๊ฐ์, ๊ธฐ๋ณธ ๊ฐ์ 8192์ด๋ค.
์ฌ์ค์ ์๋ฒ์ ์ค์ง์ ์ธ ๋์ ์์ฒญ ์ฒ๋ฆฌ ๊ฐ์๋ผ๊ณ ์๊ฐํ ์ ์๋ค.
์ด ๋ถ๋ถ์์ Tomcat์ Connector ์ปดํฌ๋ํธ์ ์์ ๋ฐฉ์์ ๋ฐ๋ผ ๋ฌ๋ผ์ง ์ ์๋ค.
Blocking I/O ๋ฐฉ์์์๋ ์ปค๋ฅ์ ํ๋๊ฐ ํ๋์ Thread์ ์ฐ๊ฒฐ๋์ด ์์ ํ๋ค. ๋ฐ๋ผ์, ์ด ๋ฐฉ์์์๋ MaxThreadSize์ MaxConnection ๊ฐ์๊ฐ ํญ์ ๊ฐ์์ผ ํ๋ค. Tomcat 7 ๋ฒ์ ๊น์ง ์ ์ฉ๋ ๋ฐฉ์์ด๋ค.
โ Non-Blocking I/O ๋ฐฉ์์์๋ Thread ํ๋์ ์ปค๋ฅ์ ์ด ์ฌ๋ฌ๊ฐ ์ฐ๊ฒฐ๋์ด ๋์์ ์ผ๋ก ์์ ์ ์ฒ๋ฆฌํ ์ ์๋ค. MaxThreadSize๋ณด๋ค MaxConnection์ด ๋ ๋ง์๋ ๋๋ค. ํด๋น ๋ฐฉ์์ ๊ฒฝ์ฐ Tomcat 8 ๋ฒ์ ์ดํ๋ถํฐ ์ ์ฉ๋์ด ์๋ค.
ํ๋์ Thread์ ์ฌ๋ฌ๊ฐ์ง ์ปค๋ฅ์ ์ ์ฐ๊ฒฐํ์ฌ ์์ ํ ์ ์์ผ๋ฏ๋ก "MaxConnectionSize < = MaxThreadSize" ์ํฉ์ ๋นํจ์จ์ด ๋ฐ์ํ ์ ์๋ค.
server.tomcat.accept-count
max-connections ์ด์์ ์์ฒญ์ด ๋ค์ด์์ ๋ ์ฌ์ฉํ๋ ์์ฒญ ๋๊ธฐ์ด Queue์ ์ฌ์ด์ฆ, ๊ธฐ๋ณธ ๊ฐ์ 100์ด๋ค.
๋๋ฌด ํฌ๊ฒ ์ค์ ํ๋ฉด -> ๋๊ธฐ์ด์ด ์ปค์ง๋ฉด์ ๋ฉ๋ชจ๋ฆฌ ๋ฌธ์ ๋ฅผ ์ ๋ฐํ ์ ์๋ค.
๋๋ฌด ์๊ฒ ์ค์ ํ๋ฉด -> ์์ฒญ์ด ๋ชฐ๋ ธ์ ๋ ๋ค์ด์ค๋ ์์ฒญ๋ค์ ๊ฑฐ์ ํด ๋ฒ๋ฆด ์ ์๋ค.
์ด ์ค์ ์ ํ๋ ์ด์ ์ค ํ๋๋ ๋ถ์ ์ ํ๊ฑฐ๋ ์๋ชป๋ ์์ฒญ์ด ํ๋ฒ์ ๋๋ฌด ๋ง์ด ๋ค์ด์ ์๋ฒ์ ์ฅ์ ๋ฅผ ๋ฐ์์ํค๋ ๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํจ๋ ์๋ค.
๊ฒฐ๋ก
Thread Pool์ ์๋ต์๊ฐ๊ณผ TPS์ ์ํฅ์ ์ฃผ๋ ํ๋์ ์์์ด๋ค.
๋ฐ๋ผ์, ์ ์กฐ์ ๋ Thread Pool์ ์์คํ ์ ์ฑ๋ฅ์ ๋์ด๋ด๊ณ ์์ ์ ์ธ ์ ํ๋ฆฌ์ผ์ด์ ์ด์ฉ์ ๊ฐ๋ฅํ๊ฒ ํ๋ค.
๋ถ์ ์ ํ๊ฒ ์ค์ ๋ Thread Pool์ ๋ณ๋ชฉ ํ์, CPU ์ค๋ฒํค๋, ๋ฉ๋ชจ๋ฆฌ ๋ฌธ์ ๋ฅผ ์ ๋ฐํ ์ ์๋ค.
'๐ Backend' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ ์ฐฉ์ ์์คํ ์์ ๋ฐ์ํ๋ Race Condition์ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ (0) | 2025.01.06 |
---|---|
XSS์ CSRF์ ํน์ง (1) | 2023.09.11 |