최근에 접한Linux 빈 블록 장치 드라이버,, null_blk
또한 특정 블록 장치에 대한 벤치마킹이 아닌 I/O 스택을 벤치마킹하고 있습니다. 이 드라이버에서 생성된 장치( /dev/nullb0
예를 들어 장치 이름을 사용함)는 매우 흥미롭습니다. 특히 /dev/null
장치 이름이 유사하다는 점을 고려하면 더욱 그렇습니다. Stackoverflow에서 이 주제에 대한 기존 질문을 찾을 수 없었기 때문에 설명을 요청하기로 결정했습니다.
내 주요 질문은 다음과 같습니다./dev/null
장치 드라이버에서 생성된 블록 장치와 차이점은 무엇입니까 null_blk
?
지금까지 몇 가지 차이점을 발견했습니다.
- 첫째, (내가 이해하는 한) 빈 장치는
/dev/null
드라이버를 거치지 않습니다. 그러나 그 아래에 생성된 장치는null_blk
데이터가 통과해야 하는 실제 블록 드라이버입니다. 또한fio
두 장치 모두에서 실행하여/dev/null
무작위 읽기 IOPS 및 커밋 대기 시간 측면에서 성능이 더 우수하다는 사실을 확인했습니다. /dev/null
둘째, 읽으면 EOF(예: )가 생성된다는 것을 알고 있지만cat /dev/null
시도하면cat /dev/nullb0
EOF가 반환되지 않고 중단됩니다.- 또한 참고로 커널 문서에는 구성 매개변수가 언급되어 있지만 유사한 구성 옵션은
null_blk
표시되지 않습니다 ./dev/null
비슷한 이름이라도 큰 차이가 있는 것 같습니다. 이러한 차이점에 대해 더 공식적인 통찰력이나 설명을 제공할 수 있는 사람이 있습니까? 감사해요!
답변1
/dev/null
예장치 드라이버에 의해 처리되지만이것은 매우 간단합니다..
/dev/null
와 의 주요 차이점은 null_blk
전자는 캐릭터 디바이스이고 후자는 블록 디바이스라는 점입니다. 이전의프로세스 문자 시퀀스장치를 사용하는 시스템 호출과 드라이버에서 해당 작업을 구현하는 코드 사이에 많은 간접적인 작업 없이 이를 사용하는 프로그램이 호출하는 작업을 직접 구현합니다. 후자의더 복잡한, 전체 섹터에서 실행되고 명령 대기열 등을 지원합니다. 단일 요청을 처리하는 데에는 더 많은 작업이 필요합니다.
물론 목적에도 큰 차이가 있습니다. /dev/null
실제 직접 사용을 위한 것이지만 null_blk
블록 장치 처리 스택의 다른 부분을 벤치마킹하려는 커널 개발자를 위한 지원 기능입니다.
답변2
/dev/null
"문자 장치"이므로 모든 읽기는 null을 반환하고 모든 쓰기는 추가 부작용 없이 완전히 완료됩니다. 이는 1974년 V5 UNIX 이후의 의미 체계이며 POSIX에 의해 시행됩니다. 이를 매개변수화할 매개변수가 없습니다.
드라이버에 의해 생성된 장치는 null_blk
"블록 장치"입니다. 즉, 크기와 캐시가 고정되어 있음을 의미합니다. 제공된 장치는 null_blk
모든 쓰기를 무시하고 모두 0을 반환하므로 /dev/zero
.
/dev/null
제공되는 장치와 목적 null_blk
은 다릅니다. /dev/null
0(읽기용) 또는 쓰기 크기(쓰기용)를 반환하는 것이 전부이기 때문에 극도로 최적화되어 있습니다. 그와는 반대로 매문서,null_blk
다양한 블록 레이어 구현을 벤치마킹하기 위해
이는 요청이 실제인 것처럼 관련 I/O 요청 관리 코드를 실행한다는 의미입니다.그때야실제로 읽기/쓰기 작업을 수행하지 않고 요청을 완료된 것으로 표시합니다. 이는 요청당 더 많은 작업을 수행 /dev/null
하고 fio
결과를 해석해야 함을 의미합니다.