fio: 파일 시스템 블록 크기가 1보다 작은 bs를 테스트하는 방법은 무엇입니까?

fio: 파일 시스템 블록 크기가 1보다 작은 bs를 테스트하는 방법은 무엇입니까?

SSD를 테스트 중인데 두 가지 질문이 있습니다.

  1. SNIA에서 사양을 공개했습니다.PTS(스니아)SSD를 테스트합니다. 많은 경우 장비는 bs=0.5Ki로 테스트되어야 합니다! 이것의 근거는 무엇입니까? 제가 올바르게 이해했다면 여기서의 목적은 1 블록 크기 미만의 IO 성능을 평가하는 것입니다. 제가 이해한 내용이 틀렸다면 정정해 주시기 바랍니다.

  2. fio를 사용하여 이 시나리오를 테스트하는 방법은 무엇입니까? fio는 bs가 파일 시스템 블록 크기에 맞춰 정렬될 것으로 예상하기 때문이라고 생각합니다. 예를 들어 제 경우에는 다음 오류로 인해 실패했습니다.

    [root@system pwd]# /bin/fio --name=iops-wdpc --direct=1 --ioengine=libaio --bs=512 --size=1024Gi --numjobs=1 --thread=1 --iodepth=1 --output=op --allow_mounted_write=1 --filename=/dev/nvme2n1 --rw=write

    fio: io_u error on file /dev/nvme2n1: Invalid argument: write offset=6295552, buflen=512

(내 파일 시스템 블록 크기는 4Ki입니다.)

[root@system pwd]# tune2fs -l /dev/nvme2n1 | grep -i 'block size'
Block size:               4096

(fio는 bs=512, 1024, 2048에는 적용되지 않지만 bs=4096에는 적용됩니다)

[root@system ~]#  /bin/fio --name=iops-wdpc --direct=1 --ioengine=libaio --bs=512 --size=1024Gi --numjobs=1 --thread=1 --iodepth=1 --output=op --allow_mounted_write=1 --filename=/dev/nvme2n1 --rw=write
fio: io_u error on file /dev/nvme2n1: Invalid argument: write offset=6295552, buflen=512
[root@system ~]# 
[root@system ~]#  /bin/fio --name=iops-wdpc --direct=1 --ioengine=libaio --bs=1024 --size=1024Gi --numjobs=1 --thread=1 --iodepth=1 --output=op --allow_mounted_write=1 --filename=/dev/nvme2n1 --rw=write
fio: io_u error on file /dev/nvme2n1: Invalid argument: write offset=6295552, buflen=1024
[root@system ~]#
[root@system ~]#  /bin/fio --name=iops-wdpc --direct=1 --ioengine=libaio --bs=2048 --size=1024Gi --numjobs=1 --thread=1 --iodepth=1 --output=op --allow_mounted_write=1 --filename=/dev/nvme2n1 --rw=write
fio: io_u error on file /dev/nvme2n1: Invalid argument: write offset=6295552, buflen=2048
[root@system ~]#
[root@system ~]#  /bin/fio --name=iops-wdpc --direct=1 --ioengine=libaio --bs=4096 --size=1024Gi --numjobs=1 --thread=1 --iodepth=1 --output=op --allow_mounted_write=1 --filename=/dev/nvme2n1 --rw=write
^C[root@system ~]# ^C3%][r=0KiB/s,w=147MiB/s][r=0,w=37.7k IOPS][eta 01h:57m:58s]

(파이오 버전)

[root@smartiops ~]# /bin/fio --version
fio-3.1

답변1

(이 글을 쓰면서 설정이 걱정되기 시작했습니다. 마지막에 굵은 글씨를 참조하세요)

사용direct=1O_DIRECT이 플래그는 스택의 낮은 수준이 플래그를 무시하지 않을 때 정렬 및 크기 제한이 있는 Linux에서 켜집니다 (참조:자세한 내용은 매뉴얼 페이지 O_DIRECT의 정보를 참조하세요.open(2)). 블록 장치에 대한 I/O를 수행 하는 경우 O_DIRECT디스크 논리 블록 크기의 배수인 블록 크기를 사용해야 합니다. NVMe의 경우 일반적으로 4096바이트이지만 장치 구성에 따라 다른 값이 사용될 수 있습니다.

