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 .