descubra qual processo está enviando a solicitação io atual no kernel linux

1

Eu tenho mergulhado no kernel do Linux. e gostaria de rastrear uma solicitação do io e descobrir exatamente qual processo enviou a solicitação io atual?

Existe uma estrutura chamada corrente que a documentação do kernel diz que representa o processo atual.

No entanto, analisando a função printk no bloco / blk-core.c na função submit_bio , parece que este não é o processo atual.

Meu printk é este:

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);

No entanto, a saída dele não é o que eu esperava:

[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)

a saída diz que o processo atual é jbd2 . De acordo com esta resposta jbd2 é uma função executada pelo sistema de arquivos. Em contraste com isso, meu processo foi dd com pid: 2479.

Como posso encontrar exatamente qual processo enviou a solicitação io atual? algo como iotop está fazendo.

    
por mR.aTA 01.01.2016 / 11:37

1 resposta

2

Uma solicitação de E / S de disco não pode, em geral, ser rastreada para um processo específico. Por exemplo, se dois processos acessam o mesmo arquivo ao mesmo tempo (ou seja, o processo 1 emite uma solicitação e o processo 2 emite uma solicitação para carregar o mesmo arquivo antes que a solicitação do processo 1 seja processada), o acesso precisaria ser rastreado de volta para ambos os processos. Com as gravações atrasadas, uma gravação pode ser devido a um processo que não existe mais.

O que o iotop mostra para cada processo é E / S no nível arquivo , não no nível do disco. Se você estivesse olhando para um driver do sistema de arquivos, current designaria o processo que fez a solicitação. Mas você está olhando para um driver de dispositivo de bloco; a menos que um processo esteja acessando o disco diretamente (ignorando qualquer sistema de arquivos), as solicitações de E / S serão provenientes de um subsistema interno. Esta é a razão pela qual as estatísticas por processo do iotop não correspondem ao total : o total é para o nível do disco.

O rastreamento de uma solicitação de E / S de disco para o processo que causou isso é impossível em geral, como vimos acima. Não sei se há um modo de depuração que permita esse rastreamento nos casos em que isso é possível; Eu esperaria que fosse muito consumidor de recursos.

    
por 02.01.2016 / 03:40