|
При долгой работе переполняется память сервера Firebird 1.5.1.4481
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2016, 00:02 |
|
При долгой работе переполняется память сервера Firebird 1.5.1.4481
|
|||
---|---|---|---|
#18+
vs815Попробовал освобождать память в UDF тебе пишут про неправильную декларацию udf - если используешь ib_util_malloc, так надо декларировать udf с FREE_IT. А ты начинаешь какую-то вообще адскую фигню типа "освобождать память в udf". ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2016, 00:04 |
|
При долгой работе переполняется память сервера Firebird 1.5.1.4481
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, А что не правильно: ib_util_malloc выделил память под переменную sSmall, а FreеMem освободил память выделенную под sSmall. Сильно не пинай - с памятью работал мало. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2016, 00:06 |
|
При долгой работе переполняется память сервера Firebird 1.5.1.4481
|
|||
---|---|---|---|
#18+
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. стыдоба, честное слово. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2016, 00:18 |
|
При долгой работе переполняется память сервера Firebird 1.5.1.4481
|
|||
---|---|---|---|
#18+
kdvvs815Попробовал освобождать память в UDF тебе пишут про неправильную декларацию udf - если используешь ib_util_malloc, так надо декларировать udf с FREE_IT. А ты начинаешь какую-то вообще адскую фигню типа "освобождать память в udf". Я понял про неправильную декларацию. Но не правильно задекларировано 15 функций на которые ссылается 100500 процедур в базе. Это ж нужно писать скрипт который: 1. все зависимые процедуры закомментит, 2. удалит функции, 3. создаст функции с FREE_IT, 4. раскоментирует процедуры из первого пункта. Вот я и предположил более легкий вариант решения проблемы. С памятью работал мало, поэтому выдвинул адскую ересь :) ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2016, 00:18 |
|
При долгой работе переполняется память сервера Firebird 1.5.1.4481
|
|||
---|---|---|---|
#18+
kdv, Вот это четко и ясно объяснено. Большое спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2016, 00:20 |
|
При долгой работе переполняется память сервера Firebird 1.5.1.4481
|
|||
---|---|---|---|
#18+
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. стыдоба, честное слово. Вот это четко и ясно объяснено. Большое спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2016, 00:21 |
|
При долгой работе переполняется память сервера Firebird 1.5.1.4481
|
|||
---|---|---|---|
#18+
Всем большое спасибо кто помогал решить проблему. Проблема решена и тему можно закрыть. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2016, 00:23 |
|
При долгой работе переполняется память сервера Firebird 1.5.1.4481
|
|||
---|---|---|---|
#18+
vs815Но не правильно задекларировано 15 функций на которые ссылается 100500 процедур в базе. Это ж нужно писать скрипт который: 1. все зависимые процедуры закомментит, 2. удалит функции, 3. создаст функции с FREE_IT, 4. раскоментирует процедуры из первого пункта. Попробуй CREATE OR ALTER FUNCTION... Если прокатит - обойдешься скриптом в 15 операторов. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2016, 00:26 |
|
При долгой работе переполняется память сервера Firebird 1.5.1.4481
|
|||
---|---|---|---|
#18+
vs815, а что там, разве подкорректировать декларацию без комментирования зависимостей в ФБ 1.5 нельзя? по-моему вполне можно. Как минимум, прямо через системные таблицы. vs815Но не правильно задекларировано 15 функций большой привет разработчику этих функций. На ibase.ru уже как минимум лет 13-15 дофигища примеров. И я всегда говорю, что перед написанием своих udf нужно ознакомиться с примерами на сайте, и свои функции писать на базе этих примеров, а не от балды. Но нет, находятся люди, которые все эти советы игнорируют. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2016, 00:27 |
|
При долгой работе переполняется память сервера Firebird 1.5.1.4481
|
|||
---|---|---|---|
#18+
vs815, на всякий случай - создаем ПРАВИЛЬНУЮ декларацию функции, например, кривая RUPPER, декларируем правильную RUPPER1 - смотрим, чем отличаются параметры в rdb$function_parameters - меняем неправильные параметры в RUPPER в соответствии с RUPPER1, в этой самой rdb$ - смотрим декларацию rupper, в isql или ibexpert, или ... Декларация совпадает с rupper1? оч. хорошо. - проверяем вызов rupper на миллионе записей. утечки нет? оч. хорошо. - проверяем вызов rupper в одной из процедур. Утечки нет? оч. хорошо. возможно, я ошибаюсь, и надо перекомпилировать эти самые 100500 процедур. Но в данном случае потребуется просто их перекомпиляция, что можно сделать выколупнув их из скрипта базы (isql -x). Никакого комментирования и восстановления текста процедур не будет нужно. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2016, 00:32 |
|
При долгой работе переполняется память сервера Firebird 1.5.1.4481
|
|||
---|---|---|---|
#18+
YuRockПопробуй CREATE OR ALTER FUNCTION... Если прокатит - обойдешься скриптом в 15 операторов.А, не, нет такого наверно ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2016, 00:32 |
|
При долгой работе переполняется память сервера Firebird 1.5.1.4481
|
|||
---|---|---|---|
#18+
YuRock, конечно нет. Это ты с Fb 3 перепутал, но и там этот синтаксис не для UDF. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2016, 07:23 |
|
При долгой работе переполняется память сервера Firebird 1.5.1.4481
|
|||
---|---|---|---|
#18+
vs815Это ж нужно писать скрипт который:Это для не ленивых. Для ленивых: 1. выгнать всех юзеров из БД. 2. сделать копию БД. 3. одним кликом мыши в эксперте деактивировать нахрен все процедуры (по необходимости дропнуть вьюхи и триггера). 3. задекларировать УДФ правильно. 4. скомпарить экспертом полученную базу и копию из пункта 2. 5. подкорректировать скрипт после компарера (тупо выкинуть неправильные декларации УДФ). 6 накатить скрипт. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2016, 11:13 |
|
При долгой работе переполняется память сервера Firebird 1.5.1.4481
|
|||
---|---|---|---|
#18+
wadmanAriochпропущено... нет, D5 вполне создает 2KB что до RTL - 18992590 Меняет регистр в качестве удф? Или речь о пустой заглушке? Там был DLL-плагин для Fidolook Express SL, логика была небольшая, разумеется. Не uppercase, но и ненамного сложнее (из трёх плагинов ниже 4 кб внезапно провалился только один, самый простой). А вот что конкретно было - я уже не помню. Пришлось для выкладывания на сайте добивать размер до 4 кб константами :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2016, 15:37 |
|
При долгой работе переполняется память сервера Firebird 1.5.1.4481
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2016, 16:31 |
|
При долгой работе переполняется память сервера Firebird 1.5.1.4481
|
|||
---|---|---|---|
#18+
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.
...другими словами освобождение памяти происходило в следующем вызове функции, для чего старый результат хранился в глобальной переменной. поскольку вызов вполнялся только из GUI, один вызов за раз - то всё работало. и возможно такая схема бы работала с Firebird Classic но с многопоточным SuperServer эта схема неработоспособна - два клиента одновременно из разных подключений вызовут UDF-фнкцию и одна из них обязательно убъёт результат другой... Впрочем можно попробовать поиграть с глобальными threadvar вместо var, но это всё очень ненадёжно... ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2016, 18:36 |
|
|
start [/forum/topic.php?fid=40&gotonew=1&tid=1562262]: |
0ms |
get settings: |
9ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
37ms |
get topic data: |
10ms |
get first new msg: |
6ms |
get forum data: |
2ms |
get page messages: |
57ms |
get tp. blocked users: |
1ms |
others: | 267ms |
total: | 406ms |
0 / 0 |