Третья серия настройки производительности инструментов Linux: местонахождение проблемы с подкачкой

Операционная система Linux

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) Что содержится в буфере и кеше в предыдущем разделе? (Анонимные страницы или сопоставления файлов)

4. Ссылки

1, linuxperf.com/?p=142

2, cloud.Tencent.com/developer/ ах…