Назад | Перейти на главную страницу

Что использует мою оперативную память в VPS?

Я бегу вверх и вижу, что из 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), так что индексы, запросы и таблицы кэшируются с диска в память, чтобы ускорить доступ.

Это просто мусор, который остался в памяти, каким бы он ни был последним. Скорее всего, это данные, которые были прочитаны с диска или записаны на диск. ОС не освобождает память, потому что это пустая трата по трем причинам:

  1. Если память не используется в ближайшее время, то ее освобождение ничего не дает.

  2. Если память скоро будет использована, то освободить ее - это просто работа, которую нужно отменить, так как ее нужно снова использовать.

  3. Если информация, которая была в памяти, снова понадобится, освобождение памяти будет означать, что эту информацию придется получать с диска, а не из памяти, что намного медленнее.

Современные операционные системы освобождают память только в том случае, если у них нет другого выбора. Если вы думаете: «Я хочу освободить эту память сейчас, чтобы я мог использовать ее позже», остановитесь. Вам не нужно, чтобы память была свободной сейчас, чтобы использовать ее позже. Здесь нет компромисса, это чистая победа, если память используется до тех пор, пока она не понадобится.

Наилучший способ ответить на ваш вопрос - записать вывод топа для будущего анализа. Быстрого решения нет, со временем потребуется некоторое наблюдаемое расследование. Единственный раз, который я использую, чтобы просмотреть поверхность того, что использует мою память, - это поместить это в 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, для статистики ЦП, но его можно легко адаптировать под свои нужды.