Linux, кто съел всю память?
Столкнулся с проблемой, а точнее, некоторым моим не пониманием работы Linux систем. Зайдя на один из серверов я увидел следующее:
1 2 3 |
# top |
В этой картине меня привлекло значение потребляемой памяти. А именно написано, что из 16 Гб оперативки используется 14 Гб. Но на сервере крутится всего один маленький сайтик, и он не может съедать столько памяти...
Дальше я проверил этот результат командой:
1 2 3 |
free -m |
и получил такую же картину:
Это было очень подозрительно.. Чтобы определить какие процессы, сколько съедают памяти я использовал следующую команду (описание тут: Как узнать какой процесс ест больше всего памяти в Linux):
1 2 3 |
ps -eo size,pid,user,command | awk '{ hr=$1/1024 ; printf("%13.6f Mb ",hr) } { for ( x=4 ; x<=NF ; x++ ) { printf("%s ",$x) } print "" }' | sort |
Результатом, я остался не доволен, потому что, в совокупности все процессы, съедали, что-то около 2-х Гб:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
... 1157.269531 Mb /usr/sbin/mysqld 12.566406 Mb cpdavd - accepting connections ... 222.468750 Mb /sbin/rsyslogd -i /var/run/syslogd.pid -c 4 ... 48.109375 Mb /usr/local/bin/spamd 48.683594 Mb spamd child ... 622.593750 Mb /usr/sbin/named -u named 74.328125 Mb auditd ... |
Тогда я полез в поиск и нашел скрипт ps_mem.py, который подсчитывает кол-во памяти по процессам. Скрипт написан на питоне, пост про него тут: Подсчет потребляемой памяти процеcсами в Linux. Но он так же показывал, что все вместе процессы, не потребляют столько памяти.
Дальше я подумал, что проблема именно с ядром, и полез искать инфу, по ключевику: "linux ram size is not correct", долго ли коротко, но нашел я вот такой ответ, на одно из сообщений:
As I understand it, on Linux 'used' memory is split into 'active' and 'inactive'.
Active memory is memory which is currently allocated to a process and in use by it.
Inactive is memory that has been allocated to a process but is no longer in use by it (it has been freed). The allocator puts this memory on one side for later use, but doesn't empty it. If the same data that is in that memory block is requested again it just re-allocates that memory block to the process. If a block of memory is requested and there is no 'clean' memory left it starts re-allocating this 'dirty' memory.
Examining /proc/meminfo can show you how much of your 'used' memory is active and how much is inactive.
Вкратце написано следующее: в Linux системах память делится на активную и неактивную. Неактивная это та, что выделена процессу, но больше не используется им. Allocator ( выделятор 🙂 ) оставляет эту память для дальнейшего использования, и не очищает её. Если данные расположенные в этой памяти понадобятся он их сразу вернет. Если же другому процессу, потребуется эта память и не будет "чистой памяти", то тогда будет распределятся неактивная память.
Другими словами, используется оптимизация, и данные без надобности не выкидываются из памяти, но при необходимости, эта память будет выделена процессам. Отсюда делаем соответствующий вывод: если большая часть памяти, является неактивной, то, все ок.
Проверить кол-во неактивной памяти можно так:
1 2 3 |
# cat /proc/meminfo |
Результат работы:
1 2 3 4 5 6 7 8 9 |
MemTotal: 16376892 kB MemFree: 2200444 kB Buffers: 480652 kB Cached: 12708152 kB SwapCached: 0 kB Active: 1958840 kB Inactive: 11521124 kB |
Как видим, 11 Гб (11521124 kB), являются неактивной памятью и 1.95 Гб (1958840 kB), реально используется, т.е. является активной. Значит, в моем случае, избыточного потребления нет.
Подводя итог, хочу заметить, что довольно часто, вся соль проблемы заключается, в недостаточной квалификации прокладки между стулом и монитором и над этим надо работать 🙂
Напоследок анекдот:
- А у меня друг сломал сервер за пять минут!!!
- Он что, хакер???
- Нет. Он - муд@к!!!
🙂
Author: | Tags: /
| Rating:
18 comments.
Write a comment