powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / При долгой работе переполняется память сервера Firebird 1.5.1.4481
17 сообщений из 42, страница 2 из 2
При долгой работе переполняется память сервера Firebird 1.5.1.4481
    #39203734
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vs815,

интересно, для кого я делал
http://www.ibase.ru/files/download/safeudf.zip ?
...
Рейтинг: 0 / 0
При долгой работе переполняется память сервера Firebird 1.5.1.4481
    #39203735
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vs815Попробовал освобождать память в UDF
тебе пишут про неправильную декларацию udf - если используешь ib_util_malloc, так надо декларировать udf с FREE_IT.
А ты начинаешь какую-то вообще адскую фигню типа "освобождать память в udf".
...
Рейтинг: 0 / 0
При долгой работе переполняется память сервера Firebird 1.5.1.4481
    #39203737
vs815
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

А что не правильно: ib_util_malloc выделил память под переменную sSmall, а FreеMem освободил память выделенную под sSmall.

Сильно не пинай - с памятью работал мало.
...
Рейтинг: 0 / 0
При долгой работе переполняется память сервера Firebird 1.5.1.4481
    #39203740
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vs815А что не правильно: ib_util_malloc выделил память под переменную sSmall, а FreеMem освободил память выделенную под sSmall.
ядрена-матрена... ib_util_malloc выделяет память через менеджер MSVCRT. FreeMem освобождает память, выделенную дельфевым менеджером. Они несовместимы, вообще. FreeMem может освобождать только память, выделенную через GetMem.
Если память выделяется и освобождается внутри udf, то без разницы, каким менеджером ее выделять и освобождать, главное, чтобы это был один и тот же менеджер.
Использовать ib_util_malloc имеет смысл только для FREE_IT. Т.е. когда память выделяется внутри udf, а освобождается в Firebird, одним и тем же менеджером.

p.s. стыдоба, честное слово.
...
Рейтинг: 0 / 0
При долгой работе переполняется память сервера Firebird 1.5.1.4481
    #39203741
vs815
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kdvvs815Попробовал освобождать память в UDF
тебе пишут про неправильную декларацию udf - если используешь ib_util_malloc, так надо декларировать udf с FREE_IT.
А ты начинаешь какую-то вообще адскую фигню типа "освобождать память в udf".

Я понял про неправильную декларацию. Но не правильно задекларировано 15 функций на которые ссылается 100500 процедур в базе. Это ж нужно писать скрипт который:
1. все зависимые процедуры закомментит,
2. удалит функции,
3. создаст функции с FREE_IT,
4. раскоментирует процедуры из первого пункта.

Вот я и предположил более легкий вариант решения проблемы. С памятью работал мало, поэтому выдвинул адскую ересь :)
...
Рейтинг: 0 / 0
При долгой работе переполняется память сервера Firebird 1.5.1.4481
    #39203742
vs815
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kdv,

Вот это четко и ясно объяснено. Большое спасибо.
...
Рейтинг: 0 / 0
При долгой работе переполняется память сервера Firebird 1.5.1.4481
    #39203743
vs815
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kdvvs815А что не правильно: ib_util_malloc выделил память под переменную sSmall, а FreеMem освободил память выделенную под sSmall.
ядрена-матрена... ib_util_malloc выделяет память через менеджер MSVCRT. FreeMem освобождает память, выделенную дельфевым менеджером. Они несовместимы, вообще. FreeMem может освобождать только память, выделенную через GetMem.
Если память выделяется и освобождается внутри udf, то без разницы, каким менеджером ее выделять и освобождать, главное, чтобы это был один и тот же менеджер.
Использовать ib_util_malloc имеет смысл только для FREE_IT. Т.е. когда память выделяется внутри udf, а освобождается в Firebird, одним и тем же менеджером.

p.s. стыдоба, честное слово.

