Имя: Пароль:
1C
 
Утечки памяти в ОС
0 TormozIT
 
гуру
23.07.10
14:00
8.1.15.14

Стали замечать, что терминальный сервер, где выполняются интенсивные обработки данных в клиентских приложениях 1С, постепенно опустошает свободную физическую память. Она не освобождается даже после завершения всех процессов и пользовательской сессии ОС. Смотрим в диспетчер задач без фильтра по пользователю - общая сумма используемой процессами памяти (Private Working Set) не превышает 1ГБ. Ну не может же ОС зарезервировать 90% физ. памяти (из 8ГБ) под свои кэши и т.д.

Думаю причина в утечках при работе с общей кучей памяти в ОС.

Подскажите как можно разобраться с такой проблемой?
1 shuhard
 
23.07.10
14:01
(0) есть множество диспетчеров задач, позволяющих получить детальную картину
встроенный для этого не годится
2 TormozIT
 
гуру
23.07.10
14:44
Я также использовал Process Explorer (Mark Russinovich).
3 TormozIT
 
гуру
01.08.10
21:39
Опять Терминальный сервер не дает войти никому. Но основные системные службы все еще работают.

Я могу подключиться perfmon'ом. Смотрю Aviable Physical Memory - 2GB Of 10GB (20%). А запущено то пару десятков процессов всего, чья сумма Private Working Set  не превышает 500MB. Системный кэш 300МБ

Уже всю голову сломал, чем заняты остальные 7GB?
4 TormozIT
 
гуру
01.08.10
21:41
При попытке входа winlogon.exe падает и в лог Application пишет

ID:    4005
Source:    Microsoft-Windows-Winlogon
Version:    6.0
Symbolic Name:    EVENT_WINLOGON_FATAL_FAILURE
Message:    The Windows logon process has unexpectedly terminated.
5 Рэйв
 
02.08.10
00:41
(0)Имхо, Гдето держит файлы в память, Толи из кеша толи еще откуда....
6 6tuf
 
02.08.10
06:21
у сервера 1с предприятие вроде были утечки, приходится перезагружать серв. а вот насчет клиента - хз
7 TormozIT
 
гуру
02.08.10
10:42
(5) Не совсем понял. Поясни пожта.

(6) На сколько я знаю, те утечки приводили к необходимости перезапуска серверных процессов 1С, но не самой ОС.
8 TormozIT
 
гуру
02.08.10
10:48
Может ли быть (косвенной) причиной вызов метода Terminate у Win32_Process? Может при этом какие то хендлы на открытые файлы не освобождаются?
9 loh_pedalny
 
02.08.10
11:26
(8)может
10 TormozIT
 
гуру
02.08.10
12:00
(9) В таком случае проблема вероятно в платформе. Но как ее отловить, как продемонстрировать ее разработчикам, что она есть?
11 Jstunner
 
02.08.10
12:07
(10) стотысячмиллионов раз повторить подозреваемую операцию
12 loh_pedalny
 
02.08.10
13:18
(10)MSDN
The TerminateProcess function is used to unconditionally cause a process to exit. The state of global data maintained by dynamic-link libraries (DLLs) may be compromised if TerminateProcess is used rather than ExitProcess.
В связи с этим и утечки. Выделенная память может автоматически и не освобождаться.
13 TormozIT
 
гуру
02.08.10
15:04
Имею WMI объект класса Win32_Process http://msdn.microsoft.com/en-us/library/aa394372(VS.85).aspx. Это в моем случае 1cv8.exe. Нужно его завершить. Я вызываю метод Terminate(), т.к. других способов не вижу.
14 TormozIT
 
гуру
02.08.10
15:08
Если кто то знает более правильный способ завершить процесс 1С (в том числе зависший) снаружи по PID, то пусть не молчит)
15 TormozIT
 
гуру
02.08.10
15:23
(12) ExitProcess процесс может вызывать только сам для себя, а у меня процесс может быть завис (не отвечает). Снаружи завершить процесс можно только через TerminateProcess или Terminate.
16 TormozIT
 
гуру
02.08.10
16:33
MSDN отмечает

The TerminateProcess function is used to unconditionally cause a process to exit. The state of global data maintained by dynamic-link libraries (DLLs) may be compromised if TerminateProcess is used rather than ExitProcess.



Тут  http://wm-help.net/books-online/book/59464/59464-23.html пишут следующее


Вызов функции TerminateProcess завершает процесс:

BOOL TerminateProcess( HANDLE hProcoss, UINT fuExitCode);

Главное отличие этой функции от ExitProcess в том, что ее может вызвать любой поток и завершить любой процесс. Параметр bProcess идентифицирует описатель завершаемого процесса, а в параметре fuExitCode возвращается код завершения про цесса.

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

Процесс действительно не имеет ни малейшего шанса самому провести очистку, но операционная система высвобождает все принадлежавшие ему ресурсы: возвращает себе выделенную им память, закрывает любые открытые файлы, уменьшает счетчики соответствующих объектов ядра и разрушает все его User- и GDI-объекты.

По завершении процесса (не важно каким способом) система гарантирует: после него ничего не останется — даже намеков на то, что он когда-то выполнялся. Завершенный процесс не оставляет за собой никаких следов.



Закрадывается подозрение, что при таком завершении процесса все же есть вероятность, что ОС не сумеет освободить все ресурсы процесса. Может ли кто то компетентно подтвердить или опровергнуть это предположение?
17 TormozIT
 
гуру
02.08.10
23:55
Похоже taskkill локально завершает процессы мягким способом, давая им освободить все ресурсы.

Осталось еще доделать удаленный локальный его запуск.
18 TormozIT
 
гуру
21.08.10
23:36
Метод завершения процессов здесь похоже не причем.
Новейшей программой rammap удалось выяснить, что неуклонно растет таблица страниц (Page table). Похоже это рост фрагментированности памяти.
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс