Я бегу вверх и вижу, что из 502968 КБ используется 48064 КБ, а 16884 КБ остается свободным. Но затем, когда я смотрю на отдельные процессы, я вижу, что mysql время от времени потребляет 9,4% моей оперативной памяти, но ничто другое, похоже, ничего не потребляет. Что потребляет всю мою оперативную память?
Вот снимок экрана сверху:
top - 20:46:07 up 1 min, 1 user, load average: 0.18, 0.05, 0.02
Tasks: 81 total, 1 running, 80 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.4 sy, 0.0 ni, 99.6 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem: 502968 total, 241236 used, 261732 free, 10488 buffers
KiB Swap: 524284 total, 0 used, 524284 free, 106756 cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1584 dmackey 20 0 20508 1372 1000 R 0.4 0.3 0:00.01 top
1 root 20 0 26664 2456 1340 S 0.0 0.5 0:00.69 init
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 0:00.01 ksoftirqd/0
4 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0
5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
6 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kworker/u:0
7 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/u:0H
8 root rt 0 0 0 0 S 0.0 0.0 0:00.00 migration/0
9 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh
10 root 20 0 0 0 0 S 0.0 0.0 0:00.24 rcu_sched
11 root rt 0 0 0 0 S 0.0 0.0 0:00.00 watchdog/0
12 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 cpuset
13 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 khelper
14 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kdevtmpfs
15 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 netns
16 root 20 0 0 0 0 S 0.0 0.0 0:00.00 bdi-default
А вот один из бесплатных:
total used free shared buffers cached
Mem: 502968 355252 147716 0 10816 111548
-/+ buffers/cache: 232888 270080
Swap: 524284 0 524284
Ничего.
Это Linux, и это как это устроено.
Он будет использовать «свободную» память для кэширования диска, потому что какой смысл в том, что ресурс недостаточно загружен?
Когда процессу требуется больше памяти, он запрашивает ее у ядра и (как правило) получает ее.
Ох .. и MySQL будет использовать столько, сколько нужно (как настроено в /etc/my.cnf
), так что индексы, запросы и таблицы кэшируются с диска в память, чтобы ускорить доступ.
Это просто мусор, который остался в памяти, каким бы он ни был последним. Скорее всего, это данные, которые были прочитаны с диска или записаны на диск. ОС не освобождает память, потому что это пустая трата по трем причинам:
Если память не используется в ближайшее время, то ее освобождение ничего не дает.
Если память скоро будет использована, то освободить ее - это просто работа, которую нужно отменить, так как ее нужно снова использовать.
Если информация, которая была в памяти, снова понадобится, освобождение памяти будет означать, что эту информацию придется получать с диска, а не из памяти, что намного медленнее.
Современные операционные системы освобождают память только в том случае, если у них нет другого выбора. Если вы думаете: «Я хочу освободить эту память сейчас, чтобы я мог использовать ее позже», остановитесь. Вам не нужно, чтобы память была свободной сейчас, чтобы использовать ее позже. Здесь нет компромисса, это чистая победа, если память используется до тех пор, пока она не понадобится.
Наилучший способ ответить на ваш вопрос - записать вывод топа для будущего анализа. Быстрого решения нет, со временем потребуется некоторое наблюдаемое расследование. Единственный раз, который я использую, чтобы просмотреть поверхность того, что использует мою память, - это поместить это в crontab root.
/bin/bash top -b -n 1 | head > `/var/log/date +%e_%T`
Затем я использую некоторые операции с текстом и пейджер-фу, чтобы отслеживать тенденции. Это сообщение о переполнении стека https://stackoverflow.com/questions/7908953/how-to-measure-cpu-usage есть несколько более подробных примеров использования top, как это, и настройки top с помощью .toprc
, для статистики ЦП, но его можно легко адаптировать под свои нужды.