운영

[운영] Tomcat μ„±λŠ₯ κ°œμ„ 

ioh'sDeveloper 2024. 6. 16. 14:28

πŸ”₯ cpuκ°€ μƒμŠΉν•˜λ©΄ 무슨 일이 λ°œμƒν• κΉŒ 

μ„œλ²„μ—μ„œ CPU μ‚¬μš©λ₯ μ΄ μƒμŠΉν•˜λ©΄ μ—¬λŸ¬ κ°€μ§€ λ¬Έμ œκ°€ λ°œμƒν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ λ¬Έμ œλ“€μ€ μ„œλ²„μ˜ μ„±λŠ₯ μ €ν•˜λ‘œ μ΄μ–΄μ§ˆ μˆ˜ μžˆμœΌλ©°, μ΄λŠ” μ‚¬μš©μž κ²½ν—˜μ— μ§μ ‘적인 μ˜ν–₯을 λ―ΈμΉ©λ‹ˆλ‹€. λ‹€μŒμ€ CPU μ‚¬μš©λ₯  μƒμŠΉμœΌλ‘œ μΈν•΄ λ°œμƒν•  μˆ˜ μžˆλŠ” μ£Όμš” λ¬Έμ œλ“€μž…λ‹ˆλ‹€:

1. 응닡 μ‹œκ°„ 증가: CPUκ°€ κ³ΌλΆ€ν•˜ μƒνƒœμΌ λ•Œ, μš”μ²­μ„ μ²˜λ¦¬ν•˜λŠ” 데 더 였랜 μ‹œκ°„μ΄ κ±Έλ¦½λ‹ˆλ‹€. μ΄λŠ” μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 응닡 μ‹œκ°„μ΄ μ¦κ°€ν•˜μ—¬ μ‚¬μš©μžμ—κ²Œ 느린 κ²½ν—˜μ„ μ œκ³΅ν•©λ‹ˆλ‹€.
    
2. μŠ€λ ˆλ“œ 경쟁: Tomcat은 닀쀑 μŠ€λ ˆλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μš”μ²­μ„ μ²˜λ¦¬ν•©λ‹ˆλ‹€. CPUκ°€ κ³ΌλΆ€ν•˜ μƒνƒœμΌ λ•Œ, μŠ€λ ˆλ“œ κ°„μ˜ 경쟁이 λ°œμƒν•  수 있으며, μ΄λŠ” μ„±λŠ₯ μ €ν•˜μ™€ 응닡 μ‹œκ°„ μ¦κ°€λ‘œ μ΄μ–΄μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€.
    
3. λ¦¬μ†ŒμŠ€ λΆ€μ‘±: CPU μ‚¬μš©λ₯ μ΄ λ†’μœΌλ©΄ λ‹€λ₯Έ μ‹œμŠ€ν…œ λ¦¬μ†ŒμŠ€(λ©”λͺ¨λ¦¬, λ””μŠ€ν¬ I/O λ“±)도 영ν–₯을 받을 수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” 전체 μ‹œμŠ€ν…œ μ„±λŠ₯에 뢀정적인 영ν–₯을 λ―ΈμΉ  수 μžˆμŠ΅λ‹ˆλ‹€.
    
4. GC(가비지 μ»¬λ ‰μ…˜) 문제: Java μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œλŠ” λ©”λͺ¨λ¦¬ 관리λ₯Ό μœ„ν•΄ 가비지 μ»¬λ ‰μ…˜μ΄ μˆ˜ν–‰λ©λ‹ˆλ‹€. CPUκ°€ κ³ΌλΆ€ν•˜ μƒνƒœμΌ λ•Œ, 가비지 μ»¬λ ‰μ…˜μ΄ 자주 λ°œμƒν•˜κ³  였래 걸릴 수 있으며, μ΄λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ„±λŠ₯을 λ”μš± μ €ν•˜μ‹œν‚¬ 수 μžˆμŠ΅λ‹ˆλ‹€.
    
5. μ„œλ²„ λ‹€μš΄νƒ€μž„: 극단적인 경우, CPU κ³ΌλΆ€ν•˜λ‘œ 인해 μ„œλ²„κ°€ μ‘λ‹΅ν•˜μ§€ μ•Šκ±°λ‚˜ λ‹€μš΄λ  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” μ„œλΉ„μŠ€ κ°€μš©μ„±μ— 직접적인 영ν–₯을 미치며, κΈ΄κΈ‰ν•œ 볡ꡬ μž‘μ—…μ„ ν•„μš”λ‘œ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    
6. μ—΄ 좕적 및 ν•˜λ“œμ›¨μ–΄ 문제: 지속적인 높은 CPU μ‚¬μš©λ₯ μ€ ν•˜λ“œμ›¨μ–΄μ˜ μ—΄ 좕적을 μ•ΌκΈ°ν•  수 있으며, μ΄λŠ” 물리적인 ν•˜λ“œμ›¨μ–΄ μ†μƒμœΌλ‘œ μ΄μ–΄μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€.
    

