|
Утечки памяти в ОС | ☑ | ||
---|---|---|---|---|
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). Похоже это рост фрагментированности памяти. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |