1. Предварительные знания
1.1 Что такое своп
Когда мы говорим о термине подкачка, это может быть раздел или файл, который представляет собой место в операционной системе для хранения данных, которые заменяются из памяти. Когда мы обращаемся к глаголу, он относится к действию по обмену данными из физической памяти на разделы подкачки.
1.2 Зачем менять
(1) При нехватке физической памяти часть памяти будет подкачиваться в раздел подкачки по определенному алгоритму (это также будет сопровождаться высоким IO). Но не вся память может быть выгружена на раздел подкачки. (2) Процесс kswapd периодически проверяет объем памяти. Если обнаруживается, что объем памяти выше водяного знака, запускается своп. Это необходимо для предотвращения очень малого количества оставшейся памяти в системе и предотвращения внезапных запросов на большой объем памяти. Этот раздел пока не будет подробно объясняться и будет добавлен позже.
1.3 Что такое своп
Прежде всего, нам нужно знать, что управление памятью делит память на активную и неактивную, а отображение, используемое пользовательским пространством процесса, включает анонимное отображение (anon) и отображение файла (file). У всех есть активный анон, неактивный анон, активный файл, неактивный файл. Для сопоставления файлов, поскольку это файл в дисковом пространстве, он не будет заменен.Когда его необходимо освободить, грязные данные напрямую записываются обратно на диск, а другие данные могут быть освобождены напрямую. Когда память подкачивается в подкачку, она должна подкачивать неактивные данные.Все, неактивный анон - это основная подкачиваемая память. Итак, для операционной системы, когда мне нужно освободить память, вы говорите, для сопоставления файлов или для анонимного сопоставления, которое включает параметр: swapiness
1.3.1 swapiness
swapiness — это когда вы устанавливаете освобождение памяти, предпочитаете повторно использовать сопоставление файлов или анонимное сопоставление, установите значение в /proc/sys/vm/swappiness. Для swapiness=100 вес между ними одинаков. Чем меньше значение, тем больше склонность к повторному использованию сопоставления файлов. Однако, если достигнута максимальная отметка системы, он все равно будет заменен, если только системный обмен не будет напрямую закрывается такими средствами, как swapoff -a .
1.3 Качество свопа
Преимущество подкачки в том, что при нехватке памяти часть ее можно подкачать без срабатывания oom-killer. Бегать медленно лучше, чем вообще не бежать. Недостатком подкачки является то, что при подкачке он вызовет высокий ввод-вывод и снизит производительность системы. Если мы не справляемся изолированно, это повлияет на производительность других приложений.
Во-вторых, выбор инструмента
Инструмент часто имеет несколько целей, но в этой статье описывается только проблема подкачки.
имя инструмента | использовать позу | Источник метрик сбора |
---|---|---|
free | free -h | /proc/meminfo |
top | Нажмите f, чтобы выбрать обмен | /proc/$pid/smaps |
vmstat | vmstat | /proc/meminfo |
iotop | iotop | |
iostat | iostat -xdm | |
pidstat | pidstat -d 1 | /proc/$pid/io |
Три, анализ случая
3.1 Приложение запрашивало память
Этот случай написан на golang.В бесконечном цикле память применяется для каждого цикла и не освобождается, а затем память освобождается через определенное количество раз, ожидая GC, а затем продолжая.Код и документация заархивированы в :архив.
3.1.1 Запуск программы и анализ
(1) Эксплуатация
root@szdc-calic-2-6:/www/linuxperformancetool/swap# ./swapexample1
Поскольку упомянутые выше команды можно использовать для анализа, вы можете использовать их по своему усмотрению. Я использую top, vmstat и pidstat для анализа здесь, вы можете открыть несколько терминалов, чтобы смотреть вместе.
(2) Анализ Первый - использовать vmstat.Из следующего видно, что когда программа занимает все больше и больше памяти, возникают очень высокие swap io и block io. Подумайте, почему эти два увеличиваются одновременно?
root@szdc-calic-2-6:~# vmstat -a 1
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free inact active si so bi bo in cs us sy id wa st
1 0 1240208 18816440 715216 12702360 0 0 1 18 0 0 0 0 99 0 0
1 0 1240208 18086504 715220 13431988 0 0 0 0 2223 3192 1 4 96 0 0
1 0 1240208 17343176 715220 14173444 0 0 0 60 1906 3099 1 4 95 0 0
1 0 1240208 16618392 715260 14897140 0 0 0 60 2351 3552 1 4 96 0 0
1 0 1240208 15883220 715280 15632572 0 0 0 0 2187 3547 1 4 96 0 0
0 2 1240300 15276012 806532 16151868 0 92 0 2088 2365 3373 1 3 95 2 0
0 2 1265792 15270100 2023920 14946200 56 25500 100 27536 5102 9189 1 1 93 5 0
0 3 1265784 15274476 2023856 14944732 40 0 40 2572 2162 2425 0 0 90 10 0
0 9 1287036 15276116 2022816 14944232 88 21276 88 22228 2074 3136 0 0 79 21 0
0 9 1287020 15273676 2024776 14946436 92 0 92 2288 3563 5822 0 0 79 20 0
2 3 1286912 15271708 2024844 14946532 128 0 128 1432 2989 4907 0 0 84 16 0
0 3 1286912 15271692 2024572 14946520 0 0 0 2344 3098 4543 0 0 87 13 0
0 4 1312096 15265788 2022444 14951064 0 25188 0 26628 4946 9752 1 1 90 9 0
После обнаружения системной проблемы нам нужно найти проблему. Здесь вы можете использовать top, pidstat, iotop и другие инструменты, чтобы найти проблему. Я использую top непосредственно здесь и нажмите f, чтобы выбрать своп.
top - 00:52:38 up 253 days, 14:23, 3 users, load average: 6.44, 2.60, 1.23
Tasks: 359 total, 1 running, 358 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.6 us, 0.6 sy, 0.0 ni, 67.0 id, 31.7 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 32895096 total, 236100 free, 32011520 used, 647476 buff/cache
KiB Swap: 31250428 total, 28358956 free, 2891472 used. 261616 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND SWAP
45466 root 20 0 10.076g 21624 2520 S 12.9 0.1 7881:36 etcd 19636
146 root 20 0 0 0 0 D 9.2 0.0 2:28.44 kswapd0 0
14179 root 20 0 31.136g 0.029t 4316 S 3.3 94.8 0:31.86 main1 1.375g
147 root 20 0 0 0 0 S 1.7 0.0 1:52.23 kswapd1 0
10737 root 20 0 3067756 60688 5968 S 0.7 0.2 3364:41 dockerd 60380
10750 root 20 0 2898452 38724 3096 S 0.7 0.1 629:49.22 docker-containe 79288
По изменению вершины видно, что процесс с pid=14179 увеличивает своп, а использование памяти становится все выше и выше.Хотя другие процессы увеличили своп, но использование памяти не увеличилось.Это может быть рассудил, что этот процесс является причиной возникновения причины подкачки. Что ж, пойдем дальше, чтобы подтвердить.
Используя pidstat для оценки ситуации с вводом-выводом pid, можно увидеть, что имеется большой ввод-вывод.
root@szdc-calic-2-6:~# pidstat -p 14179 -d 1
Linux 4.4.0-87-generic (szdc-calic-2-6.meitu-inc.com) Wednesday, December 12, 2018 _x86_64_ (24 CPU)
12:55:40 CST UID PID kB_rd/s kB_wr/s kB_ccwr/s iodelay Command
12:55:41 CST 0 14179 71920.00 0.00 0.00 0 main1
12:55:42 CST 0 14179 72796.04 0.00 0.00 0 main1
12:55:43 CST 0 14179 85664.00 0.00 0.00 0 main1
12:55:44 CST 0 14179 78128.00 0.00 0.00 0 main1
12:55:45 CST 0 14179 69660.00 0.00 0.00 0 main1
12:55:46 CST 0 14179 59892.00 0.00 0.00 0 main1
3.1.2 Проблемы
На эти вопросы не будет прямого ответа.Если вы действительно не можете об этом подумать, вы можете задать вопрос в архивном проекте или оставить комментарий ниже.
(1) Почему в этом примере простое обращение к памяти приведет к одновременному увеличению операций ввода-вывода подкачки и ввода-вывода блока? (2) В примере явно осталась неиспользуемая память, но она начала часто подкачиваться и освобождать большой объем памяти. (3) Когда golang gc, будет ли память, которая была выгружена, снова заменена физической памятью, а затем будет выполняться gc? (4) Что содержится в буфере и кеше в предыдущем разделе? (Анонимные страницы или сопоставления файлов)