μ΄λŸ¬ν•œ λ¬Έμ œλ₯Ό μ˜ˆλ°©ν•˜κ³  ν•΄κ²°ν•˜κΈ° μœ„ν•΄μ„œλŠ” CPU μ‚¬μš©λ₯ μ„ λͺ¨λ‹ˆν„°λ§ν•˜κ³ , μ„±λŠ₯ λ³‘λͺ© ν˜„상을 λΆ„μ„ν•˜λ©°, ν•„μš”μ‹œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λ° μ„œλ²„μ˜ μ΅œμ ν™”λ₯Ό μ§„ν–‰ν•˜λŠ” κ²ƒμ΄ μ€‘μš”ν•©λ‹ˆλ‹€. λ˜ν•œ, λΆ€ν•˜ λΆ„산을 μœ„ν•΄ λ‘œλ“œ λ°ΈλŸ°μ„œλ₯Ό λ„μž…ν•˜κ±°λ‚˜, μ„œλ²„λ₯Ό μŠ€μΌ€μΌ μ•„μ›ƒν•˜λŠ” κ²ƒλ„ κ³ λ €ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€.

 

πŸ”₯ μ΅œμ ν™” μ„€μ •

Tomcat의 `server.xml` νŒŒμΌμ—μ„œ `Connector` μ„€μ •μ— μ••μΆ• κ΄€λ ¨ μ†μ„±λ“€μ„ μΆ”κ°€ν•˜λŠ” κ²ƒμ€ HTTP μ‘λ‹΅μ˜ ν¬κΈ°λ₯Ό μ€„μ—¬ λ„€νŠΈμ›Œν¬ λŒ€μ—­ν­μ„ μ ˆμ•½ν•˜κ³ , ν΄λΌμ΄μ–ΈνŠΈ μ‘λ‹΅ μ‹œκ°„을 κ°œμ„ ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ©λ‹ˆλ‹€. μ΄λŸ¬ν•œ μ„€μ •μ€ νŠΉνžˆ λŒ€μš©λŸ‰ λ°μ΄ν„° μ „μ†‘μ΄λ‚˜ λ„€νŠΈμ›Œν¬ λŒ€μ—­ν­μ΄ μ œν•œλœ ν™˜κ²½μ—μ„œ μœ μš©ν•©λ‹ˆλ‹€.

 

μ„€μ • μ„€λͺ…

- compression="on": 응닡을 μ••μΆ•ν•˜λ„λ‘ Tomcat에 μ§€μ‹œν•©λ‹ˆλ‹€. 압좕을 μ‚¬μš©ν•˜λ©΄ ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ μ „μ†‘λ˜λŠ” λ°μ΄ν„°μ˜ 크기λ₯Ό μ€„μ—¬μ€λ‹ˆλ‹€.
- compressionMinSize="2048": μ΅œμ†Œ μ••μΆ• 크기λ₯Ό μ„€μ •ν•©λ‹ˆλ‹€. 2048 λ°”μ΄νŠΈ 이상인 μ‘λ‹΅λ§Œ μ••μΆ•ν•©λ‹ˆλ‹€. μž‘μ€ λ°μ΄ν„°λŠ” μ••μΆ• 효율이 떨어지기 λ•Œλ¬Έμ— μ΅œμ†Œ 크기λ₯Ό μ§€μ •ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.
- noCompressionUserAgents="": νŠΉμ • μ‚¬μš©μž μ—μ΄μ „νŠΈμ— λŒ€ν•΄ 압좕을 λΉ„ν™œμ„±ν™”ν•©λ‹ˆλ‹€. μ‚¬μš©μž μ—μ΄μ „νŠΈκ°€ μš”μ²­ν•  λ•ŒλŠ” μ••μΆ•ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 일뢀 였래된 λΈŒλΌμš°μ €λŠ” μ••μΆ•λœ 데이터λ₯Ό μ œλŒ€λ‘œ μ²˜λ¦¬ν•˜μ§€ λͺ»ν•  수 있기 λ•Œλ¬Έμž…λ‹ˆλ‹€.
- compressableMimeType="application/json": μ••μΆ•ν•  MIME νƒ€μž…μ„ μ§€μ •ν•©λ‹ˆλ‹€. μ—¬κΈ°μ„œλŠ” "application/json" νƒ€μž…μ˜ μ‘λ‹΅λ§Œ μ••μΆ•ν•©λ‹ˆλ‹€. λ‹€λ₯Έ νƒ€μž…μ˜ 응닡은 μ••μΆ•ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

 

