성능 지표(IOPS) 를 알아보자(2)
저번 IOPS 측정 방법 시간에 이어, 추가적인 내용을 작성하고자 합니다.
이전 시간의 내용을 참고해보면, "IOPS 는 블록사이즈와 반비례 한다" 라고 전달드렸습니다.
그럼, 성능 측정을 하기위해 애플리케이션이 발생시키는 file I/O 의 블록 크기를 측정해야 하는데요.
이번 시간에는 블록 사이즈를 측정하는 방법에 대해 알아보겠습니다.
피드백은 언제나 환영 입니다.
#.테스트 시나리오
1. dd 를 통한 빈 파일 생성
2. blktrace를 활용하여 블록 디바이스 트래픽 추적
3. 결과 확인
1. dd 를 통한 빈 파일 생성
먼저, dd 명령은 무엇일까요?
[root@ip-10-0-131-237 ~]# whatis dd
dd (1) - convert and copy a file
그러면, 해당 명령어를 통해 빈 파일을 생성함과 동시에, blktrace로 트래픽을 추적하겠습니다.
dd if=/dev/zero of=./file_2 bs=4K count=100000
4K 블록을 100,000 번 수행하여 file_2 라는 파일을 생성해보겠습니다.
100000+0 records in
100000+0 records out
409600000 bytes (410 MB, 391 MiB) copied, 3.49065 s, 117 MB/s
392MB의 파일이 생성되었습니다.
2. blktrace 를 통한 트래픽 추적
[root@ip-10-0-131-237 ~]# whatis blktrace
blktrace (8) - generate traces of the i/o traffic on block devices
※ 주의점, dd 를 통한 빈 파일 생성 명령어를 추적을 해야 하므로, 다른 터미널에서 아래 명령어를 동시에 실행해주세요.
[root@ip-10-0-131-237 ~]# blktrace -d /dev/xvda4 -o - | blkparse -i -
-d 옵션 뒤에는, 파일이 생성될 파티션 이름, blktrace 로 추적된 바이너리 정보를 blkparse 를 통해 읽습니다.
해당 명령어를 실행하면 추적 결과를 아래와 같이 보실 수 있습니다.
I/O 발생 CPU 번호, 이벤트 시퀀스, 타임스탬프, PID, 이벤트 타입, 블록번호와 길이 등이 보이네요.
여기서 블록 사이즈를 알기 위해선.. 블록번호와 길이 (ex. 4945936 + 256) 을 봐야 합니다.
해당 섹터에 +256 (섹터 단위) 를 Write 한다 라고 이해할 수 있겠네요.
그러면, 해당 디스크의 섹터 단위는 어디서 확인 할 수 있을까요?
[root@ip-10-0-131-237 ~]# fdisk -l
Disk /dev/xvda: 10 GiB, 10737418240 bytes, 20971520 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: D209C89E-EA5E-4FBD-B161-B461CCE297E0
해당 디스크는 1 섹터가 512 byte 라는 것을 알 수 있습니다.
결론적으로, 256 * 512 / 1024 = 128 KB 임을 알 수 있습니다.
근데, 여기서 의문점이 있습니다.. 분명 dd 를 통해 빈파일 생성 시, 4K 사이즈 단위의 블록을 생성한다고 했는데, 왜 128KB 씩 생성 했을까요?
이 부분은 sysfs 파라미터를 보면 알 수 있습니다.
3. 결과 확인
[root@ip-10-0-131-237 queue]# cat /sys/block/xvda/queue/max_sectors_kb
128
max_sectors_kb 파라미터의 값을 통해 원인을 알 수 있었습니다.
해당, 파라미터는 리눅스 커널에서 I/O 요청의 최대 크기를 조정하는 데 사용되는 파라미터 입니다.
단일 I/O 요청으로 디스크에 보낼 수 있는 최대 데이터 크기를 결정 할 수 있습니다.
* 해당 파라미터는 sysctl 명령어를 통해 관리되지 않습니다.
sysfs 인터페이스를 통해 관리되며, 해당 인터페이스는 특정 하드웨어나 커널 서브시스템 관련 설정을 제공합니다.
위 값을 조정해보십니다.
[root@ip-10-0-131-237 queue]# echo 4 > /sys/block/xvda/queue/max_sectors_kb
그리고, 테스트를 다시 수행하면 우리가 원했던 4K 블록 사이즈 Write 트래픽이 발생됨을 보실 수 있습니다.
이번 시간을 통해, blktrace 를 통해 트래픽을 추적해보고, 블록 사이즈를 실제 확인해 보는 시간을 가졌습니다.
오늘도 감사합니다.