나는 리눅스 커널을 깊이 파고들었습니다. io 요청을 추적하고 현재 io 요청을 보낸 프로세스가 정확히 무엇인지 알고 싶으십니까?
커널 문서에 따르면 현재 프로세스를 나타내는 current라는 구조가 있습니다.
그러나 분석인쇄block/blk-core.c의 기능이력서 제출이는 현재 프로세스가 아닌 것 같습니다.
내 거인쇄이것은:
printk(" Ata: in block/blk-core.c in submit_bio current task: %s pid:(%d): %s block %Lu on device %s (%u sectors)\n",
current->comm, task_pid_nr(current),
(rw & WRITE) ? "WRITE" : "READ",
(unsigned long long)bio->bi_iter.bi_sector,
bdevname(bio->bi_bdev, b),
count);
그러나 출력은 내가 예상한 것과 다릅니다.
[Thu Dec 31 15:18:49 2015] Ata: in block/blk-core.c in submit_bio current task: jbd2/sda1-8 pid:(494): WRITE block 54798672 on device sda1 (8 sectors)
출력은 현재 프로세스가제바드 2. ~에 따르면이 답변 제바드 2파일 시스템이 실행하는 기능입니다. 그에 비해 내 프로세스는DDPID: 2479.
현재 io 요청을 보낸 프로세스를 정확하게 찾는 방법은 무엇입니까? 그것은 마치오토프하고있다.
답변1
디스크 I/O 요청은 특정 프로세스를 추적할 수 없는 경우가 많습니다. 예를 들어 두 프로세스가 동시에 동일한 파일에 액세스하는 경우(즉, 프로세스 1의 요청을 처리하기 전에 프로세스 1이 요청하고 프로세스 2가 동일한 파일을 로드하도록 요청한 경우) 액세스를 다시 추적해야 합니다. 두 프로세스 모두. 지연된 쓰기의 경우 더 이상 존재하지 않는 프로세스로 인해 쓰기가 발생할 수 있습니다.
iotop은 프로세스당 I/O를 표시합니다.문서디스크 수준이 아닌 수준입니다. 파일 시스템 드라이버를 보면 current
요청한 프로세스가 지정됩니다. 그러나 블록 장치 드라이버를 보고 있는 경우 프로세스가 파일 시스템을 우회하여 디스크에 직접 액세스하지 않는 한 I/O 요청은 내부 하위 시스템에서 발생합니다. 그렇기 때문에iotop에 대한 프로세스별 통계가 총계와 일치하지 않습니다.:총계는 디스크 수준에 대한 것입니다.
위에서 본 것처럼 일반적으로 요청을 발생시킨 프로세스까지 디스크 I/O 요청을 추적하는 것은 불가능합니다. 가능하다면 이런 종류의 추적을 허용하는 디버그 모드가 있는지는 모르겠습니다. 매우 리소스 집약적일 것으로 예상됩니다.