서비스를 운영하다보면 시스템에 부하가 발생하는 경우가 존재한다.
부하의 종류에는 다양하게 있는데 이번 글에서는 I/O 부하에 관련된 주제에 대해 다뤄보도록 하겠다.
필자는 Disk I/O 부하가 발생한다면 HDD → SSD 업그레이드를 하는것만이 해결방법이라고 생각했었다.
그러던 도중 “대규모 서비스를 지탱하는 기술” 이라는 책을 읽으면서 I/O 부하가 발생할 때 메모리를 증설하는것도 하나의 방법이 될 수 있다는 것을 알게되었다.
그렇다면 어떠한 원리로 Disk I/O 부하일 때 메모리를 늘리는 것이 부하를 줄이는 방법이 되는지 알아보겠다.
이 방법은 OS 캐시와 관련이 있다. (이 글은 Linux 를 기준으로 작성되었다.)
OS 는 페이지 캐시라는 캐시구조를 가지고 있다.
> 페이지 캐시란?
OS 가 확보한 페이지를 메모리상에 계속 확보해두는 기능이다.
프로세스가 데이터를 읽어오는 과정은 아래와 같다.
- 디스크로부터 페이지 크기의 블록을 읽어낸다.
- 읽어낸것을 메모리에 위치시킨다.
- 메모리 주소를 프로세스 에게 알려준다.
- 프로세스는 해당 메모리에 액세스를 하게된다.
- 프로세스가 데이터를 전부 처리하더라도 메모리를 해제하지 않고 남겨둔다.
5번의 과정으로 인해 다른 프로세스가 같은 디스크를 액세스요청을 할 떄 필요한 정보가 이미 메모리에 있으므로 디스크 액세스가 발생하지 않게 된다.
이것으로 인해 성능을 높이는 것이 페이지 캐시이다.
Linux 에서는 메모리가 비어있으면 전부 캐싱한다.
만약 프로세스에서 메모리를 요청했을 때 캐시로 인해 메모리가 없다면 오래된 캐시를 버림으로써 메모리를 확보한다.
이제는 Disk I/O 부하일 때 메모리 증설을 하면 부하가 줄어드는 원리를 알 수 있을것이다.
OS 가 사용할 수 있는 메모리가 많아지면서 디스크 액세를 줄일 수 있게 된다.
덤으로 디스크 액세스속도보다 메모리 액세스속도가 월등히 빠르므로 속도도 향상될 수 있게된다.
데이터가 많아졌을 때는 메모리 증설로 어느정도 효과를 볼 수 있겠지만 한계점이 있다는것을 알아두자.
추가로 "대규모 서비스를 지탱하는 기술" 이라는 책은 나온지 오래되었지만 좋은내용이 정말 많은 책인것 같다.
절판되었다가 얼마전에 다시 출판되기 시작하였으니 한권씩 구매해서 읽어보는것을 추천한다.
'개발 > ETC' 카테고리의 다른 글
IntelliJ 를 활용하여 KSP(Kotlin Symbol Processing API) 디버깅 하는방법 (0) | 2022.03.01 |
---|---|
MSA 환경에서 분산 트랜잭션 처리하는 방법 (0) | 2021.10.04 |
댓글