У мене є віртуальний сервер Linux (Fedora 17) з 28 Гб оперативної пам’яті та 2 Гб свопом. Сервер працює з базою даних MySQL, яка створена для використання більшості оперативної пам'яті.
Через деякий час запуску сервер починає використовувати swap для обміну незахищеними сторінками. Це нормально, оскільки моя замітка за замовчуванням 60, і це очікувана поведінка.
Дивна річ у тому, що число в топі / 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. 440 Мб з mysql, використовуючи ca. 90% свопу.
Питання полягає в тому, чому це так сильно відрізняється від верхніх та пам’ятних номерів? Чи є спосіб, як "скинути" інформацію про своп, щоб побачити, що насправді є, замість того, щоб підсумовувати звички своп з усіх процесів?
Аналізуючи проблему, я придумав різні ідеї, але всі вони, здається, помиляються:
- Вихід сценарію не в КБ. Навіть якщо вона буде в 512 або 4 КБ одиниць, вона не збігається. Насправді співвідношення (1200: 440) становить приблизно 3: 1, що є "дивним" числом.
- Є кілька сторінок у свопі, які якимось чином поділяються між процесами, як зазначено в /server//a/477664/98204 . Якщо це правда, як я можу знайти фактичну кількість пам’яті, що використовується таким чином? Я маю на увазі, що це повинно зробити різницю в cca 800MB. І це не правильно звучить у цьому сценарії.
- Є кілька "старих" сторінок в свопі, використовуваних процесами, які вже закінчилися. Я б не заперечував, що якби мені вдалося дізнатися, скільки коштує цей "безкоштовний" своп.
- Є сторінки в свопі, які були замінені назад в пам'ять і є в обміні на випадок, якщо вони не змінилися в оперативній пам’яті і їх потрібно буде знову поміняти, як зазначено в /server//a/100636/98204 . Але значення SwapCched становить лише 24 Мб.
Дивна річ у тому, що використання swap повільно збільшується, тоді як сума виводу зі сценарію приблизно однакова. За останні 3 дні використаний своп збільшився з 1100 МБ до поточних 1230 МБ, тоді як сума зросла з 430 МБ до поточних 449 МБ (ca.).
Сервер має достатньо вільної (здатної) оперативної пам’яті, щоб я міг просто вимкнути своп і повернути його знову. Або я, мабуть, міг би встановити заміщення на 0, щоб свопом звикнути, лише якщо це не інший спосіб. Але я хотів би вирішити питання або принаймні з’ясувати, в чому причина цього.