알아요:
- 디스크를 사용한 페이징 및 스와핑
- /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_bytes
0에서 300-400k 정도의 더 작은(스왑된 메모리 양에 비해) 값으로 이동했습니다.
이를 토대로 /proc/$PID/io
고려하면 안 될 것 같다.실제 교환 읽기 및 쓰기, 그러나 이는 일부를 설명합니다.스왑 사용으로 인한 내부 커널 활동.