Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Менеджер памяти Linux  (Прочитано 16419 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Rulik
Помогающий

ru
Offline Offline

« : 04-04-2008 14:38 » 

Наткнулся на такую проблемку:
Есть однопоточный сервер, он накапливает инфу (порядка 700 Мб).
Все замечательно, до того момента, когда происходит сброс этих данных и очистка массивов.
При очистке данные удаляються, но память системе не возвращаеться, т.е. top показывает, что процесс весит 700Мб.

При повторном заполнении объем памяти не растет.
Прогонял через ValGrind и DMALLOC, утечек не обнаружено.

Вот и немогу понять, как вернуть память. А черт его знает... Т.к. админы начинают поднимать панику.

Буду рад любой помощи.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 04-04-2008 14:43 » 

наверное, надо показывать код - как выделяется память, как очищается )
Записан

Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 04-04-2008 14:48 » 

Rulik, я по схожей причине по неопытности удивлялся, почему у меня куча памяти процессу отдаётся при совершении дисковых операций. Как оказалось, она просто используется при кэшировании при отсутствии других задач. Когда же требуется под динамическое выделение другому приложению, то размер кэша операций сокращается.
Может, и здесь тот же случай, память резервируется для быстрого доступа за данным процессом, а при потребностях в памяти у других задач будет происходить освобождение памяти из резерва? Конечно, это моё предположение, я лишь в некоторых моментах знаком с фичами менеджера памяти в Linux, но если не прав - кто-нибудь поправит Улыбаюсь

В качестве идеи по быстрой проверке этого предположения: сделать тестик, который будет просто выделять много памяти. И запустить его после удаления массивов в твоём сервере, посмотреть, что будет Улыбаюсь
Записан
Rulik
Помогающий

ru
Offline Offline

« Ответ #3 : 04-04-2008 14:55 » 

Код к сожалению показать не могу (жесткое соглашение о неразглашении, т.к. много бизнеслогики (биржевой сервер)).

Есть ли способ принудительно скинуть эту память?
Просто паника подымаеться по этому вопросу, типа сервак спит, а памяти жрет немерено. (ну привык народ к Win серверам).

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

Я конечно понимаю, что не показывая код, не культурно просить помощи.
Потому и хочу спросить как гарантированно вернуть память системе.

Память не течет. Сервак работает стабильно и набирая данные доходит до 700Мб и дальше не потребляет память, при этом обрабатывая до 80000 запросов в сек.

Сервак однопоточный.
« Последнее редактирование: 04-04-2008 14:57 от Rulik » Записан
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 04-04-2008 15:00 » 

Я вот сейчас не вспомню, но разве линуксовые утилиты не показывают отдельно объём зарезервированной памяти (отдельно от используемой)? Да и просто, если есть возможность убедить тем же тестом тех, кто паникует, что сервер память не жрёт, а просто резервирует, мол, фича такая у платформы - то, думаю, не стоит искать способы возврата этой памяти насильственно из резерва (хотя не знаю, можно ли это Улыбаюсь )

Точно помню, что top показывает процент памяти, фактически используемый приложением. free, кажется, зарезервированную под кэш память тоже отделяет от свободной и занятой.
« Последнее редактирование: 04-04-2008 15:11 от Вад » Записан
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #5 : 04-04-2008 15:44 » 

Rulik, может посмотреть в сторону struct mem_control_block ?
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
Rulik
Помогающий

ru
Offline Offline

« Ответ #6 : 04-04-2008 16:01 » 

Написал тест, который в бесконечном цикле выделяет память, в итоге у меня память уменьшилась в 10 раз. Что говорит о присутствии кэша.
Но хотелось бы скидывать кэши из своей программы.
Записан
Вад
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 04-04-2008 16:07 » 

Rulik, всё-таки, в этом есть какая-то потребность, кроме душевного спокойствия о том, что память полностью свободна? Улыбаюсь В системе ведь не зря этот механизм реализован Улыбаюсь
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #8 : 05-04-2008 19:13 » 

Очень рекомендую читать документацию. Первым делом всем смотреть pinfo libc !

Цитата
3.2.2.8 Malloc Tunable Parameters
.................................

You can adjust some parameters for dynamic memory allocation with the
`mallopt' function.  This function is the general SVID/XPG interface,
defined in `malloc.h'.

 -- Function: int mallopt (int PARAM, int VALUE)
     When calling `mallopt', the PARAM argument specifies the parameter
     to be set, and VALUE the new value to be set.  Possible choices
     for PARAM, as defined in `malloc.h', are:

    `M_TRIM_THRESHOLD'
          This is the minimum size (in bytes) of the top-most,
          releasable chunk that will cause `sbrk' to be called with a
          negative argument in order to return memory to the system.

    `M_TOP_PAD'
          This parameter determines the amount of extra memory to
          obtain from the system when a call to `sbrk' is required.  It
          also specifies the number of bytes to retain when shrinking
          the heap by calling `sbrk' with a negative argument.  This
          provides the necessary hysteresis in heap size such that
          excessive amounts of system calls can be avoided.

    `M_MMAP_THRESHOLD'
          All chunks larger than this value are allocated outside the
          normal heap, using the `mmap' system call.  This way it is
          guaranteed that the memory for these chunks can be returned
          to the system on `free'.  Note that requests smaller than
          this threshold might still be allocated via `mmap'.

    `M_MMAP_MAX'
          The maximum number of chunks to allocate with `mmap'.
          Setting this to zero disables all use of `mmap'.

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

Сам столкнулся 4 года назад с такой же проблемой. Программа собирала статистику в БД. Кушала мало, т.к. регулярно сбрасывала буфера в БД, но когда шла обработка накопленной информации, то база на несколько минут могла подвиснуть и размеры буферов росли, а память системе не возвращалась. Естественно, полез читать libc...
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Rulik
Помогающий

ru
Offline Offline

« Ответ #9 : 07-04-2008 07:58 » new

RXL, мой респект тебе.
Сейчас попробую. Спасибо за совет. А то уж думал, что ни как нельзя управлять этим процессом.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines