/proc/에서 숫자를 입력하세요/io에는 페이징 및 스와핑 I/O가 포함되어 있습니까?

/proc/에서 숫자를 입력하세요/io에는 페이징 및 스와핑 I/O가 포함되어 있습니까?

알아요:

  • 디스크를 사용한 페이징 및 스와핑
  • /proc/io는 디스크 I/O 정보를 제공합니다.

그러나 확실하지 않습니다./proc/<pid>/ioRAM에서 수행되어야 하지만 페이징 및 스와핑으로 인해 디스크로 이동되는 I/O를 포함합니다. 숫자를 쓰다/proc/<pid>/io페이징 및 스왑 I/O를 포함합니까?

답변1

나에게도 같은 문제가 있었기 때문에 스왑 사용 및 I/O 계산에 대해 몇 가지 실험을 하기로 결정했습니다.

나는 많은 양의 메모리를 요청하고 데이터로 채우는 간단한 프로그램을 작성했습니다.

#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;
}

그런 다음 실행을 시작하여 실행당 요청된 메모리 양(5G, 10G, 12G 등)을 늘리고 프로세스' /proc/$PID/io/proc/$PID/status. 다음 매개변수는 각 실행마다 동일하게 유지됩니다 /proc/$PID/io(이러한 매개변수는시스템 호출 수준IO 통계):

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

다음 두 매개변수(기반:커널 procfs 문서)는 프로세스로 인해 발생하는 실제 디스크 I/O가 0으로 설정되어 있음을 보여줍니다(대개 프로그램 이미지가 이전 실행에서 이미 메모리에 캐시되어 있으므로 execve실제 디스크 I/O가 발생하지 않음).

read_bytes: 0
write_bytes: 0

RAM 크기(16G)에 가까워지면 커널은 프로그램 메모리(~4G)를 크게 스와핑하기 시작합니다.

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

동시에 몇 가지 이상한 값이 나타납니다 /proc/$PID/io.

read_bytes: 307200
write_bytes: 0

커널이 스왑을 시작할 때 0이 아닌 값이 나타나고 read_bytes거의 일정하게(~300k) 유지되는 반면, 프로세스에서 사용하는 스왑 양은 각 후속 실행마다 증가합니다(OOMKiller가 트리거되기 시작할 때까지).

나는 이 실험을 여러 번 반복했지만 그림은 동일하게 유지되었습니다. write_bytes항상 0이고 read_bytes0에서 300-400k 정도의 더 작은(스왑된 메모리 양에 비해) 값으로 이동했습니다.

이를 토대로 /proc/$PID/io고려하면 안 될 것 같다.실제 교환 읽기 및 쓰기, 그러나 이는 일부를 설명합니다.스왑 사용으로 인한 내부 커널 활동.

관련 정보