app C ++. com mmap mata o kernel? (kernel panic com mmap)

3

No meu programa C ++, onde ocorre o disco intensivo, a E / S de rede e até mesmo a computação da CPU, estou usando a região mapeada de memória como uma matriz.

Com dados muito pequenos, funciona bem. No entanto, quando eu corri o programa com dados muito grandes meu aplicativo falha. (Eu absolutamente entendo que o tamanho da região mmap não deve ser uma preocupação, porque o sistema operacional lidará com todas as E / S e buffering)

Eu não quero culpar o Linux por isso, mas eu gostaria de saber se existe algum caso 'mmap' se torna instável e pode fazer o sistema operacional falhar?

Quando o sistema operacional trava, na tela eu posso ver a mensagem kernel panic relacionada com algum blah blah 'write_back' ... (adicionarei a mensagem aqui assim que eu reproduzir o problema)

// O programa usa operações de rede MPI sobre a região mapeada de memória (Intel MPI com RDMA do Infiniband habilitado) onde o RDMA possivelmente ignora o kernel do sistema operacional e grava diretamente alguns dados na memória.

Eu investiguei o callstack e encontrei alguns códigos de kernel: ( link )

Eu acho que os erros vêm da armadilha 'BUG_ON' em # L2386 BUG_ON (PageWriteback (page)); A versão do kernel é 3.19.0 ( link )

    
por syko 16.02.2016 / 21:10

2 respostas

2

Você não pode um kernel panic através do uso indevido de qualquer chamada de sistema, mmap incluído. A interface syscall não fornece ao chamador os meios para corromper as estruturas de dados do kernel.

Eu procuraria por um problema de hardware e prestaria muita atenção a quaisquer pistas nos registros do sistema, por exemplo, %código%. Como um experimento, eu tentaria mapear o mesmo arquivo de tamanho em um sistema de arquivos diferente, porque o disco é o componente mais provável para falhar.

É possível que você fez um bug no kernel. Uma busca rápida por writeback e pânico aparece [este bug antigo]. 1 Se você estiver executando um kernel muito antigo, com certeza, provavelmente é hora de atualizar.

    
por 17.02.2016 / 01:28
1

Pela descrição em cooments, o seu é um crash do kernel (panic). Definitivamente, nunca acontecerá .

Qual distribuição é essa? Qual versão do kernel? Arquitetura?

Primeiro atualize tudo. Se a sua distribuição for Fim de Vida, atualize. Então tente novamente.

Se persistir, você deve ser capaz de fazer isso reproduzível com um pequeno programa em C, que faz o enorme mmap() como seu programa C ++ faz, e repetir naquela memória uma dança similar à do C ++ (talvez apenas tentando o acesso "longe disso" é suficiente. Reúna tudo e denuncie através do canal de relatórios de erros da sua distribuição.

    
por 17.02.2016 / 01:04