많은 경우 장비는 bs=0.5Ki로 테스트되어야 합니다! 이것의 근거는 무엇입니까?

SSD가 처음 소개되었을 때 모방되는 경우가 많았습니다(참조:512e) 512바이트 논리 블록 크기/섹터를 가정한 이전 소프트웨어의 손상을 방지하기 위해 당시 하드 드라이브의 논리 블록 크기를 조정했지만 이로 인해 I/O가 제대로 정렬되지 않으면 성능이 저하될 수 있습니다(다음 참조).Solaris의 4K 섹터 지원에 대한 슬라이드). 시간이 지남에 따라 많은 장치는 기본적으로 이러한 작은 블록 크기를 에뮬레이트하지 않았습니다. SNIA/지침 작성자와 최신 최소 블록 크기에 대해 논의할 수 있습니다(512바이트 성능은 시간이 지남에 따라 흥미가 떨어집니다).

내가 여기서 뭘 잘못하고 있는 걸까?

당신이 잘못한 것은 없습니다. 단지 주어진 블록 장치에 대한 사용 규칙을 위반할 수 없다는 것입니다 O_DIRECT(I/O는 잘 정렬되어야 하며 디스크의 논리적 블록 크기의 배수여야 합니다).

fio: 파일 시스템 블록 크기가 1보다 작은 bs를 테스트하는 방법은 무엇입니까?

filename=/dev/nvme2n1fio 작업 설명에 블록 장치( )를 사용할 것이라고 나와 있고 Linux 파일 시스템을 다루지 않을 것이라고 계속해서 "파일 시스템"을 언급하는 것이 이상합니다 (이는 특정 유형의 테스트에 매우 합리적인 것입니다). 귀하의 명령이 혼란스러운 결과를 반환할 수 있습니다(파일 시스템 정보를 반환하기 때문입니다!). 최상위에 ext* 파일 시스템이 있는 항목에 대해서만 있는 그대로 tune2fs사용 하려는 것 같습니다 .../sbin/blockdev --getss <device>tune2fs

...이제 설정이 걱정됩니다.감당할 수 있는 것보다 더 많은 데이터가 있는 시스템에서 블록 장치에 대한 I/O를 수행하는 경우영구적이고 되돌릴 수 없게 파괴됨중지하십시오그리고 "활성" 파일 시스템이 있는 블록 장치에 대해 fio 블록 장치 액세스를 수행하면 안되는 이유를 이해하는 데 시간을 좀 투자하세요. 경고해서 죄송합니다. 말씀하신 내용 중 일부는 심각한 혼란을 암시하며 데이터가 위험에 처해 있는 경우...맙소사, 방금 그렇게 하시는 걸 봤습니다.--allow_mounted_write=1. 내가 말할 수 있는 건 당신이 하는 일이 마치위험한이상한 결과 및/또는 시스템 충돌이 발생할 수 있습니다. 보안 장벽을 넘을 때 계속하기 전에 몇 가지 배경 정보를 읽어 더 잘 이해할 것을 권장합니다.

명령의 의도가 정확하다고 가정하고 "어떻게 직접 대상을 지정합니까?"를 의미하는 경우장비블록 크기가 장치의 논리적 블록 크기보다 작습니다." 대답은 다음과 같습니다.당신은 할 수 없습니다. 장치의 논리 블록 크기는 장치가 운영 체제에 노출하는 주소 지정이 가능한 가장 작은 단위이며, 논리 블록 크기는 4096바이트입니다. 512바이트 블록을 광고하도록 장치를 재구성할 수 있지만 이를 수행하는 방법을 장치 공급업체에 문의해야 합니다(성능 비용이 발생할 수 있음).

관련 정보