1. Thread
μ€λ λμ κ°λ μ λ€μκ³Ό κ°λ€.
μ€νμ€μΈ ν νλ‘κ·Έλ¨(νλ‘μΈμ€) λ΄μμ ꡬλΆμ§μ΄μ§ μ€ν λ¨μ
νλμ νλ‘μΈμ€μμ μμ μ μ²λ¦¬νκΈ° μν λ¨μλ‘ μκ°νλ©΄ λλ€.
μ€μν μλ₯Ό λ€λ©΄, μνμ μνμ΄λΌλ νλ‘μΈμ€ λ΄μμ μ¬λ¬ κ³ κ°μ λμ κ±°λ μμ² μμ μ μ²λ¦¬ν΄μΌνλ€.
μ΄λ μνμ΄ λ³λ ¬μ μΌλ‘ λμ κ±°λ μμ² μμ μ μ²λ¦¬νλλ°, ν΄λΉ μμ μ΄ μ΄λ£¨μ΄μ§λ λ¨μκ° μ€λ λμΈ κ²μ΄λ€.
μ»΄ν¨ν°μ CPUλ μ€λ λ λ¨μλ‘ μμ μ μ²λ¦¬νλ€. CPUλ μ¬λ¬ μ€λ λλ₯Ό λ²κ°μκ°λ©° μ€νν΄μ λ€μ€ μμ μ μ²λ¦¬νλ€. CPUλ₯Ό μμ² μ§§μ μκ°μΌλ‘ μλΆν ν΄μ μ¬μ©νκΈ° λλ¬Έμ μ°λ¦¬ λμλ λμμ μ²λ¦¬λλ κ²μ²λΌ 보μ΄μ§λ§, μ¬μ€μ μ¬λ¬ μ€λ λλ₯Ό λ²κ°μκ°λ©΄μ μμ μ μ€ννλ κ²μ΄λ€.
β Threadκ° λ§μΌλ©΄ λ§μμλ‘ μ’μκΉ?
1. Threadλ μμ± μ λ©λͺ¨λ¦¬λ₯Ό μλͺ¨νλ€.
μ€λ λκ° μμ±λλ©΄, ν΄λΉ μ€λ λλ μ€νμ νμν λ©λͺ¨λ¦¬λ₯Ό ν λΉλ°λλ€. λ°λΌμ μμ± μ λ©λͺ¨λ¦¬λ₯Ό μλͺ¨νκ² λλ€.
μ€λ λκ° λ§μμ§λ©΄ κ° μ€λ λκ° μ°¨μ§νλ λ©λͺ¨λ¦¬κ° μ»€μ Έμ λ©λͺ¨λ¦¬κ° λΆμ‘±ν΄μ§ μ μλ€.
2. Threadκ° λ§μμ§λ©΄ CPUμ μμ κ²½ν©μ΄ λ°μν μ μλ€.
μ€λ λκ° λ§μμ§λ©΄ CPU μμμ κ²½ν©νλ κ²½μ°κ° λ°μν μ μλ€. νλ μ΄μμ μ€λ λκ° λ°μ΄ν°λ₯Ό κΈ°λ‘νλ €κ³ ν λ λ€λ₯Έ μ€λ λκ° ν΄λΉ λ°μ΄ν°λ₯Ό μ½μΌλ €κ³ νλ κ²½μ°λ₯Ό λ§νλ€. μ΄λ κ² κ²½ν©μ΄ λ°μνλ©΄ μ ν리μΌμ΄μ μ μμμΉ λͺ»ν λμμ΄ λ°μν μ μλ€.
3. Threadκ° λ§μμ§λ©΄ 컨ν μ€νΈ μ€μμΉ λΉμ©μ΄ 컀μ§λ€.
컨ν μ€νΈ μ€μμΉμ΄λ, CPUμμ μ€νμ€μ΄λ μ€λ λκ° λ€λ₯Έ μ€λ λλ‘ λ°λλ κ²μ μλ―Ένλ€. μ€λ λκ° λ€λ₯Έ μ€λ λλ‘ λ°λλ©΄μ, λ°λ μ€λ λμ μ 보λ₯Ό λ³κ²½ν΄μΌ νλλ° μ΄λ CPUκ° ν΄λΉ 컨ν μ€νΈ μ€μμΉμ μννμ¬ CPUμ μκ°μ μλͺ¨νλ€.
λ°λΌμ, 컨ν μ€νΈ μ€μμΉμ΄ μΌμ΄λλ©΄ CPUμ μκ°μ μλͺ¨νκ² λλ€. μ€λ λκ° λ§μΌλ©΄ λ§μμλ‘ μ€λ λ κ°μ μ νμ΄ λΉλ²ν΄μ§ κ²μ΄κ³ , μ΄μ λ°λΌμ 컨ν μ€νΈ μ€μμΉ λΉμ©μ΄ μ»€μ§ κ²μ΄λ―λ‘ CPUμ μκ°μ μλͺ¨νκ² λκ³ λ λμκ°μλ CPUμ μ€λ²ν€λκ° λ°μνμ¬ μ±λ₯μ΄ μ νν μ μλ€.
2. Spring Bootμ Tomcat
μ€νλ§κ³Ό μ€νλ§λΆνΈμ μ£Όμν μ°¨μ΄μ μ€ νλλ, μ€νλ§ λΆνΈμμ λ΄μ₯ μλΈλ¦Ώ 컨ν μ΄λ(Tomcat)μ μ§μνλ€λ κ²μ΄λ€. λ°λΌμ application.yml νμΌμ μ€μ μ μ£Όλ κ²λ§μΌλ‘ κ°νΈνκ² Tomcatμ μ€μ μ λ°κΏ μ μλ€.
μλλ μλ²(Tomcat)μ μ€μ μ λ°κΏμ£Όλ μμμ΄λ€.
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 # μλ²λ₯Ό λμΈ ν¬νΈλ²νΈ
λ§μ½ μ€μ μ μ£Όμ§ μλλ€λ©΄, λν΄νΈκ°μ μ£Όμ νκ² λλ€. ν΄λΉ λν΄νΈ κ°μ ServerProperties ν΄λμ€μμ νμΈν μ μλ€.
3. Thread Pool
μ€λ λ νμ΄λ
Thread Poolμ νλ‘κ·Έλ¨ μ€νμ νμν Threadλ€μ 미리 μμ±ν΄λλλ€λ κ°λ μ΄λ€.(Threadλ cpuμ μμμ μ΄μ©νμ¬ μ½λλ₯Ό μ€ννλ νλμ λ¨μμ).
Tomcat 3.2 μ΄μ λ²μ μμλ, μ μ μ μμ²μ΄ λ€μ΄μ¬ λ λ§λ€ Servletμ μ€νν Threadλ₯Ό νλμ© μμ±νκ³ μμ²μ΄ λλλ©΄ destoryνλ€κ³ νλ€.
νμ§λ§ λͺ¨λ μμ²μ λν΄ μ€λ λλ₯Ό μμ±νκ³ μλ©Ένλ κ²μ OSμ JVMμ λν΄ λ§μ λΆλ΄μ μ겨μ€λ€. λμμ μΌμ μ΄μμ λ€μ μμ²μ΄ λ€μ΄μ¬ κ²½μ° λ¦¬μμ€(CPUμ λ©λͺ¨λ¦¬ μμ) μλͺ¨μ λν μ΅μ κ° μ΄λ ΅λ€. μ¦ λμλ€λ°μ μΈ μμ²μ μ²λ¦¬νμ§ λͺ»ν κ°λ₯μ±μ΄ λλ€.
μ΄λ° λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄, ν°μΊ£μ Thread Pool(μ€λ λ ν)μ νμ©νλ€.
μ€λ λνμ κΈ°λ³Έ νλ‘μ°λ λ€μκ³Ό κ°λ€.
- 첫 μμ μ΄ λ€μ΄μ€λ©΄, core sizeλ§νΌμ μ€λ λλ₯Ό μμ±
- μ μ μμ²(Connection, Server socketμμ acceptν μμΊ£ κ°μ²΄)μ΄ λ€μ΄μ¬ λλ§λ€ μμ ν(queue)μ λ΄μλ
- core sizeμ μ€λ λ μ€, μ ν΄μν(idle)μΈ μ€λ λκ° μλ€λ©΄ μμ
νμμ μμ
μ κΊΌλ΄ μ€λ λμ μμ
μ ν λΉνμ¬ μμ
μ μ²λ¦¬
- λ§μ½ μ ν΄μνμΈ μ€λ λκ° μλ€λ©΄, μμ μ μμ νμμ λκΈ°
- κ·Έ μνκ° μ§μλμ΄ μμ νκ° κ½ μ°¬λ€λ©΄, μ€λ λλ₯Ό μλ‘ μμ±
- 3λ²κ³Όμ μ λ°λ³΅νλ€ μ€λ λ μ΅λ μ¬μ΄μ¦ μ λλ¬νκ³ μμ νλ κ½ μ°¨κ² λλ©΄, μΆκ° μμ²μ λν΄μ connection-refused μ€λ₯λ₯Ό λ°ν
- νμ€ν¬κ° μλ£λλ©΄ μ€λ λλ λ€μ μ ν΄μνλ‘ λμκ°.
- 4-1. μμ νκ° λΉμ΄μκ³ core sizeμ΄μμ μ€λ λκ° μμ±λμ΄μλ€λ©΄ μ€λ λλ₯Ό destory
μ€λ λν μμ± (ThreadPoolExecutor)
μμ μ€λͺ ν μ€λ λνμ μλ°μμ ꡬνν ꡬνμ²΄κ° ThreadPoolExecutorμ΄λ€.
μκΉ μν€μ μμ±νλ application.yml μ€ μΌλΆμ΄λ€.
server:
tomcat:
threads:
max: 200 # μμ±ν μ μλ threadμ μ΄ κ°μ
min-spare: 10 # νμ νμ±ν λμ΄μλ(idle) threadμ κ°μ
accept-count: 100 # μμ
νμ μ¬μ΄μ¦
max-connections: 8192 # μ°κ²° κ°λ₯ν connectionμ μ
threadsμ λκ°μ§ μ€μ μ μ€λ λ μ΅λ μ¬μ΄μ¦ λ° core sizeλ₯Ό λ³κ²½ν μ μλ€.
Spring Bootμ λν΄νΈ κ°μ κ°κ° 200κ°, 10κ° μ΄λ€.
accept-countλ μμ νμ μ¬μ΄μ¦μ΄λ€. Tomcat μμ μ무 μ΅μ μ μμ£Όλ©΄ Integer.MAX, μ¦ 21μ΅xxx λ‘ μ€μ λλ€. μ΄λ 무ν λκΈ°μ΄ μ λ΅ μΌλ‘, μ무리 μμ²μ΄ λ§μ΄ λ€μ΄μλ core sizeλ₯Ό λλ¦¬μ§ μλλ€λ μ μ± μ΄λ€.
max-connectionsλ λμμ μλ²κ° μμ²μ μ²λ¦¬ν μ μλ Connection μλ₯Ό μλ―Ένλ€. μλ₯Ό λ€μ΄ Max-Connectionμ΄ 10 μΌλ 10κ°μ μμ²μ΄ μ²λ¦¬μ€μ΄λΌλ©΄, blockλκ³ μμ νμ λ€μ΄κ°κ²λλ€.
π€ threads.max μ max-connectionμ μ°¨μ΄λ κ·ΈλΌ λκΉ??
λͺ κ°μ§ ν μ€νΈλ₯Ό ν΅ν΄ μμ보μλ€.
μλλ μμ²μ 보λ΄κΈ° μν curl λͺ λ Ήμ΄λ€μ sh νμΌμ΄λ€.
#!/bin/bash
curl --max-time 15 http://localhost:8080/test &
curl --max-time 15 http://localhost:8080/test &
curl --max-time 15 http://localhost:8080/test &
curl --max-time 15 http://localhost:8080/test &
curl --max-time 15 http://localhost:8080/test &
curl --max-time 15 http://localhost:8080/test &
curl --max-time 15 http://localhost:8080/test &
curl --max-time 15 http://localhost:8080/test &
curl --max-time 15 http://localhost:8080/test &
curl --max-time 15 http://localhost:8080/test &
Test #1 [max-connections == threads.max]
μ΅λ 컀λ₯μ μ: 10κ°
μ΅λ μ€λ λ μ: 10κ°
λ‘ μ€λ λλ₯Ό μ€μ νκ³ 10λ²μ μμ²μ 보λ΄λ³΄μλ€.
server:
tomcat:
threads:
max: 10 # μμ±ν μ μλ threadμ μ΄ κ°μ
min-spare: 1 # νμ νμ±ν λμ΄μλ(idle) threadμ κ°μ
accept-count: 30 # μμ
νμ μ¬μ΄μ¦
max-connections: 10 # μ°κ²° κ°λ₯ν connectionμ μ
κ²°κ³Όλ 1μ΄λ§μ 10κ°μ μμ²μ λ€ μ²λ¦¬νλ€.
Test #2 [max connections < thread.max]
μ΅λ 컀λ₯μ μ: 10κ°
μ΅λ μ€λ λ μ: 5κ°
λ‘ μ€λ λλ₯Ό μ€μ νκ³ 10λ²μ μμ²μ 보λ΄λ³΄μλ€.
server:
tomcat:
threads:
max: 10 # μμ±ν μ μλ threadμ μ΄ κ°μ
min-spare: 1 # νμ νμ±ν λμ΄μλ(idle) threadμ κ°μ
accept-count: 30 # μμ
νμ μ¬μ΄μ¦
max-connections: 5 # μ°κ²° κ°λ₯ν connectionμ μ
μ΅λ μ€λ λ μλ 10κ°μ§λ§ 1 ~ 5 κΉμ§ μ΄ 5κ°μ μ€λ λλ§ μμ±λκ³ μ²λ¦¬ν©λλ€.
λ°λΌμ 2μ΄μ κ±Έμ² μμ²μ μ²λ¦¬νμ΅λλ€.
Test #3 [max connections > thread.max]
μ΅λ 컀λ₯μ μ: 5κ°
μ΅λ μ€λ λ μ: 2κ°
λ‘ μ€λ λλ₯Ό μ€μ νκ³ 10λ²μ μμ²μ 보λ΄λ³΄μλ€.
server:
tomcat:
threads:
max: 2 # μμ±ν μ μλ threadμ μ΄ κ°μ
# min-spare: 1 # νμ νμ±ν λμ΄μλ(idle) threadμ κ°μ
accept-count: 30 # μμ
νμ μ¬μ΄μ¦
max-connections: 5 # μ°κ²° κ°λ₯ν connectionμ μ
κ²°κ³Όλ max-connectionμ 5μ§λ§ 2κ°μ μ€λ λλ§ μ΄μ© κ°λ₯νλ―λ‘ μ€λ λ1~2 μ΄ 2κ°μ μ€λ λλ‘ 5μ΄μ κ±Έμ³ 10κ°μ μμ²μ μ²λ¦¬νλ€.
4. κ²°λ‘
μμ μ μ€νλ§μ μ²μ λ°°μ°κΈ° μμν λ κ°μμμ "μ€νλ§μ μλ²μ μ€λ λ νμ΄ μκ³ μ€λ λλ₯Ό κΊΌλ΄μ μμ²μ μ²λ¦¬νκ³ λ°λ©νλ€" λΌκ³ λ°°μ΄ κΈ°μ΅μ΄ λλ€.
κ·Έλ μ€λ λμ κ°λ λ μ λͺ¨λ₯Έμ±λ‘ λ€μλλ°, λͺ λ μ΄ μ§λκ³ κΆκΈν΄μ Έ μ°Ύμλ³΄κ³ μ 리νκ² λμλ€.
μ΄μ ν°μΊ£μ΄ μ΄λ»κ² μ€λ λλ₯Ό κ΄λ¦¬νκ³ , μ΄λ»κ² κ°μ λ°κΏ μ μλμ§ μ΄λμ λ μκ² λμμ§λ§ μ‘°κΈ λ νμ΅ν νμ κ°μμ μλ²μ λ§κ² νλνκ³ μ±λ₯ κ°μ κΉμ§ ν΄λ³΄κΈ°μ μΆλ€.
νμ¬ μ°½μ νλ‘μ νΈμμ κ°λ° μ€μΈ μλΉμ€κ° μλλ°, ꡬνμ΄ μλ£λκ³ λ°°ν¬λ₯Ό μλλ€λ©΄ λΆν ν μ€νΈμ λͺ¨λν°λ§μ ν΅ν΄ ν°μΊ£ νλμ μ§νν΄λ³΄κ³ κΈ°λ‘ν μκ°μ΄λ€.
λ°°μμ λμ΄ μλ€..!