+  HandyCache форум
|-+  Главная категория» Общие вопросы» Управление памятью
Имя пользователя:
Пароль:
Страниц: [1] 2 3  Все   Вниз
  Отправить эту тему    Печать  
Автор Тема: Управление памятью  (Прочитано 26227 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Михаил
Gold beta tester
*****

Репутация: +337/-14
Offline Offline

Сообщений: 5513



« : 01 января 2008, 17:42:24 »

Поделюсь парой наблюдений по менеджменту оперативной памяти.
Запускаю НС, он в трее. Он сразу берет под себя ~ 12 МБ (почему так много?). Нагружаю программу - используемая память постепенно вырастает до 250 МБ и впечатление, что может расти до бесконечности.
Нажимаю на значок в трее - НС разворачивается из трея в окно. Если я снова нажму на значок или нажму на крестик в окне или "ESC" - НС свернется обратно, и расход памяти останется неизменным. А вот если нажму на прямоугольник программы в таскбаре, то НС так же свернется в трей, но используемая память сократится до ~ 1,5 - 3,5 МБ.
Подумалось также, что НС, возможно, отдает память, если запустить что-то ресурсоемкое. Запустил навороченную игру. НС ни пяди от 250 МБ не отдал.
Имхо, неплохо б освобождать память автоматически: раз в какой-то период времени и/или при достижении определенного лимита расходования оперативной памяти.
Сообщить модератору   Записан
mai62
Автор HC
*****

Репутация: +226/-4
Offline Offline

Сообщений: 6383


« Ответ #1 : 01 января 2008, 20:03:15 »

Управление памятью есть, просто когда наблюдаешь надо иметь терпение (управление памятью не терпит суеты  Подмигивающий). Вот графики работы моего НС за прибл. 36 часов.


* hc.png (13.01 Кб, 875x332 - просмотрено 152 раз.)
Сообщить модератору   Записан
Михаил
Gold beta tester
*****

Репутация: +337/-14
Offline Offline

Сообщений: 5513



« Ответ #2 : 01 января 2008, 20:37:29 »

А суеты нет. Период в 1 час регулярной нагрузки - и поступательно возрастающий расход оперативной памяти до 250!!! МБ. Это нормально?

И еще одна проблема с памятью. Посмотри, плиз, это "Out of Memory".

* bugreport.rar (4.77 Кб - загружено 27 раз.)
« Последнее редактирование: 01 января 2008, 21:01:47 от Михаил » Сообщить модератору   Записан
mai62
Автор HC
*****

Репутация: +226/-4
Offline Offline

Сообщений: 6383


« Ответ #3 : 01 января 2008, 21:56:26 »

Цитировать
Период в 1 час регулярной нагрузки
Не знаю что это было, но по моему ты просто хотел изнасиловать НС. Я насчитал больше 150 потоков, предназначенных для обработки запросов.
Цитировать
поступательно возрастающий расход оперативной памяти до 250!!! МБ. Это нормально?
Нормально. Эти 150 потоков работают с регулярными выражениями, которые изрядно жрут стэк из-за рекурсивного вызова подпрограмм. Так что несколько мегобайт на стэк потока, к сожалению, горькая реальность.
Цитировать
И еще одна проблема с памятью. Посмотри, плиз, это "Out of Memory"
Отказ в выделении памяти произошел при попытке получить память для лога. Подозреваю, что у тебя был включен лог с отладочной информацией. Лог хранится в памяти и это еще одна статья расхода. Понимаю, что хранение всего лога в памяти, не лучшее решение. Но пока это так.
Сообщить модератору   Записан
Михаил
Gold beta tester
*****

Репутация: +337/-14
Offline Offline

Сообщений: 5513



« Ответ #4 : 02 января 2008, 00:04:28 »

Не знаю что это было
Подключил benchmarker, чтоб погонять НС на режимах, достижимых в сети при одновременной работе многих пользователей. Изучаю возможность установки НС на реальной сети. Погоняю некоторое время виртуально, заодно изучу матчасть. Надеюсь, результаты будут тебе интересны.
Цитировать
Нормально. Эти 150 потоков работают с регулярными выражениями, которые изрядно жрут стэк из-за рекурсивного вызова подпрограмм. Так что несколько мегобайт на стэк потока, к сожалению, горькая реальность.
Эти 150 потоков, зафиксированные в момент сбоя, 250 МБ не едят. Они отъедают 1-3 МБ, следующие 150 еще и т.д. Постепенно за полчаса-час накапливается 250 МБ. Впечатление, что после отработки эти потоки не освобождают память.
Что делается при сворачивании в трей путем нажатия на таскбаре?
Из-за чего кушается 12 МБ при запуске НС?
« Последнее редактирование: 02 января 2008, 00:17:58 от Михаил » Сообщить модератору   Записан
mai62
Автор HC
*****

Репутация: +226/-4
Offline Offline

Сообщений: 6383


« Ответ #5 : 02 января 2008, 01:19:44 »

Цитировать
Впечатление, что после отработки эти потоки не освобождают память.
Создание/удаление потоков съедает немало процессорного времени. Поэтому потоки не убиваются сразу после использования (закрытия соединения), а остаются в кэше потоков, откуда и берутся для повторного использования. НС наблюдает за средним количеством реально занятых работой потоков и когда в кэше накапливаюся лишние потоки, НС их удаляет. Но делает это не сразу, а спустя какое-то время (вдруг снова понадобятся).
Цитировать
Что делается при сворачивании в трей путем нажатия на таскбаре?
Вызывается функция SetProcessWorkingSetSize(GetCurrentProcess, $FFFFFFFF, $FFFFFFFF);
Цитата отсюда http://msdn2.microsoft.com/en-us/library/ms686234.aspx
Цитировать
Sets the minimum and maximum working set sizes for the specified process.
...
The working set of a process is the set of memory pages currently visible to the process in physical RAM memory. These pages are resident and available for an application to use without triggering a page fault. The minimum and maximum working set sizes affect the virtual memory paging behavior of a process.

The working set of the specified process can be emptied by specifying the value (SIZE_T)-1 for both the minimum and maximum working set sizes. The pages are removed from the caller's working set. If there are no other processes that are mapping these pages, then they become candidates to be written to backing store. If a pages is still mapped by another process, the page is not written to the backing store until it is unmapped or trimmed from the working set of each mapping process.
Когда я пишу $FFFFFFFF, это и значит (SIZE_T)-1.
Цитировать
Из-за чего кушается 12 МБ при запуске НС?
При запуске НС создает штук 8 (не помню точно сколько) потоков, чтобы можно было быстро обработать первые запросы.
Кроме другой работы при старте: загрузка настроек, компилирование правил из списков.
Столько памяти нужно было НС при старте. И даже если столько уже не нужно, менеджер памяти системы оставляет ее 'закрепленной' за программой. Тоже на всякий случай: раз понадобилась однажды, может понадобиться снова и незачем лишний раз тратить время на выделение/освобождение памяти пока можно себе позволить такую вольность.
« Последнее редактирование: 02 января 2008, 01:31:12 от mai62 » Сообщить модератору   Записан
NothingAnother
Beta tester
*****

Репутация: +7/-2
Offline Offline

Сообщений: 434

Spoiler


« Ответ #6 : 02 января 2008, 11:17:20 »

Из-за чего кушается 12 МБ при запуске НС?
Хм-м, интересно,- у меня (Vista x64) при старте HC выделяется 8M (плюс/минус 200K с луной/без)...
Сообщить модератору   Записан

Мы тоже не всего читали Шнитке!..
© В. Вишневский
Михаил
Gold beta tester
*****

Репутация: +337/-14
Offline Offline

Сообщений: 5513



« Ответ #7 : 02 января 2008, 12:32:26 »

При запуске НС создал 6 потоков, взял памяти 11,4 МБ. В принципе, ничего в этом криминального нет, просто казалось (не уверен), что раньше ело 4-5 МБ.

Понаблюдал за НС в сравнении с Проксомитроном в ходе работы. Весь трафик шел: клиент-НС-Проксомитрон-сервер. Каждое новое соединение и/или запрос вызывает телодвижения (сопровождаются захватом дополнительной виртуальной памяти) как НС, так и Прокса. После отработки соединения/запроса Прокс всю эту память с точностью до байта сразу освобождает. НС освобождает кусок, меньший выделенной памяти. В итоге отводимая под НС виртуальная память неуклонно прирастает. Память под Прокс остается теми же 2,4 МБ.

Что делается с отработанными соединениями keep-alive между клиентом-НС и НС-сервером? Кто их закрывает? Какова величина таймаута, после которого они закрываются?

Цитировать
И даже если столько уже не нужно, менеджер памяти системы оставляет ее 'закрепленной' за программой. Тоже на всякий случай: раз понадобилась однажды, может понадобиться снова и незачем лишний раз тратить время на выделение/освобождение памяти пока можно себе позволить такую вольность.
Тем не менее бОльшая часть освобождается, а оставляется лишь маленький кусочек. Очень уж похоже на leak.
Почему эта память не уменьшается менеджером системы, когда НС вообще не нагружен, а я запускаю очень ресурсоемкую игру? Может, память все-же держит сам НС?
« Последнее редактирование: 02 января 2008, 12:50:14 от Михаил » Сообщить модератору   Записан
mai62
Автор HC
*****

Репутация: +226/-4
Offline Offline

Сообщений: 6383


« Ответ #8 : 02 января 2008, 14:05:01 »

Цитировать
Что делается с отработанными соединениями keep-alive между клиентом-НС и НС-сервером? Кто их закрывает? Какова величина таймаута, после которого они закрываются?
Если все запросы браузера НС обслужил и запросов больше нет, он держит соединение 15 сек и разрывает. Если в это время есть соединение с сервером, оно тоже сохраняется.
Цитировать
Тем не менее бОльшая часть освобождается, а оставляется лишь маленький кусочек.
Может это лог съедает? Сейчас сбросил у себя лог и освободилось мегобайт 12. С логом при включенной отладочной информацией нужно быть острожным, уж очень много туда пишется.
Утечки памяти в ноябре почистил. С тех пор вроде ничего потенциально опасного в этом плане не делал.
Цитировать
Почему эта память не уменьшается менеджером системы, когда НС вообще не нагружен, а я запускаю очень ресурсоемкую игру? Может, память все-же держит сам НС?
Я уже писал, что НС удаляет потоки не сразу. Время сохранение может исчисляться минутами или даже десятками минут (зависит от количества потоков, чем больше потоков тем дольше ждать).
Как это происходит видно на моей картинке (это график поведения НС за 24 часа).
Сообщить модератору   Записан
Михаил
Gold beta tester
*****

Репутация: +337/-14
Offline Offline

Сообщений: 5513



« Ответ #9 : 02 января 2008, 21:42:32 »

mai62
Есть смысл вникать в эту тему дальше? Если я правильно понимаю, версия 1 все равно не ориентирована на интенсивную сетевую нагрузку, а версия 2 пишется с нуля.
Сообщить модератору   Записан
mai62
Автор HC
*****

Репутация: +226/-4
Offline Offline

Сообщений: 6383


« Ответ #10 : 02 января 2008, 21:57:07 »

Во второй версии мне хочется сделать по другому: отдельный поток для каждого запроса слишком расточительно получается. Ну а в первой выбора нет, Indy только так может работать.
Сообщить модератору   Записан
Михаил
Gold beta tester
*****

Репутация: +337/-14
Offline Offline

Сообщений: 5513



« Ответ #11 : 03 января 2008, 23:45:06 »

Во второй версии мне хочется сделать по другому: отдельный поток для каждого запроса слишком расточительно получается.
Полностью согласен. Еще оцени, отвечают ли требованиям оперативности реагирования на ситуацию блокирующие сокеты. Имхо, их хорошо использовать только в приложениях, где скорость/пропускная способность связи не имеет критического значения.
Сообщить модератору   Записан
mihmih
Новичок
*

Репутация: +0/-0
Offline Offline

Сообщений: 5


« Ответ #12 : 12 декабря 2008, 17:56:54 »

После 422 часов работы (~10 пользователей) потребление памяти 44 мб - виртуальной 600! мбайт. Грустный
что такое может быть?
Сообщить модератору   Записан
Parcher
Постоялец
***

Репутация: +1/-0
Offline Offline

Сообщений: 136


« Ответ #13 : 27 августа 2009, 15:24:46 »

Дабы не создавать новую тему, пишу сюда.

В диспечере задач для НС выделено памяти (частный рабочий набор) порядком 150 000 кб. Это нормально? Доступ через НС имеют 5 пользователей.


* Снимок.JPG (21.68 Кб, 563x80 - просмотрено 49 раз.)
Сообщить модератору   Записан
mai62
Автор HC
*****

Репутация: +226/-4
Offline Offline

Сообщений: 6383


« Ответ #14 : 27 августа 2009, 15:51:15 »

В последних версиях НС на вкладке О программе организован мониторинг потребления ресурсов. Приведи скриншот этой вкладки. Разные программы показывают разные параметры, поэтому сравнивать их показания сложно.
К увеличению потребления ресурсов приводит большая активность пользователей, использование расширений, неограниченное количество строк в мониторе, включенное ведение лога. У тебя скорее всего это результат деятельности пользователя, который качает с торентов. Торент одновременно открывает много соединений и из-за этого растет потребление памяти.
« Последнее редактирование: 27 августа 2009, 15:55:46 от mai62 » Сообщить модератору   Записан
Parcher
Постоялец
***

Репутация: +1/-0
Offline Offline

Сообщений: 136


« Ответ #15 : 27 августа 2009, 15:59:40 »

Есть большая активность пользователей, использование расширений. Количество строк в мониторе 5000 - это много? Ведение лога отключено.


* Снимок.JPG (60.75 Кб, 1124x204 - просмотрено 56 раз.)
Сообщить модератору   Записан
mai62
Автор HC
*****

Репутация: +226/-4
Offline Offline

Сообщений: 6383


« Ответ #16 : 27 августа 2009, 16:10:11 »

Цитировать
Количество строк в мониторе 5000 - это много?
Нормально.
Смотри на нижний график, там цифры 4/113. Т.е. сейчас у тебя 4 активных соединения, а максимум был 113 одновременных активных соединений. После бана торрентов количество соединений резко упало, при серфенге столько соединений пяти пользователям не нужно. Через некоторое расход памяти должен сократиться.
Сообщить модератору   Записан
Parcher
Постоялец
***

Репутация: +1/-0
Offline Offline

Сообщений: 136


« Ответ #17 : 28 августа 2009, 08:53:01 »

Я вот что заметил: при первом запуске НС потребляет что-то около 10-15 метров, а может и того меньше. Но при длительной работы без перезагрузки (комп днями не выключается) НС как раз и выходит на потребление в 150 мб! И при этом активность пользователей не очень большая. Вот сейчас НС забирает уже 50 мб. Последний раз я перезагружал НС вчера вечером.
Сообщить модератору   Записан
mai62
Автор HC
*****

Репутация: +226/-4
Offline Offline

Сообщений: 6383


« Ответ #18 : 28 августа 2009, 12:14:41 »

150 Мб многовато, но не смертельно. Особенно при существенной нагрузке. 50 Мб (до 80-90) - это нормально. НС не отдает все полученные у системы ресурсы сразу, а придерживает для повторного использования. Получение ресурсов у системы сравнительно длительная операция, поэтому ее лучше избегать. Плохим признаком может являться монотонный рост потребления памяти, с этим нужно разбираться.
Сообщить модератору   Записан
Parcher
Постоялец
***

Репутация: +1/-0
Offline Offline

Сообщений: 136


« Ответ #19 : 28 августа 2009, 12:19:39 »

Как-то можно замерить этот рост потребления? Или только визуально?
Сообщить модератору   Записан
Страниц: [1] 2 3  Все   Вверх
  Отправить эту тему    Печать  

 
Перейти в: