디스크 입출력 성능과 dd 명령어
운영중에 있는 서버가 갑자기 느려져서 서버의 입출력 성능을 측정하기 위해 dd명령어를 사용하게 되었고, 이에 대해 정리해보고자 한다.
디스크 I/O 성능이란?
디스크 I/O(Input/Output) 성능은 시스템 성능에 중요한 영향을 미치는 요소 중 하나이다. 특히 데이터베이스 서버나 파일 서버와 같이 디스크에서 데이터를 읽고 쓰는 작업이 많은 경우, I/O 성능이 병목이 될 수 있다.
디스크 I/O 성능이 낮으면 시스템 전체의 성능이 저하될 수 있으므로, 서버를 최적화하기 위해서는 디스크 I/O 성능을 파악하고 관리하는 것이 필수적이다.
디스크 I/O 성능을 측정하는 주요 지표는 다음과 같다:
- Throughput(처리량): 초당 처리할 수 있는 데이터의 양(예: MB/s).
- Latency(지연 시간): 디스크에 요청을 보내고 응답을 받을 때까지 걸리는 시간.
- IOPS(Input/Output Operations Per Second): 초당 처리할 수 있는 I/O 작업의 수.
dd 명령어란?
dd 명령어는 유닉스 계열 시스템에서 파일 변환 및 복사 작업에 자주 사용되는 명령어이다. 주로 디스크와 관련된 작업을 수행할 때 사용되며, 디스크 I/O 성능 측정에도 유용하게 활용할 수 있다. dd 명령어는 원본 데이터를 블록 단위로 읽어서 원하는 크기와 형식으로 변환 후 복사하는 기능을 제공한다.
기본적인 dd 명령어 구조
dd if=<input file> of=<output file> bs=<block size> count=<number of blocks>
- if=<input file>: 입력 파일을 지정한다. 일반적으로 /dev/zero 또는 /dev/random과 같은 특수 파일이 사용된다.
- of=<output file>: 출력 파일을 지정한다. 예를 들어, 디스크 파티션이나 특정 파일로 지정할 수 있다.
- bs=<block size>: 데이터를 한 번에 읽고 쓸 블록 크기를 지정한다.
- count=<number of blocks>: 읽고 쓸 블록의 개수를 지정한다.
dd 명령어를 사용한 디스크 I/O 성능 측정
dd 명령어를 사용하여 디스크의 읽기와 쓰기 성능을 간단히 테스트할 수 있다. 이를 통해 디스크의 처리량을 확인할 수 있으며, 아래 예시는 기본적인 성능 테스트 방법을 보여준다.
쓰기 성능 측정
아래 명령어는 디스크에 데이터를 쓰는 성능을 확인하기 위해 /dev/zero에서 1MB 크기의 블록을 1024번(총 1GB) 생성하여 특정 위치에 기록하며, 데이터가 캐시를 우회하여 직접 디스크에 쓰이도록 oflag=direct 옵션을 추가한다.
bash
코드 복사
dd if=/dev/zero of=testfile bs=1M count=1024 oflag=direct
위의 명령어에 대한 결과는 다음과 같다.
dd 명령어를 통해 1GB의 데이터를 1.3471초 동안 읽고 쓴 결과로, 총 1024개의 블록을 정상적으로 처리했음을 보여준다. 또한 초당 처리 속도는 797MB로, 이는 디스크가 1초에 797MB의 데이터를 기록할 수 있음을 의미한다.
읽기 성능 측정
디스크에서 데이터를 읽는 성능을 측정하기 위해 이전에 생성한 testfile을 읽어 데이터를 /dev/null(즉, 아무 것도 기록하지 않음)로 전송한다. 이를 통해 읽기 성능을 확인한다.
bash
코드 복사
dd if=testfile of=/dev/null bs=1M count=1024 iflag=direct
위의 명령어에 대한 결과는 다음과 같다.
이 결과는 dd 명령어로 1.1GB의 데이터를 0.30824초 동안 읽고 쓴 작업을 보여주며, 총 1024개의 블록을 정상적으로 처리했다는걸 보여준다. 또한, 평균 처리 속도는 3.5GB/s로, 이는 디스크가 1초에 3.5GB의 데이터를 읽을 수 있음을 의미한다.
결국에는 서버의 입출력 성능 문제가 아닌 다른 문제였지만, dd 명령어를 통해 디스크 입출력 성능을 측정하는 것은 좋은 경험이었다고 생각한다.
서버가 느린 이유는 여러 가지 원인이 있을 수 있으며, 성능 문제를 진단할 때는 입출력 성능뿐만 아니라 네트워크, 메모리, CPU 등 다양한 요소를 함께 고려해야 한다. 그래서 항상 모든 가능성을 열어두고 접근하는 것이 중요하다고 느낀다.