Включают ли цифры в / proc / / io пейджинг и подкачку ввода-вывода?

perl -nlE 'if($.==1){                            # if first line 
              @L = /(\w+):/g ;                   # L = list of keys
              say join(",",@L)}                  # print header 
           ($a,%b)=split(/\s*,?(\w+):/,$_,-1);   # b: dict of (keys, values)  
           say join(",", map { $b{$_} } @L)'  ex.txt
{{1 }}
1
08.01.2017, 19:52
1 ответ

У меня был тот же вопрос, поэтому я решил провести несколько экспериментов с использованием подкачки и учетом операций ввода-вывода.

Я написал простую программу, которая просто запрашивает большой объем памяти и заполняет ее данными:

#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оставались неизменными для каждого запуска (, и это было ожидаемо, поскольку эти параметры показывают уровень системного вызова -статистику ввода-вывода):

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

Следующие два параметра, которые (в соответствии с документацией по procfs ядра)показывают фактический дисковый ввод-вывод, вызванный процессом, были установлены в нули (вполне вероятно, что образ программы был уже закэшировано в память от предыдущих исполнений, поэтому execveне вызывало реального дискового ввода-вывода):

read_bytes: 0
write_bytes: 0

Когда я был близок к размеру оперативной памяти (16G ), ядро ​​начало выгружать память программы в довольно больших количествах (~4G):

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

В то же время в/proc/$PID/io:

появились странные значения.
read_bytes: 307200
write_bytes: 0

Не -нулевое значение read_bytesпоявилось, когда ядро ​​начало подкачку,и остался почти таким же (~300 КБ ), в то время как объем подкачки, используемый процессом, увеличивался с каждым последующим запуском (, пока он не начал запускать OOMKiller ).

Я повторил эти эксперименты несколько раз, и картина осталась прежней:write_bytesвсе время была нулевой, а read_bytesменялась от нуля до некоторого небольшого (относительно объема подкачиваемой памяти )значения около 300 -400к.

Основываясь на этом, я думаю, что /proc/$PID/ioне учитывает фактическое чтение и запись подкачки , но учитывает некоторые внутренние действия ядра, вызванные использованием подкачки .

2
27.01.2020, 23:34

Теги

Похожие вопросы