Вопрос или проблема
Я пытаюсь выяснить, что использует мою память. Когда я запускаю команду free -m, я вижу, что свободно только 1 ГБ, а также доступно. Однако при запуске top процессы используют только 0.7% памяти, поэтому я не уверен, куда смотреть.
Единственное, что я нашел, это использование ipcs и изучение активных сегментов общей памяти.
Вот вывод команд:
[root@test ~]# free -m
total used free shared buff/cache available
Mem: 100408 93195 1147 4059 6064 1109
Swap: 16383 0 16383
top - 01:37:10 up 20 days, 11:11, 1 user, load average: 1.99, 2.43, 2.09
Tasks: 821 total, 4 running, 718 sleeping, 0 stopped, 0 zombie
%Cpu(s): 26.8 us, 1.5 sy, 0.0 ni, 70.4 id, 0.3 wa, 0.6 hi, 0.3 si, 0.1 st
GiB Mem : 98.1 total, 1.2 free, 90.8 used, 6.1 buff/cache
GiB Swap: 16.0 total, 16.0 free, 0.0 used. 1.4 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
5567 root 20 0 2420880 755000 7532 S 0.3 0.7 138:59.28 java
61283 oracle 20 0 11.0g 661820 355908 S 0.3 0.6 22:34.72 ora_m003_lmxlb1
3203 root 20 0 3708312 516148 116856 S 0.3 0.5 16:56.21 cvd
17260 oracle 20 0 11.1g 437816 77184 S 0.3 0.4 22:39.85 ora_m003_lmxlb1
8413 oracle 20 0 4688756 417056 35188 S 0.7 0.4 226:19.91 java
65826 oracle 20 0 11.0g 401372 92988 S 0.0 0.4 0:02.63 ora_j003_lmxlb1
69002 oracle 20 0 11.1g 399332 86052 S 0.0 0.4 0:03.41 ora_j002_lmxlb1
51455 oracle 20 0 11.0g 399120 90912 S 0.0 0.4 0:03.71 ora_j001_lmxlb1
79327 oracle 20 0 11.1g 397784 83320 S 0.3 0.4 22:57.12 ora_m004_lmxlb1
17163 oracle 20 0 11.0g 397420 92532 S 0.0 0.4 22:26.38 ora_m002_lmxlb1
93154 oracle 20 0 11.0g 389156 86464 S 0.0 0.4 7:12.23 ora_m001_lmxlb1
22405 oracle 20 0 11.0g 349296 80512 S 0.0 0.3 9:56.93 ora_m000_lmxlb1
61251 oracle 20 0 11.0g 347620 92740 S 0.0 0.3 22:24.97 ora_m002_lmxlb1
61249 oracle 20 0 11.0g 316504 89020 S 0.0 0.3 22:17.43 ora_m001_lmxlb1
11754 oracle 20 0 10.7g 311644 66756 S 0.7 0.3 61:25.02 ora_ppa7_lmxlb1
77645 oracle 20 0 3803892 290100 20516 S 0.3 0.3 1:09.30 java
3234 root 20 0 2977240 265384 0 S 0.0 0.3 6:43.82 CvMountd
5752 oracle rt 0 2745664 256364 114388 S 0.7 0.2 205:16.78 ocssd.bin
[root@test ~]# ipcs -m | awk 'NR==1; NR > 1 { printf "%-10s %-10s %-10s %-10s %-10s %-10s %-10s %s\n", $1, $2, $3, $4, $5, $6, $7, ($5/1024/1024)" MB" }'
------ Общие Сегменты Памяти -------- 0 MB
key shmid owner perms bytes nattch status 0 MB
0xfa002e17 0 root 660 59828264 1 57.0567 MB
0xfa002e19 32769 root 660 59828264 1 57.0567 MB
0x3ea248d0 720898 oracle 600 28672 48 0.0273438 MB
0x00000000 786435 oracle 640 67108864 57 64 MB
0x00000000 819204 oracle 640 10670309376 57 10176 MB
0xdc9e3d00 851973 oracle 640 2097152 57 2 MB
0x00000000 884742 oracle 600 4194304 112 4 MB
0x00000000 917511 oracle 600 10670309376 112 10176 MB
0x00000000 950280 oracle 600 65011712 112 62 MB
0xcd035180 983049 oracle 600 2097152 112 2 MB
0x00000000 1015818 oracle 600 14680064 114 14 MB
0x00000000 1048587 oracle 600 16072572928 114 15328 MB
0x00000000 1081356 oracle 600 20971520 114 20 MB
0x233b805c 1114125 oracle 600 2097152 114 2 MB
0x00000000 26837006 oracle 600 14680064 151 14 MB
0x00000000 26869775 oracle 600 10468982784 151 9984 MB
0x00000000 26902544 oracle 600 20971520 151 20 MB
0x40c4f358 26935313 oracle 600 2097152 151 2 MB
0x00000000 1277970 oracle 600 14680064 129 14 MB
0x00000000 1310739 oracle 600 10468982784 129 9984 MB
0x00000000 1343508 oracle 600 20971520 129 20 MB
0x8d83344c 1376277 oracle 600 2097152 129 2 MB
0 MB
Ответ или решение
Анализ использования памяти в Linux: как определить, кто потребляет память?
Ваша проблема заключается в определении того, что именно использует память на вашем сервере. Вы уже провели несколько стартовых шагов, таких как использование команд free -m
, top
и ipcs
, и теперь мы более детально разберёмся в этом вопросе.
Шаг 1: Понимание вывода команды free -m
Команда free -m
предоставляет информацию о текущем состоянии памяти.
- total: Общее количество доступной памяти.
- used: Количество используемой памяти.
- free: Количество свободной памяти.
- shared: Количество памяти, используемой в общих сегментах.
- buff/cache: Память, зарезервированная для кеширования.
- available: Количество памяти, которая может быть использована новыми процессами, не вызывая свопинга.
Ваш вывод показывает, что всего 1.2 ГБ свободной памяти и 90.8 ГБ используется, что подтверждает высокий уровень использования памяти.
Шаг 2: Анализ вывода команды top
Команда top
показывает активные процессы и их использование ресурсов, включая память. Обратите внимание на следующие колонки:
- VIRT: Виртуальная память, используемая процессом.
- RES: Физическая память, используемая процессом.
- SHR: Общая память, используемая совместно с другими процессами.
- %MEM: Процент использования физической памяти.
Совокупное использование памяти приложениями (ora_m003_lmxlb1
, java
, и т.д.) может быть не напрямую пропорционально тому, сколько из них реально загружает оперативную память. Программы, такие как Oracle и Java, могут выделять большое количество памяти, но не обязательно использовать её в полной мере.
Шаг 3: Проверка разделов памяти, используемой процессами
Одним из главных инструментов для анализа использования разделов памяти будет команда ipcs
. Это поможет вам идентифицировать активные сегменты совместно использованной памяти:
ipcs -m
Ваш вывод показал, что есть несколько крупных сегментов памяти, принадлежащих пользователю oracle
, включая сегменты размером до 16 ГБ. Вы делаете верное решение, обращая на это внимание, так как такие сегменты могут сильно влиять на общее потребление памяти.
Шаг 4: Исследование smem
Для более детального анализа используйте утилиту smem
, которая предоставляет информацию о распределении используемой памяти. Установите её (если она ещё не установлена):
sudo yum install smem # Для систем на основе RHEL, CentOS
sudo apt install smem # Для Debian, Ubuntu
Запустите smem
с параметрами для детального анализа:
smem -r -k -p
Эта команда отобразит информацию о памяти согласно каждому процессу, включая RSS (resident set size) и PSS (proportional set size), что даст вам точное представление о памяти, выделенной процессами.
Шаг 5: Найти утечки памяти
Если вы подозреваете утечке памяти, используйте инструменты, такие как valgrind
и memcheck
, чтобы проверить процессы на предмет потерь памяти.
Заключение
Важно понимать, что высокое использование памяти может быть вызвано неэффективным управлением памятью приложениями, которые выделяют память, но не используют её до конца. Регулярный мониторинг процессов с использованием упомянутых инструментов поможет вам лучше понять использование ресурсов вашей системы и избежать неожиданных сбоев.
Постепенно анализируя результаты этих команд, вы сможете выработать стратегию для оптимизации использования памяти на вашем сервере, что приведет к более стабильной работе системы.