fio의 ioDeepth와 대기열 저장 깊이가 동일합니까? 그렇다면 fio 명령에서 iolength 매개변수를 사용하여 대기열 깊이를 제어하는 방법은 무엇입니까? 이는 병렬 작업을 생성하지만 작업을 병렬로 실행하는 옵션도 있습니다(이것은 사소하거나 충돌이 아닌가요?)
나는 fio가 작업 부하를 어떻게 제어하는지(특히 이 io 깊이에서) 이해하려고 애쓰고 있습니다. ioDeepth 매개변수에 대해 자세히 설명해 줄 수 있는 사람이 있나요?
업데이트 #1
내 문제도유연한 I/O 테스터 포럼에 질문하기. 제가 거기서 받은 답변은 이렇습니다.
안녕하세요,
2018년 7월 28일 14:26에 Jeevan Patnaik은 다음과 같이 썼습니다. 안녕하세요,
fio의 IoDepth와 대기열 저장 깊이가 동일합니까? 따라서 fio에서 iolength 매개변수를 사용하여 대기열 깊이를 제어하는 방법은 무엇입니까?
fio iolength와 운영 체제에서 I/O를 스토리지에 커밋하여 달성한 I/O 깊이는 서로 관련되어 있지만 대부분의 경우 반드시 동일할 필요는 없으며 관계는 운영 체제/스토리지/사용량에 따라 크게 달라집니다. fio ioengine/fio 매개변수. 기본적으로 fio는 특정 방식으로 운영 체제에 I/O를 제출합니다. 운영 체제에 I/O를 제출하는 방법에 따라 더 최적화된/다른 방식으로 제출하도록 선택할 수 있습니다(예: 요청 일괄 처리, 너무 큰 요청을 더 작은 부분으로 나누기, I/O 지연 등). .)). 추가적으로, 에서 언급한 것처럼어떻게, iolength는 async ioengine에만 영향을 미칩니다(텍스트에는 Linux에서 direct=1을 사용해야 한다는 경고가 포함되어 있습니다).
주문하다? 이는 병렬 작업을 생성하지만 작업을 병렬로 실행하는 옵션도 있습니다(이것은 사소하거나 충돌이 아닌가요?)
간단한 요약을 하겠지만 캐시/미리 읽기/삽입/블록 장치 계층(예: RAID/LVM) 등을 다루려는 것은 아닙니다.
동기식 fio I/O 엔진은 단일 I/O를 운영 체제에 제출하고, 수신된 대로 "승인"될 때까지 기다린 다음 다른 I/O를 보내는 등의 작업을 수행합니다.
fio I/O 엔진이 진정한 비동기 방식으로 운영 체제에 I/O를 제출할 수 있다면(위 링크 참조), 핵심은 이전 I/O가 " 새로운 입력/출력을 커밋하기 전에 "승인됨"이 발생합니다. ioDeepth가 1일 경우 동기 I/O 엔진처럼 동작해야 합니다. 그러나 작업이 io 깊이를 32로 지정한다고 가정합니다. 이 경우 최대 32개의 I/O가 처리되고 fio는 더 많은 I/O를 커밋하기 전에 대기하도록 선택합니다(워터마크가 무엇인지, 특정 시간에 커밋된 개수가 무엇인지). 타이밍은 iolength_batch_* 옵션에 의해 제어됩니다. 이는 효율성을 향상시키고 더 높은 처리량을 달성할 수 있지만 일반적으로 대기 시간이 길어집니다.
fio는 병렬성을 생성하지 않습니다페오 직업io뎁스 때문에 병렬 fio 작업을 사용하는 것은 주어진 시간에 제출된 동시 I/O의 양을 늘리는 또 다른 방법이며(다른 스레드/프로세스를 사용하여) 동일한 장치에서 두 가지를 모두 사용하면 동시에 작동합니다(따라서 두 개가 있는 경우 io 깊이 16에서 비동기 I/O를 제출하는 fio 작업의 경우 각 작업은 실제로 주어진 시간에 32개의 I/O를 받을 수 있습니다. 두 가지를 결합하는 이유가 있을 수 있습니다(예: 여러 장치가 있고 속도가 너무 빨라 I/O가 비동기적으로 제출되더라도 하나의 CPU가 따라잡을 수 없음).
나는 fio가 작업 부하를 어떻게 제어하는지(특히 이 io 깊이에서) 이해하려고 애쓰고 있습니다. ioDeepth 매개변수에 대해 자세히 설명해 줄 수 있는 사람이 있나요?
나는 당신이 stackexchange에서도 이 질문을 했다는 것을 기억할 것입니다(fio에서 ioDeepth는 정확히 무엇입니까?). 당신은 링크를 원할 수도 있습니다 https://www.spinics.net/lists/fio/msg07190.html비슷한 문제가 있는 다른 사람들을 돕기 위해...
답변1
이건 작은 일이 아닌가?
직접 IO를 가정하면 iolength= 작업의 필요에 따라 작동합니다.
iolength=2인 순차 작업은 한 번에 두 개의 순차 IO 요청을 제출합니다.
numjobs=2인 순차 작업에는 두 개의 스레드가 있으며 각 스레드는 순차 IO를 제출합니다.
이는 서로 다른 IO 모드입니다. 후자는 장치 캐싱으로 인해 물리적 IO가 다시 1배로 감소하더라도 IO 버스에서 2배의 대역폭을 생성합니다. (장치 캐싱으로 인해 여러 파일과 임의 파일을 사용하지 않는 한 두 작업이 동기화 상태를 유지하는 경향이 있는 것 같습니다 file_service_type=
.) IO가 동기식으로 기록되는 경우(sync=true), 장치가 비정상적인 수준의 최적화(예: 중복 제거 SSD 컨트롤러)를 수행하지 않는 한 물리적 IO는 전혀 줄어들지 않습니다.
답변2
~에 따르면리눅스 커널 문서:
.. 옵션::io깊이=int
파일에 대해 계속 실행되는 I/O 단위 수입니다. 추가되니 참고하세요깊이1을 초과하면 동기화된 ioengine에 영향을 미치지 않습니다(
verify_async
:option:을 사용할 때 작은 수준 제외). 비동기 엔진이라도 원하는 깊이를 달성하지 못하게 하는 운영 체제 제한을 적용할 수 있습니다. 이는 Linux에서 libaio를 사용하고direct
해당 운영 체제에서 버퍼링된 I/O가 비동기식이 아니기 때문에 :option: \=1이 설정되지 않은 경우 발생할 수 있습니다. fio 출력의 I/O 깊이 분포를 주의 깊게 관찰하여 달성된 깊이가 예상한 대로인지 확인하세요. 기본값: 1.
이 튜토리얼의 제목은 다음과 같습니다.Fio 출력 설명다음과 같은 예가 있습니다.
Fio에는 주어진 시간에 운영 체제에 발행되는 IO의 양을 제어하는 iolength 설정이 있습니다. 이는 전적으로 애플리케이션 측이므로 장치의 IO 대기열과 구별됩니다. 이 예에서는 iolength가 1로 설정되어 있으므로 IO 깊이는 항상 1 100%입니다.
submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0% complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
제출 및 완료는 각각 fio가 한 번에 제출한 IO 수와 한 번에 완료된 수를 나타냅니다. 이 출력을 생성하는 데 사용된 flutter 테스트의 경우 iolength의 기본값은 1이므로 IO의 100%가 한 번에 하나씩 커밋되어 결과를 버킷 1-4에 넣습니다. 기본적으로 이는 io깊이가 1보다 큰 경우에만 중요합니다.