Вот это четко и ясно объяснено. Большое спасибо.
...
Рейтинг: 0 / 0
При долгой работе переполняется память сервера Firebird 1.5.1.4481
    #39203744
vs815
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем большое спасибо кто помогал решить проблему. Проблема решена и тему можно закрыть.
...
Рейтинг: 0 / 0
При долгой работе переполняется память сервера Firebird 1.5.1.4481
    #39203746
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vs815Но не правильно задекларировано 15 функций на которые ссылается 100500 процедур в базе. Это ж нужно писать скрипт который:
1. все зависимые процедуры закомментит,
2. удалит функции,
3. создаст функции с FREE_IT,
4. раскоментирует процедуры из первого пункта.


Попробуй CREATE OR ALTER FUNCTION...
Если прокатит - обойдешься скриптом в 15 операторов.
...
Рейтинг: 0 / 0
При долгой работе переполняется память сервера Firebird 1.5.1.4481
    #39203748
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vs815,

а что там, разве подкорректировать декларацию без комментирования зависимостей в ФБ 1.5 нельзя? по-моему вполне можно. Как минимум, прямо через системные таблицы.

vs815Но не правильно задекларировано 15 функций
большой привет разработчику этих функций. На ibase.ru уже как минимум лет 13-15 дофигища примеров. И я всегда говорю, что перед написанием своих udf нужно ознакомиться с примерами на сайте, и свои функции писать на базе этих примеров, а не от балды.
Но нет, находятся люди, которые все эти советы игнорируют.
...
Рейтинг: 0 / 0
При долгой работе переполняется память сервера Firebird 1.5.1.4481
    #39203749
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vs815,

на всякий случай
- создаем ПРАВИЛЬНУЮ декларацию функции, например, кривая RUPPER, декларируем правильную RUPPER1
- смотрим, чем отличаются параметры в rdb$function_parameters
- меняем неправильные параметры в RUPPER в соответствии с RUPPER1, в этой самой rdb$
- смотрим декларацию rupper, в isql или ibexpert, или ... Декларация совпадает с rupper1? оч. хорошо.
- проверяем вызов rupper на миллионе записей. утечки нет? оч. хорошо.
- проверяем вызов rupper в одной из процедур. Утечки нет? оч. хорошо.

возможно, я ошибаюсь, и надо перекомпилировать эти самые 100500 процедур. Но в данном случае потребуется просто их перекомпиляция, что можно сделать выколупнув их из скрипта базы (isql -x). Никакого комментирования и восстановления текста процедур не будет нужно.
...
Рейтинг: 0 / 0
При долгой работе переполняется память сервера Firebird 1.5.1.4481
    #39203750
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockПопробуй CREATE OR ALTER FUNCTION...
Если прокатит - обойдешься скриптом в 15 операторов.А, не, нет такого наверно
...
Рейтинг: 0 / 0
При долгой работе переполняется память сервера Firebird 1.5.1.4481
    #39203778
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock,

конечно нет. Это ты с Fb 3 перепутал, но и там этот синтаксис не для UDF.
...
Рейтинг: 0 / 0
При долгой работе переполняется память сервера Firebird 1.5.1.4481
    #39203919
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vs815Это ж нужно писать скрипт который:Это для не ленивых.

Для ленивых:
1. выгнать всех юзеров из БД.
2. сделать копию БД.
3. одним кликом мыши в эксперте деактивировать нахрен все процедуры (по необходимости дропнуть вьюхи и триггера).
3. задекларировать УДФ правильно.
4. скомпарить экспертом полученную базу и копию из пункта 2.
5. подкорректировать скрипт после компарера (тупо выкинуть неправильные декларации УДФ).
6 накатить скрипт.
...
Рейтинг: 0 / 0
При долгой работе переполняется память сервера Firebird 1.5.1.4481
    #39204261
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanAriochпропущено...


нет, D5 вполне создает 2KB

что до RTL - 18992590
Меняет регистр в качестве удф? Или речь о пустой заглушке?

