As figuras em / proc / pid / io incluem paginação e troca de E / S?

1

Eu sei que:

  • paginação e troca é feita para / do disco
  • / proc / io fornece informações de E / S de disco

No entanto, não tenho certeza se / proc / < pid > / io inclui E / S que deveria ser feito na RAM, mas foi para o disco por causa de paginação e troca. As figuras em / proc / < pid > / io incluem paginação e troca de E / S?

    
por toliveira 08.01.2017 / 18:36

1 resposta

2

Eu fiz a mesma pergunta, então decidi realizar alguns experimentos com o uso de swap e contabilidade de I / O.

Eu escrevi um programa simples, que apenas solicita uma grande quantidade de memória e preenche os dados:

#include <malloc.h>
#include <string.h>
#include <stdio.h>

int main() {
    for (int i = 0; i < 5000; i++) {
        void* ptr = malloc(1000000);
        memset(ptr, 42, 1000000);
    }

    // Hang for a while to allow us analyze /proc.
    puts("Finished");
    while(1);

    return 0;
}

Depois comecei a executá-lo, aumentando a quantidade de memória solicitada a cada execução (5G, 10G, 12G e assim por diante) e observei o processo ' /proc/$PID/io e /proc/$PID/status . Os seguintes parâmetros de /proc/$PID/io permaneceram os mesmos para todas as execuções (e isso era esperado, pois esses parâmetros mostram as estatísticas de IO syscall-level ):

rchar: 1948
wchar: 9
syscr: 7
syscw: 1

Os próximos dois parâmetros, que (de acordo com a documentação do procfs do kernel ) mostra que a E / S de disco real, causada pelo processo, foi configurada para zeros (é provável que a imagem do programa já tenha sido armazenada em cache na memória das execuções anteriores, portanto execve não causou uma E / S de disco real ):

read_bytes: 0
write_bytes: 0

Quando eu estava perto do tamanho da memória RAM (16G), o kernel começou a trocar a memória do programa em quantidades bastante grandes (~ 4G):

$ cat /proc/$PID/status | grep VmSwap
VmSwap:  3908152 kB

Ao mesmo tempo, alguns valores estranhos apareceram em /proc/$PID/io :

read_bytes: 307200
write_bytes: 0

O valor diferente de zero de read_bytes apareceu quando o kernel começou a trocar e permaneceu quase o mesmo (~ 300k), enquanto a quantidade de troca usada pelo processo aumentou com cada execução consequente (até que começou a acionar o OOMKiller). / p>

Eu repeti esses experimentos algumas vezes, e a imagem permaneceu a mesma: write_bytes foi zero o tempo todo, e read_bytes mudou de zero para algum valor pequeno (relativamente à quantidade de memória sendo trocada) em torno de 300- 400k.

Com base nisso, eu acho que /proc/$PID/io não considera as leituras e gravações reais de troca , mas ele conta algumas atividades internas do kernel, causadas pelo uso da troca .

    
por 29.06.2018 / 23:15