Connection vs Read Timeout
βAPI μλ΅ μμβ.
νΉμ API νΈμΆμ΄ κΈ΄ μκ° λμ hanging μ€μΌ μ μλ€.
μ΄λ° μμΌλ‘ κ°λ°νλ©΄μ ν λ²μ―€μ 무νμ λ‘λ© μ€νΌλλ₯Ό κ²½νν μ μ΄ μμ μ μλ€.
μ΄ λ¬Έμ μ μλΉμλ νμμμκ³Ό κ΄λ ¨μ΄ μμ κ°λ₯μ±μ΄ ν¬λ€. κ·Έλ₯ κΈ°λ³Έκ°μΌλ‘ λκ±°λ, μ΄λ¦Όμ§μμΌλ‘ βλμΆ© 5μ΄?β νκ³ μ€μ νκΈ°μλ λ무 μ€μν κ°μ΄λ€.
Connection Timeout vs Read Timeout: μ°¨μ΄μ

Connection Timeout: TCP 3-way handshake μκ°
Connection νμμμμ μ½κ² μκ°ν΄λ³΄λ©΄ βμλλ°©μκ² μ νλ₯Ό κ±°λ μκ°β μ΄λ€.
μλλ°©μκ² μ νλ₯Ό κ±Έκ³ , νΉμ μκ°μμ μ°κ²°λμ§ μμΌλ©΄ λκΈ΄λ€.
ν΄λΌμ΄μΈνΈμ μλ² κ°μ TCP 3-way handshakeλ₯Ό ν΅ν΄ λ Όλ¦¬μ μΈ μ°κ²°μ μ립νλ λ°κΉμ§ νμ©λλ μκ°μ΄λΌκ³ λ ν μ μλ€. (μ°κ²°μ΄ μ±λ¦½λκΈ°κΉμ§μ μ΅λ λκΈ° μκ°)
μ¦, Connection Timeoutμ TCP μ°κ²° μμ²΄κ° μ±λ¦½λμ§ μμ μνμμ μ°κ²° μλκ° μΌμ μκ° λ΄μ μλ£λμ§ λͺ»νμ λ λ°μνλ€.
μ κ³Όμ μμ μμλλ μκ°μ΄ Connection Timeoutμ΄λ€.
Connection Timeoutμ΄ λ°μνλ 쑰건
μλ²κ° μ£½μμ λ
λ°©νλ²½μμ ν¨ν·μ λ§μ λ
λ€νΈμν¬ μ₯λΉ μ΄μ λ± (λ€νΈμν¬ κ²½λ‘μ λ¬Έμ λ°μ)
μ€λ λ ν κ³ κ°κ³Ό κ°μ μ ν리μΌμ΄μ λ³λͺ©λ, accept νΈμΆμ΄ μ§μ°λλ©΄μ κ°μ μ μΌλ‘ Connection Timeoutμ μμΈμ΄ λ μ μλ€.
Read Timeout: μ°κ²° μ΄ν, λ΅λ³μ κΈ°λ€λ¦¬λ μκ°
Read νμμμμ βμ νμ μ°κ²°λκ³ , μλλ°©μ΄ λ΅λ³νκΈ°κΉμ§ κΈ°λ€λ¦¬λ μκ°βμ΄λ€.
μ΄λ―Έ TCP μ°κ²°μ΄ μ±λ¦½λ μνμμ μμ²μ λ³΄λΈ μͺ½μ΄ μλ΅ λ°μ΄ν°λ₯Ό μΌμ μκ° λμ λ°μ§ λͺ»νμ λ λ°μνλ€.
μ νκ° μ°κ²°λκ³ , μλλ°©μ΄ μ무 λλ΅ μμ΄ μΉ¨λ¬΅νλ μν©μ μΌλ§λ κΈ°λ€λ¦΄μ§ μ νλ μκ°μ΄λ€.
μ°κ²°μ μ±κ³΅νμ§λ§, μλ²κ° μμ²μ μ²λ¦¬νκ³ λ°μ΄ν°λ₯Ό 보λ΄μ£ΌκΈ° μ κΉμ§ 무νμ κΈ°λ€λ¦¬μ§ μλλ‘ λ°©μ§νλ μμ μ₯μΉμ΄κΈ°λ νλ€.
μ°κ²°μ μ±κ³΅νμ§λ§, μ€μ λ°μ΄ν°λ₯Ό μ£Όκ³ λ°λ κ³Όμ μμμ μ΅λ λκΈ° μκ°μ΄λ€.
Read Timeoutμ΄ λ°μνλ 쑰건
μλ²μμ μμ² μ²λ¦¬κ° μ€λ 걸리λ κ²½μ°
μλ΅ λ°μ΄ν°κ° ν° κ²½μ°
μ€κ° λ€νΈμν¬μμ ν¨ν· μ μ€μ΄ λ°μν κ²½μ° (νΉμ λ€νΈμν¬ λΆμμ )
Timeoutμ μν Golden Principle
κ·Έλμ κ° timeout κ°μ μ€μ νκΈ° μν΄μ μλΉμ€λ§μ κ·μΉμ΄ μ‘΄μ¬ν΄μΌ νλ€.
μλ λ 쑰건μ κ³ λ €ν μ μλ€.
λ€νΈμν¬λ μλ²½νμ§ μλ€. ν¨ν· μ μ€μ μ₯μ μν©μ΄ μλμ΄λ μΈμ λ μΌμ΄λ μ μλ€.
κ°νμ μΈ ν¨ν· μ μ€μ μ μμ μΈ μν©μ΄λ€. νμμμμ΄ λ무 μ§§μΌλ©΄ μ μμ μΈ λ€νΈμν¬ μ§μ°λ μλ¬λ‘ μ²λ¦¬νκ² λλ€.
μ λ§ λ€νΈμν¬ μ₯μ κ° λ°μνλ€λ©΄, μ΅λν 빨리 μΈμ§νκ³ λμν΄μΌ νλ€.
λ€νΈμν¬μ μ§μ§ λ¬Έμ κ° λ°μν κ²μ΄λΌλ©΄ μ΅λν 빨리 κ°μ§ν΄μΌ νλ€. νμμμμ΄ λ무 κΈΈλ©΄ μ₯μ λμμ΄ λ¦μ΄μ§λ€.
νμμμμ λ무 μ§§κ² μ‘μΌλ©΄, κ°λ λ°μνλ ν¨ν· μ μ€μλ μλΉμ€κ° μ€ν¨νλ€κ³ νλ¨νκ² λκ³ , λ°λλ‘ λ무 κΈΈκ² μ‘μΌλ©΄, μ€μ μ₯μ κ° λ°μνμ λ μ¬μ©μλ νμΌμμ΄ κΈ°λ€λ¦¬κ³ μμ€ν μ λ¬Έμ λ₯Ό λ무 λ¦κ² λ°κ²¬κ² λλ€.
λ°λΌμ μ΄λ¬ν 쑰건μ μ€μ νκ³ μ΄λ₯Ό λ§μ‘±νλ κΈ°μ€μ μ νλ κ² μ’λ€.
ν¨ν· μ μ€κ³Ό μ¬μ μ‘ λ©μ»€λμ¦
Linuxλ SYN ν¨ν·μ΄ μ μ€λλ©΄ 1μ΄ ν μ¬μ μ‘νλ€.
μ¦, Linux Kernelμ νλμ½λ©λ μ΄κΈ° μ¬μ μ‘ νμμμ, InitRTO κ°μ μ¬μ©νλ€λ κ²μ΄λ€.
μ΄ κ°μ κΈ°λ³Έμ μΌλ‘
1μ΄μ΄λ©°, RFC 6298μ λ°λ₯Έ μ΄κΈ° RTO κ°μ΄λΌκ³ νλ€.InitRTOλ TCP Handshake μ€ μ²« SYN ν¨ν·μλ§ μ μ©λλ©°, μ΄νμ RTOλ RTT μΈ‘μ μ κΈ°λ°ν΄ λμ μΌλ‘ μ‘°μ λλ€.
SYN ν¨ν·μ΄ ν λ² μ μ€λλ€λ©΄ μ΅μν μ°κ²°μ λ§Ίλλ° 1μ΄ μ΄μμ μκ°μ΄ μμλλ€.
TCP RTOλ μ°κ²° μ΄νμλ κ³μ μ¬μ©λλ κ°λ μ΄λ€.
μ°κ²° μ (SYN λ¨κ³)
RTTλ₯Ό λͺ¨λ₯΄λκΉ
InitRTO(1μ΄)μ¬μ©SYN ν¨ν· μ μ€ μ 1μ΄ ν μ¬μ μ‘
μ°κ²° ν (λ°μ΄ν° ν΅μ )
SYN + ACKλ₯Ό λ°μΌλ©΄μ 첫 RTT μΈ‘μ
μ΄ν RTT κΈ°λ°μΌλ‘ RTO λμ κ³μ°
μ΅μκ°: 200ms (tcp_rto_min)
μ΅λκ°: 120μ΄ (tc_rto_max)
μ¦, μ΄κΈ° μ°κ²° μ RTO κ°μ΄ μ ν΄μ§κ³ , μ΄ν ν¨ν· κ΅ν κ³Όμ μμ μΈ‘μ λλ RTT(μ볡 μκ°)λ₯Ό λ°μν΄ RTOκ° κ³μ λ³ννκ³ , μ°κ²° μ΄νμλ RTOλ λ³ννλ©°, λ€νΈμν¬ μν©μ λ§μΆ° λμ μΌλ‘ μ‘°μ λλ κ°μ΄λ€.
μ€μ μκ° κ³μ°:
1λ² μ μ€:
1μ΄ μ§μ°2λ² μ μ€:
1 + 2 = 3μ΄ μ§μ°3λ² μ μ€:
1 + 2 + 4 = 7μ΄ μ§μ°
Connection Timeout
컀λ₯μ νμμμμ TCP μ°κ²° κ³Όμ μμ λ°μνλ€. μ¬κΈ°μ ν¨ν·μ΄ μ μ€λ μ μλ κ²½μ°λ ν¬κ² μΈ κ°μ§μ΄λ€.
ν΄λΌμ΄μΈνΈκ° λ³΄λΈ μ°κ²° μμ²(SYN) ν¨ν· μ μ€ (ν΄λΌμ΄μΈνΈ β [μ μ€] β μλ²)
μλ²κ° λ³΄λΈ μ°κ²° μλ½(SYN + ACK) ν¨ν· μ μ€ (ν΄λΌμ΄μΈνΈ β [μ μ€] β μλ²)
ν΄λΌμ΄μΈνΈκ° λ³΄λΈ μ΅μ’ νμΈ(ACK) ν¨ν· μ μ€ (ν΄λΌμ΄μΈνΈ β [μ μ€] β μλ²)
μ¬κΈ°μ μ€μν κ°λ
μ΄ νλ μλλ°, RTO(Retransmission Timeout, μ¬μ μ‘ νμμμ)μ΄λ€.
ν¨ν·μ 보λ΄κ³ μ΄ μκ°λ§νΌ μλ΅μ΄ μμΌλ©΄ βμ, μ μ€λꡬλβνκ³ μ¬μ μ‘μ μλνλ€.
νΉν, μ°κ²°μ μ²μ μλν λλ RTT(Rount Trip Time, λ°μ΄ν° μ볡 μκ°)λ₯Ό λͺ¨λ₯΄κΈ° λλ¬Έμ, InitRTO κ°μ μ¬μ©νλ€.
μμμ μΈκΈν ν¨ν· μ μ€ μμ μκ° κ³μ°μ κΈ°μ€μΌλ‘,
Connection Timeoutμ 3μ΄λ‘ μ€μ νλ€λ©΄
ν λ²μ ν¨ν· μ μ€μ νμ©νκ³ , μ°μλ λ λ²μ ν¨ν· μ μ€μ΄ λ°μνμ λ λΉ λ₯΄κ² μ€ν¨νκ² λ€λ μλ―Έμ΄λ€.
Read Timeout: μλΉμ€ νΉμ±μ λ§κ² μ€μ
Read Timeoutμ Connection Timeoutλ³΄λ€ λ³΅μ‘νλ€. κ³ λ €ν΄μΌ ν μμκ° λ λ§κΈ° λλ¬Έμ΄λ€.
μ°κ²°μ΄ λκ³ λλ©΄ RTT κΈ°λ°μΌλ‘ RTO(Retransmission Timeout)λ₯Ό κ³μ°νλ€.
μλ²μ μ²λ¦¬ μκ°(Server-Side Processing Time)μ ν¨κ» κ³ λ €ν΄μΌ νλ€.
μλ² μ²λ¦¬ μκ°: μλ²κ° ν΄λΌμ΄μΈνΈμ μμ²μ λ°μ μ²λ¦¬νλ λ° κ±Έλ¦¬λ μ€μ μκ°
RTT: ν΄λΌμ΄μΈνΈμμ μλ²λ‘ μμ²μ΄ μ λ¬λκ³ , λ€μ μλ΅μ΄ ν΄λΌμ΄μΈνΈμ λμ°©νλ λ° κ±Έλ¦¬λ μ΄ μ볡 μκ°
ν¨ν· μ¬μ μ‘ μκ°: λ€νΈμν¬ μμμ ν¨ν·μ΄ μ μ€λμμ κ²½μ° μ¬μ μ‘μ΄ μΌμ΄λλ©΄μ μΆκ°λ‘ μμλλ μκ°(RTO)λ₯Ό ν¬ν¨νλ€.
μ¬κΈ°μ RTTλ ν¨ν· μ¬μ μ‘ μκ°λ³΄λ€ μλ² μ²λ¦¬ μκ°μ΄ μ 체 μκ°μ μ’μ°νλ κ²½μ°κ° λλΆλΆμ΄λ€.
νΈμΆν APIκ° λ³΅μ‘ν DB 쿼리λ₯Ό μννκ±°λ λ€λ₯Έ μλΉμ€λ₯Ό νΈμΆνλ€λ©΄, μλ°± ms ~ μμ΄κ° 걸릴 μ μλ€.
κ·Έλ κΈ° λλ¬Έμ Read Timeoutμ μ€μ νλ κ°μ₯ μ’μ λ°©λ²μ λ°μ΄ν°μ κΈ°λ°νλ κ²μ΄λ€.
λ°±μλ μλΉμ€μ APMμ΄ κ΅¬μ±λμ΄ μλ€κ³ κ°μ νμ.
μ°λ¦¬λ APMμ ν΅ν΄ νΈμΆνλ €λ APIμ P95 λλ P99 μλ΅ μκ°μ νμΈν μ μλ€.
P99: μ 체 μμ² μ€ 99%κ° μ΄ μκ°μμ μλ΅νλ€λ μλ―Έλ‘, λλΆλΆμ μ μμ μΈ κ²½μ°λ₯Ό ν¬ν¨νλ μμ μ μΈ μ§νλ€.
κ·Έλμ A μλΉμ€μ P99 μλ΅ μκ°μ΄ 700msλΌλ©΄, Read Timeoutμ λ€νΈμν¬ μν©μ κ³ λ €ν λ²νΌ(e.g., 300ms ~ 500ms)λ₯Ό λν΄ 1μ΄ ~ 1.2μ΄λ‘ μ€μ νλ κ²μ΄ λ§€μ° ν©λ¦¬μ μΌ μ μλ€.
λ§μ½ API μλ΅ μκ°μ μ ν λͺ¨λ₯΄λ μν©μ΄λΌλ©΄, 1~3μ΄μ 보μμ μΈ κ°μΌλ‘ μμνκ³ λ°λμ λͺ¨λν°λ§μ ν΅ν΄ μ‘°μ νλ κ²μ΄ μ’μ κ² κ°λ€.
μΆκ° λ΄μ©
Read Timeoutμ 무쑰건 ν΄λΌμ΄μΈνΈμμ μ€μ νλ€.
Read Timeoutμ μμ²μ λ³΄λΈ μͺ½(ν΄λΌμ΄μΈνΈ)μ΄ μλ΅μ μΌλ§λ κΈ°λ€λ¦΄μ§λ₯Ό κ²°μ νλ μ μ± μ΄κΈ° λλ¬Έμ΄λ€. μλ²λ ν΄λΌμ΄μΈνΈκ° μΌλ§λ κΈ°λ€λ €μ€μ§ μμ§ λͺ»νλ€.
Read Timeout μλ² λ‘κ·Έ
μ§μ μ μΌλ‘ "Read Timeout"μ΄λΌλ λ‘κ·Έλ λ¨μ§ μλλ€.
μλ²λ ν΄λΌμ΄μΈνΈκ° νμμμμΌλ‘ λμ΄μ§ μ¬μ€μ λͺ¨λ₯Έλ€. μλ²λ μμ μ μμ μ μλ£νκ³ ν΄λΌμ΄μν μκ² μλ΅μ 보λ΄λ μκ°, ν΄λΌμ΄μΈνΈκ° 컀λ₯μ μ λμλ€λ μ¬μ€μ μΈμ§νκ³ μλ²μ λ€μκ³Ό κ°μ λ€νΈμν¬ μ€λ₯λ λ¨κΈΈ μ μλ€.
java.net.SocketException: Broken pipe
Connection reset by peer
μ€μν κ²μ, μλ²μ μμ μ체λ μ±κ³΅μ μΌλ‘ μλ£λμμ μ μκΈ° λλ¬Έμ ν΄λΌμ΄μΈνΈλ "μ€ν¨"λ‘ μ²λ¦¬νμ§λ§ μλ²μμλ μ΄λ―Έ DBμ λ°μ΄ν°κ° μ μ₯λλ©΄μ λ°μ΄ν° λΆμΌμΉλ₯Ό μ λ°ν μ μλ€. Refer: https://alden-kang.tistory.com/20
Last updated