Там был DLL-плагин для Fidolook Express SL, логика была небольшая, разумеется. Не uppercase, но и ненамного сложнее (из трёх плагинов ниже 4 кб внезапно провалился только один, самый простой). А вот что конкретно было - я уже не помню. Пришлось для выкладывания на сайте добивать размер до 4 кб константами :-)
...
Рейтинг: 0 / 0
При долгой работе переполняется память сервера Firebird 1.5.1.4481
    #39204323
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ariochvs815,

https://ibase.ru/udf_ok/ По просьбам телезрителей добавил ссылку в прилепленную тему.
...
Рейтинг: 0 / 0
При долгой работе переполняется память сервера Firebird 1.5.1.4481
    #39204459
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vs815Попробовал освобождать память в UDF - сервер упал. В логе написано следующее:

Что я сделал не правильно?

Сам подход изначально порочный, понимаю у тебя по запарке и от отчаяния, но тем не менее.

Первая проблема в том, что - КОГДА ты собираешься освобождать память? Твоя DLL не знает, когда сервер закончил с ней работать, в результате ты с большой вероятностью СНАЧАЛА освободишь память, а ПОТОМ уже попросишь сервер прочитать результат из памяти - которой уже не существует потом что она была ранее уже освобождена досрочно. И этот вопрос синхронизации чтения и уничтожения результата - ключевой.

Именно для этого введена пара ib_util_malloc / FREE_IT - сервер знает когда он прочитал результат и может его уничтожать и сам его и уничтожает.

Раз уж от меня пошли охотничьи байки, то

1. в FidoLook SL пробелма синхронизации была решщена другим образом, там плагины предоставляли три фиксированные стандартные процедуры, а ля OCX: перечислить-описать новые функции реализованные в этом плагине, вызвать функцию по имени и списку строковых параметров, освободить память из под конкретного параметра/результата. То есть втам была обратная модель, сервер не занимался самоосвобождением памяти и не предоставлял плагинам интерфейс для выделения её, наоборот он запрашивал у плагинов интерфейс для ее освобождения и вызывал его сам.

2. для усушки-утруски DLL до 2 КБ (когда на Дельфи впервые делеаешь такого рамера файлы глаза загораются и хочется жать до предела. Дожал...) мне пришлось выкинуть стандартный для D5 heap manager и заменить его на Microsoft LocalAlloc и прочее. В отличие от BorlandMM майкрософтские функции сделаны "для отладчика", при освобождении памяти она принудительно затирается. Внезапно оказалось, что fidolookSL СНАЧАЛА вызывает dll-free-memory, а уже ПОТОМ пытается читать результат. С обычными менеджерами памяти что в Дельфи, что в VC++ это не вызывало проблемы: освободив память они ее не затирали, и сервер мог прочитать и использовать результат-привидение.

3. Убедить автора исправить сервер ради идеологической чистоты и правильности не удалось. Возвращать в игру BorlandMM не хотелось, хотелось по прежнему минимального размера, для чего нужен был Windows LocalAlloc. В результате пришлось переделать DLL в такую довольно стрёмную схему.

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
var GlobalResult: string;

function DLL-Process-Function( name, parameters ): PChar;
var TmpResult: string;
begin
  .........вычисления....
  GlobalResult := TmpResult;
  Result := @GlobalResult[1];
end;



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

поскольку вызов вполнялся только из GUI, один вызов за раз - то всё работало.
и возможно такая схема бы работала с Firebird Classic

но с многопоточным SuperServer эта схема неработоспособна - два клиента одновременно из разных подключений вызовут UDF-фнкцию и одна из них обязательно убъёт результат другой...
Впрочем можно попробовать поиграть с глобальными threadvar вместо var, но это всё очень ненадёжно...
...
Рейтинг: 0 / 0
17 сообщений из 42, страница 2 из 2
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / При долгой работе переполняется память сервера Firebird 1.5.1.4481
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]