Spring Boot ๋ฅผ ์‚ฌ์šฉํ•˜๋‹ค๋ณด๋ฉด ๋‚ด์žฅ ํ†ฐ์บฃ์„ Servlet Container ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ์›น ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. Tomcat ์€ ๋˜ํ•œ ๋‹ค์ค‘ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š”๋ฐ, ์ด๋Š” Thread Pool ์„ ํ†ตํ•ด ๊ตฌํ˜„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

Tomcat ์€ Java ๋กœ ๋งŒ๋“ค์–ด์ ธ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— Java Thread Pool ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋•Œ๋ฌธ์— Tomcat ์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด์„  Java Thread Pool ์— ๋Œ€ํ•œ ์ดํ•ด๊ฐ€ ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค.

org.apache.tomcat.embed:tomcat-embed-core:9.0.64

  • apache
    • catalina
      • core
        • StandardServer.java
      • startup
        • Tomcat.java
    • coyote
      • http11
        • Http11NioProtocol.java
    • juli
    • naming
    • tomcat

Tomcat ์ด ์‚ฌ์šฉํ•˜๋Š” StandardServer ๋ฅผ ๋ณด๋ฉด ScheduledThreadPoolExecutor ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Œ

์„ ์ˆ˜ ์ง€์‹

  1. Tomcat ์€ ์™œ ScheduledThreadPoolExecutor ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฐ€?
  2. NIO Connector ์— ๋Œ€ํ•œ ์ดํ•ด ํ•„์š”
  3. ์ŠคํŠธ๋ฆผ vs ์ฑ„๋„์— ๋Œ€ํ•œ ์ดํ•ด ํ•„์š”
  • Spring Boot ๋Š” Tomcat ์„ ๋‚ด์žฅ Servlet Container ๋กœ ์‚ฌ์šฉ

  • Tomcat ์€ Thread Pool ์„ ํ†ตํ•ด ๋‹ค์ค‘ ์š”์ฒญ์„ ์ฒ˜๋ฆฌ

  • ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด Thread Pool ์—์„œ Thread ๋ฅผ ํ• ๋‹น

  • ์Šคํ”„๋ง๊ณผ ์Šคํ”„๋ง๋ถ€ํŠธ์˜ ์ฐจ์ด์  = ๋‚ด์žฅ Servlet Container ์ง€์› ์—ฌ๋ถ€

์Šคํ”„๋ง๋ถ€ํŠธ์™€ ๋‚ด์žฅ ํ†ฐ์บฃ

# 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.                 # ์„œ๋ฒ„๋ฅผ ๋„์šธ ํฌํŠธ๋ฒˆํ˜ธ
  • ์œ„ ์„ค์ •์„ ํ†ตํ•ด Tomcat ์˜ ThreadPoolExecutor ์™€ Connector ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Œ
  1. Core Size ๋งŒํผ ์Šค๋ ˆ๋“œ ์ƒ์„ฑ
  2. ์š”์ฒญ์ด ๋“ค์–ด์˜ฌ ๋•Œ ๋งˆ๋‹ค Queue ์— ๋‹ด์•„๋‘ 
  3. Core Size ์ค‘ idle ์ƒํƒœ์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ์žˆ๋‹ค๋ฉด Queue ์—์„œ ์ž‘์—…์„ ๊บผ๋‚ด ์Šค๋ ˆ๋“œ์— ํ• ๋‹น
    1. ๋งŒ์•ฝ idle ์ƒํƒœ์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ์—†๋‹ค๋ฉด Queue ์—์„œ ๋Œ€๊ธฐ
    2. Queue ๊ฐ€ ๊ฐ€๋“ ์ฐจ๋ฉด ์ƒˆ๋กœ ์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑ
    3. maxThreadSize ์— ๋„๋‹ฌํ•˜๋ฉด connection-refused ๋ฐ˜ํ™˜
  4. ์ž‘์—…์ด ์™„๋ฃŒ๋˜๋ฉด ์Šค๋ ˆ๋“œ๋Š” ๋‹ค์‹œ idle ์ƒํƒœ
    1. Queue ๊ฐ€ ๋น„์–ด์žˆ๊ณ  Core Size ์ด์ƒ์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ์ƒ์„ฑ๋˜์–ด ์žˆ๋‹ค๋ฉด ์ดˆ๊ณผ๋œ ์Šค๋ ˆ๋“œ๋ฅผ destroy

์Šค๋ ˆ๋“œ๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์œผ๋ฉด CPU ์˜ ์ž์›์„ ๋‘๊ณ  ๊ฒฝํ•ฉํ•˜๊ฒŒ๋˜์–ด ์ฒ˜๋ฆฌ์†๋„ ์ €ํ•˜ ๋ฐ CPU ์ž์› ํ™œ์šฉ ๋น„ํšจ์œจ ๋ฐœ์ƒ

๋”ฐ๋ผ์„œ, ์ ์ ˆํ•œ ์Šค๋ ˆ๋“œ ์ˆ˜๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ํ•„์š”ํ•จ

์Šค๋ ˆ๋“œํ’€ ์ „๋žต๊ณผ ์ ์ • ์Šค๋ ˆ๋“œ ๊ฐœ์ˆ˜๋กœ ๊ฒ€์ƒ‰

์Šค๋ ˆ๋“œํ’€

์ž๋ฐ”์—์„  ThreadPoolExecutor ๋ฅผ ํ†ตํ•ด ์Šค๋ ˆ๋“œํ’€์„ ์‚ฌ์šฉ

accept-count = ์ž‘์—… ๋Œ€๊ธฐ์—ด

์Šคํ”„๋ง๋ถ€ํŠธ๋Š” Integer.MAX 21์–ต ์„ ์ค˜์„œ ๋ฌดํ•œ ๋Œ€๊ธฐ์—ด ์ „๋žต์„ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์‚ฌ์šฉ

server:
  tomcat:
    threads:
      max: 2
      min-spare: 2
    accept-count: 1
  port: 5000

์ด ์ƒํƒœ์—์„œ 5๊ฐœ์˜ ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด?

5๊ฐœ ๋ชจ๋‘ ์ฒ˜๋ฆฌ๋จ

BIO ์—์„  3๊ฐœ๋งŒ ์ฒ˜๋ฆฌ๋œ๋‹ค๊ณ  ํ•˜๊ณ 

NIO ์—ฌ์„œ 5๊ฐœ๊ฐ€ ๋‹ค ์ฒ˜๋ฆฌ๋œ๋‹ค๊ณ  ํ•˜๋Š”๋ฐ

์‚ฌ์‹ค์€ max-connections ๊ฐ€ ์žˆ์–ด์„œ ๋˜๋Š”๊ฑฐ์ž๋‚˜

๊ทธ๋Ÿผ max-connections ๋Š” NIO ๋•Œ๋ฌธ์— ๊ฐ€๋Šฅํ•œ๊ฐ€?