나는 찾고 있었고 모두가 /proc/diskstats 파일을 설명하지만 이 데이터의 출처를 설명하는 사람은 아무도 없는 것 같습니다.
제가 찾은 댓글은 다음과 같습니다.
Just remember that /proc/diskstats is tracking the kernel’s read requests–not yours.
이 페이지에서:
https://kevinclosson.net/2018/10/09/no-proc-diskstats-does-not-track-your-physical-i-o-requests/
하지만 기본적으로 내 문제는 블록 장치를 생성하고 dm과 마찬가지로 blk_init_queue 대신 blk_queue_make_request에 의해 설정된 요청 핸들러를 통해 요청을 처리하는 커널 모듈이 있다는 것입니다. 그리고 커널이 요청을 대기열에 추가하는 것을 원하지 않습니다.
모든 것이 잘 작동하지만 /proc/diskstats에 아무 것도 표시되지 않습니다. iostat에 표시되도록 통계를 거기에 두는 데 제가 놓치고 있는 것은 무엇입니까? 나는 커널이 커널 모듈에 대한 요청을 처리하고 있기 때문에 이 정보를 계산하고 있다고 가정했지만 분명히 그렇지 않았습니다. 아니면 어딘가에 깃발이 없습니다.
어떤 아이디어가 있나요?
답변1
통계 파일의 이름은 다음과 같습니다.디스크대신에 통계블록 개발통계 또는 유사한 데이터. 이것은 단서입니다. 통계는 구조를 정보 소스로 사용하는 diskstats_show()
in 에 의해 출력됩니다 .block/genhd.c
struct gendisk
블록 장치를 생성했지만 이는 일반 디스크의 첫 번째 단계일 뿐입니다. s는 일반적으로 장치 드라이버가 제공하는 모든 부 번호에 할당되며 alloc_disk()
장치 드라이버가 처리하는 각 디스크의 기본 속성을 지정한 후에 지정됩니다.struct gendisk
add_disk()
하지만 대기열에 넣고 싶지 않다고 하셨기 때문에 해당 부분을 건너뛰고 기본 블록 장치만 받으셨을 것입니다. 글쎄, 당신은 당신이 원하는 것을 얻습니다. 사실 기본 블록 장치는 다음과 같습니다.그래서린 앤 비열함, 당신은 통계를 처리하는 데 시간을 소비할 필요조차 없습니다.너모듈에서 이 작업을 수행하도록 하세요.
귀하의 드라이버는 / 프레임워크 /proc/diskstats
에 참여할 때만 디스크를 획득하는 것으로 보입니다 . 사용하고 싶지 않다면 직접 통계를 수집해야 할 것 같습니다.gendisk
genhd
자세한 내용은 다음이 도움이 될 수 있습니다.https://olegkutkov.me/2020/02/10/linux-block-device-driver/
답변2
그래서 찾아보니... 커널이 도우미 기능을 제공하는 것 같더군요...
request_queue, bio 및 gendisk가 필요합니다. io를 처리하기 전후에 이들을 호출하세요...
unsigned long start_time;
start_time = jiffies;
generic_start_io_acct(q, bio_op(bio), bio_sectors(bio), &gd->part0);
generic_end_io_acct(q, bio_op(bio), &gd->part0, start_time);
짜잔, 통계 및 블록 장치가 iostat에 표시되기 시작합니다.