Потребление памяти Kubuntu 16.04.1 - кому верить ? [Решено]

Изображение пользователя AlexBezz.

Приветствую форумчане !

Вот такой вопрос на ваше рассмотрение. Установил виджет "Просмотр нагрузки на систему", и обнаружил, что согласно его показателям вся опертивная память загружена по самое нехочу. Но система то не тормозит, своп не наполняется. Открыл монитор системы - а согласно его показателям, свободно больше половины ОЗУ.
Ничего не понимаю ? Кому верить ? Сколько реально потребляется памяти в момент зафиксированый скрином ?

Скриншот

Или виджет показывает то что не показывает монитор системы ?

Растолкуйте плз.

0
ericSAN - 12 Сентябрь, 2016 - 16:34
Изображение пользователя ericSAN.

Кому верить ? Сколько реально потребляется памяти
free -m
Неплохо бы посмотреть
top
cat /proc/meminfo

0
AlexBezz - 12 Сентябрь, 2016 - 16:54
Изображение пользователя AlexBezz.
0
dyug - 12 Сентябрь, 2016 - 16:42

в виджете используется значение всей памяти, включая буфера и кеши.
в проге - только занятой. Буфера и кеш не включаются, ибо их может система при необходимости освободить. (правда, не всегда у нее это получается...)

0
AlexBezz - 12 Сентябрь, 2016 - 16:56
Изображение пользователя AlexBezz.

Вижу, что таки виджет учитывает буфера и кеши

Спасибо.

0
dyug - 12 Сентябрь, 2016 - 17:08

Завсегда пожалуйста. :-)
Кстати я, например не совсем понимаю, как правильно, ибо с точки зрения системы - эта память все же занята, хотя и может быть освобождена.
У меня лично нет ответа на вопрос - как правильно показывать занятую память.

0
AlexBezz - 12 Сентябрь, 2016 - 17:32
Изображение пользователя AlexBezz.

Это два правильных варианта. Просто первый - правильный для пользователя, ему показывают память занятую самими программами и системой (в т.ч. системными процессами), но за вычетом кеша и буферов, которые используются для ускорения работы приложений.
И второй вариант - правильный для админов, где полностью расписано как и чем занята память.
Я присмотрелся - на виджете столбик состоит из двух цветов, один на пол-оттенка светлее. Выходит, что тот который темнее - соответствует первому варианту, а свелее - показывает буфера и кеш

0
MacLeod - 13 Сентябрь, 2016 - 02:12
Изображение пользователя MacLeod.

Оба варианта - неточные =)
Ибо ни один из них не ответит на вопрос типа: "сможет ли ОС выдать 1Гб приложению при free - в 2Гб?"

0
dyug - 14 Сентябрь, 2016 - 12:03

Гмм, а что именно может на этот вопрос ответить?:-)
Я не спрашиваю кто, я спрашиваю что?

+1
MacLeod - 15 Сентябрь, 2016 - 13:10
Изображение пользователя MacLeod.

Ядро может =) Только оно может в конкретный момент времени точно "знать" состояние кучи (heap), насколько она фрагментирована и т.д. А отвечает оно когда "просят" сишные *alloc(), new, placement new и т.д.

Я всего лишь хотел сказать, что наличие достаточного количества свободных физических ячеек еще не означает, что оно может быть выдано (без особых проблем или вообще) какому-нибудь приложению, например, когда требуется непрерывная область.

0
dyug - 16 Сентябрь, 2016 - 10:12

гмм, а есть способ спросить у ядра эту возможность?:-)
Раз уж ты у нас такой знаток в этом вопросе...:-)

+1
MacLeod - 16 Сентябрь, 2016 - 11:44
Изображение пользователя MacLeod.

Я же писал выше:
А отвечает оно когда "просят" сишные *alloc(), new, placement new и т.д.
Бессмысленно использовать данные системные вызовы просто для получения данных визуально, поскольку состояние может меняться тысячи раз за секунду и выведенные значения будут неактуальными уже в момент отображения.
Поэтому ответ на данный вопрос необходим в момент попытки выделения памяти. Вот на примере malloc.
Начинающие разработчики часто не проверяют успешность выделения памяти и очень сильно удивляются, поймав краш. Аналогичное может произойти с пользователем, когда free показывает достаточное свободное количество, а запускаемая софтина падает или не работает как положено.

0
DarkneSS - 16 Сентябрь, 2016 - 19:16
Изображение пользователя DarkneSS.

Насколько я знаю, с современным ядром malloc выделяет память, даже когда свободной совсем нет, и проверка указателя ничего не даёт. Если же указатель нулевой, значит, системе настолько плохо, что краш программы уже не будет иметь никакого значения.
Думаю, для вас не составит труда проверить (и, возможно, опровергнуть) первое утверждение.

0
MacLeod - 20 Сентябрь, 2016 - 23:08
Изображение пользователя MacLeod.

Да, если включен memory overcommit (задается в /proc/sys/vm/overcommit_memory), то так и будет происходить. Правда, в ряде случаев, отъем у разработчика средств контроля вносит еще большую неразбериху и бывает нужен тюнинг или отключение, например.
В ядре вообще касаемо памяти, как я понял, очень много всяких читов и костылей. Но и свобода выбора по их настройке.
Возвращаясь к начальной теме, например, при виртуальном адресном пространстве вообще нет никакой гарантии, что выделение произойдет в RAM, а не в свопе.

Тем не менее, проверки указателей еще актуальны. В том числе на встраиваемых системах, использующих ядро Linux, а также на Android и iOS, с приложений для которых я каждый день вижу отчеты по крашам и 90% из них - по памяти. Свои недоработки и лишние манипуляции с кучей еще команда поправить может, но вот если проприетарная сторонняя библиотека или SDK - остается только вздохнуть.

Отправить комментарий

CAPTCHA на основе изображений
Введите цифры