| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
- effectivejava
- 알고리즘
- 카카오
- kubernetes
- 스프링
- 오블완
- Effective Java
- 스프링핵심원리
- springboot
- ElasticSearch
- 예제로 배우는 스프링 입문
- 함수형프로그래밍
- 자바스크립트
- Kotlin
- 이펙티브 자바
- 엘라스틱서치
- 클린아키텍처
- Effective Java 3
- k8s
- JavaScript
- Sort
- 알고리즘정렬
- Spring
- 스프링부트
- 이펙티브자바
- 스프링 핵심원리
- 자바
- 티스토리챌린지
- java
- 김영한
- Today
- Total
목록2026/01/08 (3)
Kim-Baek 개발자 이야기
서버가 80%의 시간을 놀고 있었다Court Alarm API 서버의 모니터링 대시보드를 보고 있었다. 이상한 점이 있었다.CPU 사용률: 20%메모리 사용률: 40%응답 시간: 평균 2초동시 접속자: 500명리소스는 충분한데 응답이 느렸다. 뭔가 이상했다.스레드 덤프를 떠서 분석했다.jstack | grep "WAITING\|BLOCKED" | wc -l# 결과: 190 (전체 200 스레드 중)190개 스레드가 대기 중이었다! 무엇을 기다리고 있을까?"http-nio-8080-exec-42" #42 waiting on condition at java.net.SocketInputStream.socketRead0(Native Method) at java.net.SocketInputStream.rea..
100만 개 파일을 저장했더니 서버가 느려졌다Court Alarm이 1년쯤 운영되면서 사용자들의 프로필 사진이 쌓이기 시작했다. 처음엔 몇 백 개였는데, 어느새 10만 개, 50만 개, 그리고 100만 개를 넘어섰다.그런데 이상한 일이 생겼다. 파일을 저장하거나 읽는 속도가 점점 느려지는 것이었다.// 프로필 사진 저장val file = File("/data/profile-images/${userId}.jpg")file.writeBytes(imageData) // 처음엔 10ms → 지금은 500ms?!왜 똑같은 작업이 50배나 느려진 걸까?서버 스펙은 그대로였다. CPU도, 메모리도, 디스크도 여유가 있었다. 문제는 파일 시스템에 있었다. 하나의 디렉토리에 100만 개 파일을 저장하면서 파일 시스템의..
서버가 10,000개 연결을 처리하는 방법Court Alarm이 성장하면서 동시 접속자가 급증했다. 처음엔 100명, 그 다음 1,000명, 그리고 어느 날 10,000명이 동시에 접속했다.서버가 버텨낼 수 있을까? 놀랍게도 서버는 문제없이 동작했다. CPU 사용률 40%, 메모리 사용률 60%. 여유가 있었다.어떻게 서버 한 대가 10,000개의 동시 연결을 처리할까?답은 운영체제의 네트워크 스택에 있었다. 운영체제는 네트워크 연결을 효율적으로 관리하는 정교한 메커니즘을 가지고 있다. 소켓, 버퍼, 인터럽트, I/O 다중화...5년 차가 되어서도 이 부분이 가장 어려웠다. 하지만 실제 성능 문제를 해결하면서 운영체제의 네트워크 처리를 제대로 이해하게 됐다.소켓(Socket)이란 무엇인가기본 개념소켓은 ..