μ–΄λ–€ μƒν™©μ—μ„œ μ‚¬μš©ν•˜λ‚˜μš”?

1. λŒ€κ·œλͺ¨ 데이터 전솑: λŒ€κ·œλͺ¨ JSON λ°μ΄ν„°λ‚˜ λ‹€λ₯Έ ν…μŠ€νŠΈ 기반 데이터 전솑 μ‹œ μœ μš©ν•©λ‹ˆλ‹€. 압좕을 톡해 데이터 크기λ₯Ό 쀄이면 λ„€νŠΈμ›Œν¬ νŠΈλž˜ν”½μ„ 쀄이고 전솑 μ‹œκ°„μ„ 단좕할 수 μžˆμŠ΅λ‹ˆλ‹€.
2. λŒ€μ—­ν­ μ ˆμ•½: λ„€νŠΈμ›Œν¬ λŒ€μ—­ν­μ΄ μ œν•œλœ ν™˜κ²½μ—μ„œ 압좕을 톡해 더 λ§Žμ€ 데이터λ₯Ό 전솑할 수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” 특히 λͺ¨λ°”일 λ„€νŠΈμ›Œν¬λ‚˜ 느린 인터넷 μ—°κ²°μ—μ„œ μ€‘μš”ν•©λ‹ˆλ‹€.
3. μ„œλ²„ μ„±λŠ₯ μ΅œμ ν™”: μ„œλ²„μ™€ ν΄λΌμ΄μ–ΈνŠΈ κ°„μ˜ 데이터 전솑 μ‹œκ°„μ„ 쀄여 전체 μ„±λŠ₯을 κ°œμ„ ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 압좕은 μ„œλ²„μ˜ CPUλ₯Ό μ‚¬μš©ν•˜μ§€λ§Œ, λ„€νŠΈμ›Œν¬ λŒ€μ—­ν­ μ ˆμ•½μœΌλ‘œ 인해 전체 μ„±λŠ₯이 ν–₯상될 수 μžˆμŠ΅λ‹ˆλ‹€.

 

μ΅œμ ν™” 상황

1. 데이터 μ••μΆ•: μ§€μ •λœ 쑰건에 λ§žλŠ” λͺ¨λ“  HTTP 응닡 데이터가 μ••μΆ•λ©λ‹ˆλ‹€. μ΄λŠ” 데이터 μ „μ†‘λŸ‰μ„ 쀄이고, ν΄λΌμ΄μ–ΈνŠΈκ°€ 데이터λ₯Ό 더 λΉ λ₯΄κ²Œ 받을 수 있게 ν•©λ‹ˆλ‹€.
2. CPU μ‚¬μš© 증가: μ••μΆ• μž‘μ—…μ€ CPUλ₯Ό μΆ”κ°€λ‘œ μ‚¬μš©ν•©λ‹ˆλ‹€. λ”°λΌμ„œ, μ„œλ²„μ˜ CPU λΆ€ν•˜κ°€ 증가할 수 μžˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ λŒ€λΆ€λΆ„μ˜ 경우 λ„€νŠΈμ›Œν¬ I/O κ°μ†Œλ‘œ 인해 전체 μ‹œμŠ€ν…œ μ„±λŠ₯이 κ°œμ„ λ©λ‹ˆλ‹€.
3. ν˜Έν™˜μ„± 문제: νŠΉμ • μ‚¬μš©μž μ—μ΄μ „νŠΈκ°€ μ••μΆ•λœ 데이터λ₯Ό μ²˜λ¦¬ν•˜μ§€ λͺ»ν•  경우 λ¬Έμ œκ°€ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•΄ `noCompressionUserAgents` 섀정을 톡해 ν˜Έν™˜λ˜μ§€ μ•ŠλŠ” μ—μ΄μ „νŠΈμ— λŒ€ν•΄μ„œλŠ” 압좕을 λΉ„ν™œμ„±ν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

