주니어 백엔드 개발자가 반드시 알아야 할 실무 지식 ‐ IO 병목, 어떻게 해결하지 - dnwls16071/Backend_Summary GitHub Wiki

📚 네트워크 IO와 CPU⭐

  • 서버 프로그램은 기본적으로 네트워크 프로그램이다.
  • 서버는 다양항 구성 요소와 네트워크를 통해 데이터를 주고받는다.
  • 많은 서버는 HTTP 프로토콜을 이용해서 클라이언트와 데이터를 주고받는다.
  • 데이터 처리를 위해 DB를 사용하는데 DB는 TCP에 기반한 프로토콜을 사용해서 데이터를 주고받는다.
  • 레디스를 메모리 캐시로 사용할 때도 네트워크를 통해 데이터를 주고받는다.
  • 서버 API를 만들 때 개발자가 직접 네트워크 프로그램을 작성하진 않지만 서버는 네트워크 통신을 기반으로 동작한다.
  • 데이터 입출력이 완료될 때까지 쓰레드는 아무 작업도 하지 않고 입출력이 끝나기를 기다린다.
  • 즉, 입출력이 끝날 때까지 쓰레드가 블로킹(Blocking)된다. 보통 입출력에 소요되는 시간은 코드를 실행하는 시간보다 훨씬 길다.
  • 서버처럼 네트워크 연동이 많은 프로그램은 전체 실행 시간의 90% 이상을 입출력 대기에 사용하는 경우도 있다.
  • 쓰레드가 대기하는데 시간을 소요한다는 것은 그 쓰레드를 실행하는 CPU 역시 아무것도 하지 않는 시간이 생긴다는 의미이다.
  • CPU 사용률을 높이려면 CPU가 실행할 쓰레드를 많이 만들면 된다.

블로킹(Blocking)

  • 작업이 완료될 때까지 쓰레드가 대기하는 것을 블로킹이라고 한다.
  • 주로 데이터 입출력 과정에서 블로킹이 발생한다.
  • 입출력 과정에서 블로킹이 발생하기 때문에 이런 방식을 블로킹 IO라고 한다.

📚 가상 쓰레드⭐

📚 논블로킹 IO⭐