É possível ver no Linux quantas solicitações de leitura e gravação do espaço do usuário acabam causando acertos e falhas no cache de dispositivos de bloco?
Você pode desenvolver seu próprio script SystemTap . Você precisa considerar os dois subsistemas a seguir:
O desenvolvimento do SystemTap leva algum tempo para aprender. Se você é um desenvolvedor moderado e possui bons conhecimentos em Linux, isso deve ser feito em 3 a 4 dias. Sim, leva tempo para aprender, mas você ficará muito feliz com os resultados - o SystemTap oferece a oportunidade de colocar (com segurança) sondas em praticamente qualquer lugar do kernel do Linux.
Observe que seu kernel deve ter suporte para carregar e descarregar módulos do kernel. Atualmente, a maioria dos núcleos de estoque suporta isso. Você também precisará instalar os símbolos de depuração para o seu kernel. Para o meu sistema Ubuntu, isso foi tão fácil quanto o download de um arquivo .deb de várias centenas de MB, que a equipe de desenvolvimento do kernel do Ubuntu compilou para mim. Isso é explicado na página Wiki do SystemtapOnUbuntu , por exemplo.
PS Adote a abordagem SystemTap apenas se você não tiver outra solução, porque é uma estrutura totalmente nova que você precisa aprender e que custa tempo / dinheiro e, às vezes, frustração.
Fui em frente e escrevi um script stap para isso. Existe um no wiki systemtap, mas ele não parece estar correto. Nos testes básicos, isso parece bastante preciso, mas YMMV.
fonte
semantic error: unable to find member 'bi_size' for struct bio (alternatives: bi_next bi_bdev bi_flags bi_rw bi_iter bi_phys_segments bi_seg_front_size bi_seg_back_size bi_remaining bi_end_io bi_private bi_ioc bi_css bi_integrity bi_vcnt bi_max_vecs bi_cnt bi_io_vec bi_pool bi_inline_vecs): operator '->' at /usr/share/systemtap/tapset/linux/ioblock.stp:113:20 source: size = $bio->bi_size ^ Pass 2: analysis failed. [man error::pass2]
você pode ajudar?/ proc / slabinfo é um bom começo, mas não fornece as informações que você procura (não se deixe enganar pelas porcentagens de acertos / perdidos em sistemas com vários núcleos e estatísticas ativadas; essas são outras coisas). Até onde eu sei, não há uma maneira de extrair essa informação específica do kernel, embora não deva ser terrivelmente difícil escrever um pouco de código para fazer.
Edit: http://www.kernel.org/doc/man-pages/online/pages/man5/slabinfo.5.html
fonte
Agora existe o utilitário cachestat do pacote perf-tools .
O autor também lista algumas alternativas (possivelmente mais cruéis) que as pessoas usam:
fonte
Se você estiver interessado na proporção de erros / falhas de E / S de um processo específico, uma abordagem simples, mas muito eficaz, é ler o
/proc/<pid>/io
arquivo.Aqui você encontrará 4 valores-chave:
rchar
: o número total de bytes de leitura do ponto de vista do aplicativo (ou seja: sem diferença entre a leitura satisfeita do armazenamento físico e não do cache)wchar
: como acima, mas sobre bytes escritosread_bytes
: os bytes realmente leram do subsistema de armazenamentowrite_bytes
: os bytes realmente gravados no subsistema de armazenamentoDigamos que um processo tenha os seguintes valores:
A taxa de erros de cache de leitura (em bytes) é
100*200000/1000000 = 20%
e a taxa de acertos é100-20 = 80%
No entanto, há um problema: o
rchar
valor inclui tty IO, portanto, para processos que lêem / gravam muito de / para um canal, o cálculo acima será distorcido, relatando uma taxa de acerto mais alta que a efetiva.fonte