κ²°λ‘ 
μ••μΆ• μ„€μ •μ„ ν†΅ν•΄ λ„€νŠΈ μ›Œν¬ λŒ€μ—­ν­μ„ μ ˆμ•½ν•˜κ³ , μ‘λ‹΅ μ‹œκ°„을 μ€„일 μˆ˜ μžˆμ§€λ§Œ, CPU λΆ€ν•˜κ°€ μ¦κ°€ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ μ„œλ²„μ˜ μ„±λŠ₯κ³Ό λ„€νŠΈμ›Œν¬ ν™˜κ²½μ„ κ³ λ €ν•˜μ—¬ μ μ ˆνžˆ μ„€μ •ν•˜λŠ” κ²ƒμ΄ μ€‘μš”ν•©λ‹ˆλ‹€.

 

πŸ”₯ μœ„μ™€ 같은 μ„€μ •μœΌλ‘œ μ΅œμ ν™”κ°€ 될까?

Tomcatμ—μ„œ μ••μΆ•μ„ ν™œμ„±ν™”ν•˜λ©΄ λ„€νŠΈμ›Œν¬ λŒ€μ—­ν­ μ ˆμ•½κ³Ό μ‘λ‹΅ μ‹œκ°„ λ‹¨μΆ•μ˜ μž₯점이 μžˆμ§€λ§Œ, CPU μ‚¬μš©λ₯ μ΄ μ˜€νžˆλ € μ¦κ°€ν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€. μ••μΆ• μž‘μ—… μžμ²΄κ°€ CPU에 λΆ€λ‹΄μ„ μ£ΌκΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€. λ”°λΌμ„œ μ••μΆ• μ„€μ •μ΄ CPU μƒμŠΉμ„ λ§‰μ•„μ£ΌλŠ” κ²ƒμ€ μ•„λ‹ˆλ©°, μ˜€νžˆλ € λ‹€μŒκ³Ό κ°™μ€ μƒν™©μ—μ„œ CPU μ‚¬μš©λ₯ μ΄ μƒμŠΉν•  μˆ˜ μžˆμŠ΅λ‹ˆλ‹€:

1. 데이터 μ••μΆ• μž‘μ—…: 압좕은 CPU 집약적인 μž‘μ—…μž…λ‹ˆλ‹€. 압좕을 ν™œμ„±ν™”ν•˜λ©΄ μ„œλ²„κ°€ 각 응닡을 μ••μΆ•ν•˜κΈ° μœ„ν•΄ 더 λ§Žμ€ CPU λ¦¬μ†ŒμŠ€λ₯Ό μ‚¬μš©ν•˜κ²Œ λ©λ‹ˆλ‹€.
2. λŒ€μš©λŸ‰ 데이터 처리: μ••μΆ•ν•  λ°μ΄ν„°μ˜ 양이 λ§Žμ„μˆ˜λ‘ CPU μ‚¬μš©λ₯ μ΄ 더 λ†’μ•„μ§‘λ‹ˆλ‹€.

압좕을 ν™œμ„±ν™”ν•˜λŠ” μ„€μ •μ€ λ„€νŠΈμ›Œν¬ λŒ€μ—­ν­ μ ˆμ•½ λ° ν΄λΌμ΄μ–ΈνŠΈ μ‘λ‹΅ μ‹œκ°„ κ°œμ„ μ„ λͺ©ν‘œλ‘œ ν•˜μ§€λ§Œ, μ„œλ²„μ˜ CPU λΆ€ν•˜λ₯Ό μ¦κ°€μ‹œν‚¬ μˆ˜ μžˆλ‹€λŠ” μ μ„ κ³ λ €ν•΄μ•Ό ν•©λ‹ˆλ‹€.

 

 

원인 λΆ„석 λ° ν•΄κ²° λ°©λ²•

압좕을 μ‚¬μš©ν•˜λ©΄μ„œλ„ CPU μ‚¬μš©λ₯ μ„ κ΄€λ¦¬ν•˜λ €λ©΄ λ‹€μŒκ³Ό 같은 좔가적인 방법듀을 κ³ λ €ν•΄λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€

1. μ μ ˆν•œ μ••μΆ• μˆ˜μ€€ μ„€μ •:

  • μ••μΆ• μˆ˜μ€€μ„ μ‘°μ ˆν•˜μ—¬ CPU μ‚¬μš©λ₯ κ³Ό μ••μΆ• 효율 κ°„μ˜ κ· ν˜•μ„ 맞μΆ₯λ‹ˆλ‹€. μ••μΆ• μˆ˜μ€€μ΄ λ†’μ„μˆ˜λ‘ 더 λ§Žμ€ CPUλ₯Ό μ‚¬μš©ν•˜μ§€λ§Œ, 데이터 크기λ₯Ό 더 많이 쀄일 수 μžˆμŠ΅λ‹ˆλ‹€.

2. μ••μΆ•ν•  MIME νƒ€μž… μ œν•œ:

  • κΌ­ ν•„μš”ν•œ 데이터 νƒ€μž…λ§Œ μ••μΆ•ν•˜μ—¬ λΆˆν•„μš”ν•œ CPU μ‚¬μš©μ„ μ€„μž…λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, ν…μŠ€νŠΈ 기반 데이터(JSON, XML λ“±)만 μ••μΆ•ν•˜κ³  μ΄λ―Έμ§€λ‚˜ λ™μ˜μƒ νŒŒμΌμ€ μ••μΆ•ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

3. μ„œλ²„ λ¦¬μ†ŒμŠ€ λͺ¨λ‹ˆν„°λ§ 및 μ‘°μ •:

  • μ„œλ²„μ˜ CPU μ‚¬μš©λ₯ μ„ μ§€μ†μ μœΌλ‘œ λͺ¨λ‹ˆν„°λ§ν•˜κ³ , ν•„μš”μ‹œ μ„œλ²„ λ¦¬μ†ŒμŠ€λ₯Ό ν™•μž₯ν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, 더 λ§Žμ€ CPU μ½”μ–΄λ₯Ό μΆ”κ°€ν•˜κ±°λ‚˜ μ—¬λŸ¬ μ„œλ²„λ‘œ λΆ€ν•˜λ₯Ό λΆ„μ‚°ν•©λ‹ˆλ‹€.

4. 캐싱 μ‚¬μš©:

  • 자주 μš”μ²­λ˜λŠ” 데이터에 λŒ€ν•΄ 캐싱을 μ‚¬μš©ν•˜μ—¬ μ••μΆ• μž‘μ—…μ„ μ€„μž…λ‹ˆλ‹€. μΊμ‹œλœ λ°μ΄ν„°λŠ” μ••μΆ•λœ μƒνƒœλ‘œ μ €μž₯ν•˜μ—¬ μž¬μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.


5. λ‹€λ₯Έ μ„±λŠ₯ μ΅œμ ν™” 기법 적용:

  • λ°μ΄ν„°λ² μ΄μŠ€ 쿼리 μ΅œμ ν™”, λ©”λͺ¨λ¦¬ 관리, μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 둜직 κ°œμ„  λ“± λ‹€λ₯Έ μ„±λŠ₯ μ΅œμ ν™” 기법을 ν•¨κ»˜ μ μš©ν•˜μ—¬ 전체적인 μ„œλ²„ λΆ€ν•˜λ₯Ό μ€„μž…λ‹ˆλ‹€.

 

κ²°λ‘ 
Tomcat의 μ••μΆ• μ„€μ •μ€ λ„€νŠΈμ›Œν¬ λŒ€μ—­ν­ μ ˆμ•½κ³Ό ν΄λΌμ΄μ–ΈνŠΈ μ‘λ‹΅ μ‹œκ°„ λ‹¨μΆ•μ— μœ λ¦¬ν•˜μ§€λ§Œ, μ„œλ²„μ˜ CPU μ‚¬μš©λ₯ μ„ μ¦κ°€μ‹œν‚¬ μˆ˜ μžˆμŠ΅λ‹ˆλ‹€. μ••μΆ•μ„ ν†΅ν•΄ CPU μƒμŠΉμ„ μ§μ ‘μ μœΌλ‘œ λ§‰μ„ μˆ˜λŠ” μ—†μœΌλ©°, μ˜€νžˆλ € CPU λΆ€ν•˜λ₯Ό μ¦κ°€μ‹œν‚¬ μˆ˜ μžˆκΈ° λ•Œλ¬Έμ—, μ„œλ²„ λ¦¬μ†ŒμŠ€λ₯Ό νš¨μœ¨μ μœΌλ‘œ κ΄€λ¦¬ν•˜κ³  λ‹€λ₯Έ μ„±λŠ₯ μ΅œμ ν™” λ°©λ²•λ“€μ„ ν•¨κ»˜ μ μš©ν•˜λŠ” κ²ƒμ΄ μ€‘μš”ν•©λ‹ˆλ‹€.

'운영' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[운영] cpu μƒμŠΉκ³Ό νŠΈλžœμž­μ…˜κ³Ό μ—°κ΄€μ„±  (1) 2024.06.16