/var/log/messages
I/O에 대해서 본문
오늘은 막연하게만 알고 있던 i/o에 대해서 간단히 적어보려고 한다.
서버의 헬스 체크를 할 때, 큰 화두 중 하나는 메모리의 용량이다.
우리는 현재 메모리의 상태를 쉽게 확인할 수 있는 free 명령어가 존재한다.
지금 이 상태는 메모리 용량의 문제가 되진 않는다. 그러나 Swap을 사용한다면 문제가 생긴다.
단순히 Swap을 사용한다면 I/O가 느려지겠구나 라는 생각에서 끝날 수 있는데, 실상을 알고보면 생각보다 심각한 문제로 와닿는다. CPU는 메모리와 디스크 중 메모리에 더 가깝고 메모리의 용량이 부족해서 디스크의 일부용량을 사용하는 것이 Swap이다. 아래 그림이 내 문장을 나타낸 것이다.
그럼 Swap을 사용한다는 것은 hdd, sdd 같은 디스크에서 데이터를 가져옫다고 말할 수 있다. 그럼 디스크에서 가져오는 것은 어떤 의미를 가지는 지 수치적으로 알아야 할 필요가 있다. 평균적으로, 메모리에서 가져오는 데이터는 hdd보다 10의 5승 ~ 10의 6승배 정도 빠르고 ssd보다 10의 4승 ~ 10의 5승배 정도 빠르다. 벤더사, 시기에 따라 나오는 차이는 제외하고 말이다.
ssd는 IC 칩으로 이루어져서, 전자적인 구조에 의해 속도가 느리다라고 밖에 표현을 못하겠다. 그러나 hdd는 체감이 와닿을 수가 있다. 이유야 너무나 당연하게도, 데이터를 찾는데 걸리는 시간이 오래걸려서이다. 메모리보다 용량이 커서 찾기에 어려운 것이 아니라 핀이 찾는데 오래걸리기 때문이다.
디스크가 1회전 하는데 소요되는 시간의 단위는 마이크르초부터 밀리초의 단위이다. 그리고 암이 특정 위치를 찍는 지점, 만약에 특정한 정렬이나 탐색 알고리즘을 이용해서 디스크가 불필요한 회전을 하게 될 경우 소요되는 시간은 더 필요하다.
또한 메모리에서 cpu, 디스크에서 cpu로 가는 데이터의 전송속도를 비교해보면 I/O 문제가 심각한 문제임을 알 수 있다.
이 결과는, hdpamr -tT /dev/sda를 입력한 결과이다. RAM은 1초당 1017.62MB를 읽었고, 디스크는 174.87MB를 읽었다. 이는, 거리도 거리이지만, 연결된 버스에서 오는 차이에서도 있기에 이런 결과가 나타났다. 즉, I/O문제는 큰일이다.
그래서 I/O 문제를 해결하는 방법은 크게 3가지이다.
1. 메모리를 증설해서 캐시 영역을 확보하면 해결이 될 것 같은가
2. 원래 데이터량이 너무 많았는가
3. 애플리케이션의 I/O 알고리즘을 변경할 필요가 있는가
등등 많겠지만,, I/O를 조정 하는 커널 변수 같은 건 있었지만 I/O만 다루는 글을 최근에 본 적이 없어서 적었다.