RUS  ENG 

Память ZuluServer

Страницы: 1
RSS
Память ZuluServer
 
Добрый день!
Мы столкнулись с такой проблемой:
На сервере работает ZuluServer на 20 клиентов. Некоторые клиенты работают круглосуточно,
другие подключаются и отключаются в течение дня. При подключении клиентов память,
которую использует ZuluServer, увеличивается, а при отключении уменьшается, но не полностью.
Таким образом, память непрерывно растет, за день до 10Мб.
Из-за этого приходится через какое-то время перезапускать ZuluServer.
Вы можете что-то посоветовать?
 
А какая версия сервера?
 
Версия сервера: 6.0.0.3955
 
Чтобы определить причину утечек, нужна дополнительная информация. Если память уменьшается просто после подключился-отключился - это одно. Если в результате длительной работы, то возможно теряют память какие-то отдельные функции. Тогда нам нужно искать утечку по всем командам, вызываемым вашими пользователями. Это уже целое мероприятие. Если есть хоть какие-то уточняющие сведения, когда теряется память, а когда нет (или всегда), просьба сообщить. Сейчас у нас текущая версия сервера 7. Если будем искать утечки, то уже на этой версии. В любом случае погоняем, поищем.
 
В клиентах, которые работают непрерывно, на мой взгляд есть критичные операции:
- обновление меток на карте (около 20) методом OnDrawUserLabels примерно раз в секунду;
- изменение положения символа (около 50) примерно раз в секунду.
На двух клиентах, которые подключаются, редактируют карту.
Остальные в основном просто смотрят.

Еще такой вопрос:
Я пишу на Дельфи.
Если я в программе использую переменную типа ILayer, причем я не создаю слой,
а просто присваиваю ей значение указателя на слой из компонента ZuluMapCtrl,
обязательно ли перед выходом обнулять эту переменную?

например,

LayerSeti: ILayer;
LayerSeti := zmpMain.Map.Layers.Item[IndexSeti];
...
LayerSeti := nil;

насколько это критично?
 
Цитата:
обязательно ли перед выходом обнулять эту переменную?

Нет, не обязательно, т.к. ссылка на интерфейс высвобождается в деструкторе дельфийского объекта ILayer.
 
На подключение-отключение, OnDrawUserLabels, перемещение символов утечек нет (крутил каждую секунду около часа).
Расширенные тесты сделаем, но скачайте все-таки последнюю шестую версию. Там последние месяцы параллельно с седьмой тоже ряд исправлений делали.
 
Версию скачаю. А насчет обнуления памяти вот откуда вопрос:
Я сначала не обнуляла указатели, но потом заметила, что при отключении программы от сервера Zulu
Монитор пишет не Disconnected, а Killed. Стала перед выходом обнулять глобальные указатели и указатели - члены класса.
Стало отключаться корректно. Вот я и подумала, что это может иметь значение.
И еще непонятно - у нас на работе и у заказчика стоит одна и та же версия сервера, только у нас на 5 клиентов.
Программы вроде те же запускаем, но у нас память если и растет, то за ночь возвращается на место - а там нет.
Хотя мы в основном редактируем из оболочки Zulu, а они - из программы с компонентом ZuluMapCtrl.
В общем сейчас скачаю последнюю версию, поставим к заказчику через неделю и напишу результат.
 
То что сервер пишет Killed, говорит о нештатном убиении соединения. В частности, если соединение не подает признаков жизни какое то время, сервер связ разрывает. В этом случае вполне возможно неполное высвобождение выделенных для соединения ресурсов. Можем это исследовать, но в любом случае, добейтесь в разработке своего приложения, чтобы соединение завершалось через Disconnect
 
Обновили ZuluServer, все клиенты отключаются корректно - а память растет.
Ночью, когда непрерывно подключено 6 клиентов, память стабильна,
с утра подключается еще 8-9, а когда они к вечеру отключаются - память не освобождается.
В диспетчере задач видно, что растет и память, и виртуальная память и ошибки страниц.
Непонятно - когда я просто запускаю какого-нибудь клиента, а потом выгружаю - память через некоторое время возвращается в исходное состояние.
 
Есть подозрение на работу с базой данных. Мы используем Sybase SQL Anywere 10.1. Подключение через АДО, Provider=SAOLEDB.10.
В программе-клиенте использую объект ZbDatabase. У него есть метод Open, но нет Close, и это слегка смущает, т.к. в программе открываются разные семантические базы.
Если создать объект через zdb := CoZbDatabase.Create() при запуске программы,
а при выгрузке просто обнулить zdb := nil; - это корректно?
 
1. Метод Open открывает описатель БД и загружает описательную информацию. Сам метод соединение с СУБД не производит.
2. zdb := nil; корректно.
 
Ну да, после Open я конечно использую другие методы для получения данных, например:
zds: IZbDataset;
zfi: IZbFieldInfo;

zds := zdb.Queries.Item[1].SelectByKey(key);
...
zfi := zds.GetFieldInfo(i);
fval := zds.FieldDisplayValue[i];
...
zds := nil;
zfi := nil;

Просто хочу понять, в каком случае сервер Zulu не хочет освобождать память при отключении клиента. И есть подозрение, что это происходит при обращения клиента к семантической БД.
Кстати, сейчас смотрела на домашнем сервере: при подкл-откл клиента память на сервере постепенно растет. Но когда какое-то время нет обращений, она скачком освобождается.
А у заказчика в сети есть программы-клиенты, которые работают круглосуточно. Может они не дают освободить память :) ?
Для нас это актуально, за неделю память, занимаемая ZuluServer, достигает 150 Мб, и приходится его перегружать, что на работающей системе не очень желательно :(.
 
У ZuluServer нет собственного "сборщика мусора" или еще какого-то механизма, из-за которого скачкообразно будет высвобождаться память в "idle-time".
Если есть подозрение на работу с СУБД, то здесь есть следующие нюансы:
1. ZuluServer кэширует соединения с ADO. Клиент может несколько раз открыть/закрыть базу и между этими событиями соединение не закрывается. Однако когда клиент отсоединяется - соединения ADO закрываются и высвобождаются. Если они не высвобождаются - память бы всегда только росла;
2. Соединение ADO использует провайдер OLE DB - как он использует память неизвестно;
3. Провайдер OLE DB использует клиент Sybase - как он использует память также неизвестно;

Проверка пп. 2 и 3 такова:
1. Перенести базу на тестовом сервере скажем на MS SQL или же просто MS Access
2. ADO соединение перенастроить на новую СУБД.
Если память не утекает - то точно виновата связка ADO/Sybase.
Далее:
3. Пробуем соединиться с Sybase, но уже не через ADO, а через BDE/ODBC. Исключаем тем самым OLEDB провайдер.
Этот способ может не получится, т.к. BDE/ODBC не поддерживает строковые поля unicode если они есть в таблицах
 
Спасибо за совет! Перенастроила подключение к Sybase через ODBC, и все стало нормально - днем память растет, ночью освобождается. Одно только не очень удобно: чтобы изменить подключение, приходится ходить по всем слоям и по всем базам в слое, что довольно долго. Это, конечно, дает гибкую настройку, но было бы хорошо иметь возможность сделать это где-то в одном месте :).
 
В ZuluServer 7.0 появились "источники данных Zulu" (www.politerm.com.ru/zuludoc/zb_datasrc_overview.htm), которые как раз удобны в этом случае.
Страницы: 1