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 }} У меня был тот же вопрос, поэтому я решил провести несколько экспериментов с использованием подкачки и учетом операций ввода-вывода.
Я написал простую программу, которая просто запрашивает большой объем памяти и заполняет ее данными:
#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
не учитывает фактическое чтение и запись подкачки , но учитывает некоторые внутренние действия ядра, вызванные использованием подкачки .