
Я запускаю top и вижу, что из 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
решение1
Ничего.
Это Linux, и этокак это работает.
Он будет использовать «свободную» память для кэширования диска, потому что какой смысл в недоиспользовании ресурса?
Когда процессу требуется больше памяти, он запрашивает ее у ядра и (как правило) получает.
О, и MySQL будет использовать столько, сколько ему нужно (согласно настройкам в /etc/my.cnf
), чтобы индексы, запросы и таблицы кэшировались с диска в память, что сокращает время доступа.
решение2
Это просто всякий хлам, который остался в памяти после последнего использования. Скорее всего, это данные, которые были считаны с диска или записаны на диск. ОС не освобождает память, потому что это пустая трата по трем причинам:
Если память не будет использоваться в ближайшее время, то ее освобождение ничего не даст.
Если память используется быстро, то ее освобождение — это просто работа, которую придется отменить, поскольку ее придется использовать снова.
Если информация, которая была в памяти, понадобится снова, освобождение памяти будет означать необходимость извлекать ее с диска, а не из памяти, что гораздо медленнее.
Современные операционные системы освобождают память только в том случае, если у них нет другого выбора. Если вы думаете: «Я хочу освободить эту память сейчас, чтобы использовать ее позже», остановитесь. Вам не нужно, чтобы память была свободна сейчас, чтобы использовать ее позже. Здесь нет компромисса, это чистая победа — сохранять память в использовании, пока она не понадобится.
решение3
Запись вывода top для будущего анализа — лучший способ ответить на ваш вопрос. Быстрого решения нет, необходимо некоторое наблюдаемое исследование с течением времени. Один из способов, который я использую, чтобы поверхностно изучить, что использует мою память, — это поместить это в crontab root.
/bin/bash top -b -n 1 | head > `/var/log/date +%e_%T`
Затем я использую некоторые текстовые манипуляции и пейджер-фу для отслеживания тенденций. Этот пост Stack Overflowhttps://stackoverflow.com/questions/7908953/how-to-measure-cpu-usageесть несколько более подробных примеров использования top, подобных этому, и настройки top через .toprc
, для статистики ЦП, но его можно так же легко адаптировать под свои нужды.