Я предполагаю, что есть некоторая утечка памяти, и память не освобождается. Есть ли хорошие способы узнать, какой процесс и почему происходит утечка памяти?

Единственное временное решение - перезапустить сервер. Но через несколько дней использование памяти растет и растет, а затем сервер сильно замедляется, и мне приходится делать еще один перезапуск.

Например, проверка free -m:

             total       used       free     shared    buffers     cached
Mem:          2005       1989         15          0          2        126
-/+ buffers/cache:       1861        144
Swap:         2004       1494        510

Дело в том, что это использование мало что меняет. И такое использование памяти либо замораживается, либо увеличивается, но не меньше.

Кто-нибудь знает какие-либо хорошие практики, чтобы точно определить причину утечки памяти?

Топ, упорядоченный по использованной памяти, показывает это:

top - 16:58:40 up  6:00,  1 user,  load average: 0.10, 0.08, 0.07
Tasks: 136 total,   1 running, 135 sleeping,   0 stopped,   0 zombie
Cpu(s): 26.2%us,  1.0%sy,  0.0%ni, 72.8%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   2053476k total,  2036380k used,    17096k free,    39272k buffers
Swap:  2053112k total,    13348k used,  2039764k free,   924372k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND            
 1529 oerp      20   0  919m 419m 8100 S 19.9 20.9  17:44.49 python             
 1768 postgres  20   0  342m 161m 137m S  0.0  8.1   0:27.28 postgres           
 1775 postgres  20   0  334m 155m 137m S  0.0  7.8   0:14.05 postgres           
 1751 postgres  20   0  333m 152m 138m S  0.0  7.6   0:26.56 postgres           
 1779 postgres  20   0  330m 150m 136m S  0.0  7.5   0:13.73 postgres           
 1758 postgres  20   0  329m 149m 137m S  0.0  7.5   0:19.89 postgres           
 1742 postgres  20   0  330m 149m 137m S  0.0  7.5   0:10.19 postgres           
 1769 postgres  20   0  329m 149m 138m S  0.0  7.4   0:55.47 postgres           
 1760 postgres  20   0  329m 149m 137m S  0.0  7.4   0:16.52 postgres           
 1772 postgres  20   0  328m 148m 136m S  0.0  7.4   0:18.93 postgres           
 1764 postgres  20   0  328m 148m 137m S  0.0  7.4   0:17.72 postgres           
 1759 postgres  20   0  329m 148m 136m S  0.0  7.4   0:21.15 postgres           
 1757 postgres  20   0  330m 148m 136m S  5.6  7.4   0:17.73 postgres           
 1766 postgres  20   0  327m 148m 138m S  0.3  7.4   0:25.07 postgres           
 1762 postgres  20   0  328m 148m 136m S  0.0  7.4   0:17.91 postgres           
 1776 postgres  20   0  329m 147m 137m S  0.0  7.4   0:21.30 postgres           
 1770 postgres  20   0  328m 147m 136m S  0.0  7.4   0:16.01 postgres

Понятно, что Python и PostgreSQL съедают всю память, но как я могу точно указать причину отказа от освобождения памяти (много разных операций, которые выполняют Python и PostgreSQl)?

используя ps aux:

Этот процесс использует большую часть памяти:

oerp 1529 4.9 20.9 916984 429332 ? Sl 10:58 17:55 /opt/odoo/venv/bin/python /opt/odoo/odoo/openerp-server --config=/etc/odoo-server.conf --no-database-list

Но если вы объедините все процессы, как это (их много)

postgres  1742  0.0  7.4 338268 153140 ?       Ss   10:59   0:10 postgres: oerp nodbaltic [local] idle 

Тогда это занимает большую часть памяти.

Это нормально для postgresql, чтобы иметь много пустых процессов, которые занимают такой огромный объем памяти?

cat /proc/meminfo:

MemTotal:        2053476 kB
MemFree:           20312 kB
Buffers:           38944 kB
Cached:           926480 kB
SwapCached:         1196 kB
Active:          1431788 kB
Inactive:         490424 kB
Active(anon):     824712 kB
Inactive(anon):   276456 kB
Active(file):     607076 kB
Inactive(file):   213968 kB
Unevictable:        3884 kB
Mlocked:            3884 kB
SwapTotal:       2053112 kB
SwapFree:        2039340 kB
Dirty:              4144 kB
Writeback:             0 kB
AnonPages:        959108 kB
Mapped:           164144 kB
Shmem:            142332 kB
Slab:              58796 kB
SReclaimable:      38440 kB
SUnreclaim:        20356 kB
KernelStack:        1728 kB
PageTables:        28340 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     3079848 kB
Committed_AS:    2131992 kB
VmallocTotal:   34359738367 kB
VmallocUsed:      281432 kB
VmallocChunk:   34359446164 kB
HardwareCorrupted:     0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:       10240 kB
DirectMap2M:     2086912 kB

PS Ох, и сервер работает на виртуальной машине, если это имеет значение.

3 ответа3

1

Команда top покажет процессы, запущенные в настоящее время, а также использование их памяти. Столбец RES сообщает о памяти, фактически используемой процессом. Нажмите Shift + M, чтобы отсортировать по этому столбцу. Нажмите кнопку Q , чтобы снова выйти из экрана.

0

Есть несколько способов узнать, какие процессы запущены и используют память.

Топ уже упоминался, но я предпочитаю использовать поверх или htop. Вы можете установить их из своего репозитория (yum install atop или apt-get install atop), это дает намного лучший и полный обзор всего, что происходит на вашем сервере. Вы можете даже настроить поверх, чтобы регистрировать все каждые х минут, что может помочь в отладке вашей проблемы.

Также можно просто проверить, что в данный момент работает и использует ресурсы, набрав

пс искусственный

команда PS дает вам снимок всех запущенных в данный момент процессов. Там есть колонка для использования процессора и MEM.

Кроме того, использование free -m для устранения проблем с памятью может ввести в заблуждение. Было бы лучше проверить:

cat /proc /meminfo

Или используйте инструменты, которые я упомянул как atop или htop, так как они дают лучшее представление о том, как на самом деле используется память (память, зарезервированная кешем и буферами)

Кроме того, публикация результатов из ps faux или top/atop/htop поможет нам лучше решить вашу проблему.

0

Переместите все данные в памяти на диск, очистив физическую память:

sudo /bin/syncfree pagecache, dentries and inodes 
sudo bash -c "echo 3 > /proc/sys/vm/drop_caches"

Убедитесь, что физической памяти достаточно для хранения всего пространства подкачки, а затем переместите обмененные данные обратно в доступную оперативную память, выполнив следующие две команды:

$ free -m
total       used       free     shared    buffers     cached
Mem:          2048        884       1163          0          0         42
-/+ buffers/cache:        842       1205
Swap:          996        996          0


sudo /sbin/swapoff -a && sudo /sbin/swapon -a 

это перемещает обмененные объекты в физическую память, отключает и повторно включает обмен.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .