У меня есть виртуальный сервер Linux (Fedora 17) с 28 ГБ оперативной памяти и 2 ГБ подкачки. На сервере запущена БД MySQL, настроенная на использование большей части ОЗУ.
Через некоторое время сервер начинает использовать swap для замены неподдерживаемых страниц. Это нормально, так как моя перестановка по умолчанию равна 60, и это ожидаемое поведение.
Странно то, что число в top / meminfo не соответствует информации от процессов. Т.е. сервер сообщает эти цифры:
/proc/meminfo:
SwapCached: 24588 kB
SwapTotal: 2097148 kB
SwapFree: 865912 kB
top:
Mem: 28189800k total, 27583776k used, 606024k free, 163452k buffers
Swap: 2097148k total, 1231512k used, 865636k free, 6554356k cached
Если я использую скрипт из /server//a/423603/98204, он сообщает разумные числа (несколько МБ, замененных на bash'es, systemd и т. Д.) И одно большое выделение из MySQL (я пропустил много строк вывода ):
892 [2442] qmgr -l -t fifo -u
896 [2412] /usr/libexec/postfix/master
904 [28382] mysql -u root
976 [27559] -bash
984 [27637] -bash
992 [27931] SCREEN
1000 [27932] /bin/bash
1192 [27558] sshd: admin@pts/0
1196 [27556] sshd: admin [priv]
1244 [1] /usr/lib/systemd/systemd
9444 [26626] /usr/bin/perl /bin/innotop
413852 [31039] /usr/libexec/mysqld --basedir=/usr --datadir=/data/mysql --plugin-dir=/usr/lib64/mysql/plugin --log-error=/data/mysql/err --open-files-limit=8192 --pid-file=/data/mysql/pid --socket=/data/mysql/mysql.sock --port=3306
449264 Total Swap Used
Так что, если я получу правильный вывод скрипта, общее использование подкачки должно быть 449264K = ca. 440MB с MySQL, используя ок. 90% своп.
Вопрос в том, почему это так сильно отличается от верхних и чисел минминфо? Есть ли способ, как «сбросить» информацию о свопе, чтобы увидеть, что на самом деле в ней, вместо суммирования использования свопа во всех процессах?
При анализе проблемы у меня возникли разные идеи, но все они кажутся неправильными:
- Вывод скрипта не в КБ. Даже если он будет в 512 или 4 КБ, он не будет совпадать. На самом деле соотношение (1200: 440) составляет около 3: 1, что является «странным» числом.
- В swap есть несколько страниц, которые каким-то образом распределяются между процессами, как указано в /server//a/477664/98204 . Если это правда, как я могу найти фактическое количество используемой памяти? Я имею в виду, что это должно было бы сделать разницу около 800 МБ. И это не звучит правильно в этом сценарии.
- В swap есть несколько «старых» страниц, используемых процессами, которые уже закончили. Я бы не возражал, если бы мне удалось узнать, сколько стоит этот «бесплатный» своп.
- Есть страницы в разделе подкачки, которые были перекачаны обратно в память и находятся в режиме подкачки на тот случай, если они не изменились в ОЗУ и их необходимо заменить снова, как указано в /server//a/100636/98204 . Но значение SwapCached составляет всего 24 МБ.
Странно то, что использование свопа медленно увеличивается, а сумма вывода из скрипта примерно одинакова. За последние 3 дня объем используемого свопа увеличился с 1100 МБ до текущих 1230 МБ, а сумма увеличилась с 430 МБ до текущих 449 МБ (ок.).
На сервере достаточно свободной (способной) оперативной памяти, чтобы я мог просто отключить своп и снова включить его. Или я мог бы, вероятно, установить swappiness на 0, чтобы своп использовался, только если нет другого способа. Но я бы хотел решить вопрос или хотя бы выяснить, в чем причина этого.