|
При долгой работе переполняется память сервера Firebird 1.5.1.4481
|
|||
---|---|---|---|
#18+
Здравствуйте. Описание проблемы: СУБД Firebird 1.5.1.4481 стоит на сервере Windows Server 2008 R2 Enterprise 64 bit с 8 Гб ОЗУ. С течением времени память процесса fbserver постоянно растет. При достижение 1,9 Гб Firebird начинает глючить и выдавать ошибки. Отключение пользователей от базы данных не уменьшает память процесса. Помогает только перезапуск Firebird. По совету из FAQ http://www.ibase.ru/firebird-interbase-yaffil-faq/#При долгой работе переполняется память сервера проверил самописную udf на предмет утечки памяти. Проблема в udf. Понять что не правильно написано в udf не могу. Помогите, пожалуйста, решить проблему с утечкой памяти. Текст udf (написана на Delphi 7): Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2016, 16:13 |
|
При долгой работе переполняется память сервера Firebird 1.5.1.4481
|
|||
---|---|---|---|
#18+
vs815 Код: pascal 1. 2.
Вот эти две строки удали. Они гадят. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2016, 16:18 |
|
При долгой работе переполняется память сервера Firebird 1.5.1.4481
|
|||
---|---|---|---|
#18+
vs815СУБД Firebird 1.5.1.4481 Серия 1.5 кончилась на 1.5.6: http://www.firebirdsql.org/en/firebird-1-5/ vs815Текст udf А её объявление в базе?.. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2016, 16:20 |
|
При долгой работе переполняется память сервера Firebird 1.5.1.4481
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, DECLARE EXTERNAL FUNCTION RUPPER CSTRING(16383) RETURNS CSTRING(16383) ENTRY_POINT 'fn_rupper' MODULE_NAME 'mondll'; ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2016, 16:59 |
|
При долгой работе переполняется память сервера Firebird 1.5.1.4481
|
|||
---|---|---|---|
#18+
Где FREE_IT? Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2016, 17:03 |
|
При долгой работе переполняется память сервера Firebird 1.5.1.4481
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, А где FREE_IT должен быть? Не могли бы привести пример на базе моей udf? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2016, 17:12 |
|
При долгой работе переполняется память сервера Firebird 1.5.1.4481
|
|||
---|---|---|---|
#18+
Мелочь, возможно, но зачем два раа подряд создавaть паскаль-строки из с-строки ? Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
[/quote] И в SQL-объявлении функции xорошо бы наверное прописать кодировку Windows-1251 А то поступит строка, например, в UTF-8 - что делать функции ? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2016, 17:13 |
|
При долгой работе переполняется память сервера Firebird 1.5.1.4481
|
|||
---|---|---|---|
#18+
vs815Dimitry Sibiryakov, А где FREE_IT должен быть? Не могли бы привести пример на базе моей udf? смотри пример http://www.firebirdsql.org/en/writing-udfs-for-interbase/#writing_udfs_in_delphi_for_windows_platforms ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2016, 17:14 |
|
При долгой работе переполняется память сервера Firebird 1.5.1.4481
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2016, 17:16 |
|
При долгой работе переполняется память сервера Firebird 1.5.1.4481
|
|||
---|---|---|---|
#18+
Arioch, ну какой UTF-8 в 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2016, 17:18 |
|
При долгой работе переполняется память сервера Firebird 1.5.1.4481
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovГде FREE_IT? +1 и выкинуть лишние модули из udf. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2016, 17:20 |
|
При долгой работе переполняется память сервера Firebird 1.5.1.4481
|
|||
---|---|---|---|
#18+
Симонов Денис, ну мало ли что туда еще по факту придет ? в параметрах соединения забудут поставить кодировку или перепутают - и приедет КОИ8-Р с юниксов. UTF-16 с Явы или новой Дельфи, да хоть Unicode_fss причем ещё и осядет где-нибудь в PSQL, xрен потом найдешь ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2016, 17:21 |
|
При долгой работе переполняется память сервера Firebird 1.5.1.4481
|
|||
---|---|---|---|
#18+
vs815А где FREE_IT должен быть? Там, где ему положено быть согласно Language Reference . Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2016, 17:23 |
|
При долгой работе переполняется память сервера Firebird 1.5.1.4481
|
|||
---|---|---|---|
#18+
wadman, ...и поменять RTL, и в итоге сделать DLL настолько маленькую, что Windows ее загрузить не смoжет :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2016, 17:31 |
|
При долгой работе переполняется память сервера Firebird 1.5.1.4481
|
|||
---|---|---|---|
#18+
Arioch, нормально все будет :) 17210217 ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2016, 17:39 |
|
При долгой работе переполняется память сервера Firebird 1.5.1.4481
|
|||
---|---|---|---|
#18+
wadman, ну и какой размер скомпилированного файла? в 2KB влезло ? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2016, 17:40 |
|
При долгой работе переполняется память сервера Firebird 1.5.1.4481
|
|||
---|---|---|---|
#18+
Arioch, 2кб это психологический барьер? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2016, 17:57 |
|
При долгой работе переполняется память сервера Firebird 1.5.1.4481
|
|||
---|---|---|---|
#18+
wadman, Вопрос к разработчикам Windows, для меня это было неожиданностью. По факту оказалось, что Windows не способна загрузить DLL такого размера. Я подозреваю, что настоящая граница - 4KB - размер страницы виртуальной памяти в 80386, каковых в бинарнике под Win32 загрузчиком ожидается целое число. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2016, 18:42 |
|
При долгой работе переполняется память сервера Firebird 1.5.1.4481
|
|||
---|---|---|---|
#18+
Arioch, компилятор делфи и ртл успешно обходят этот маленький недостаток. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2016, 18:55 |
|
При долгой работе переполняется память сервера Firebird 1.5.1.4481
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2016, 20:25 |
|
При долгой работе переполняется память сервера Firebird 1.5.1.4481
|
|||
---|---|---|---|
#18+
Ariochwadmanкомпилятор делфи нет, D5 вполне создает 2KB что до RTL - 18992590 Меняет регистр в качестве удф? Или речь о пустой заглушке? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2016, 20:30 |
|
При долгой работе переполняется память сервера Firebird 1.5.1.4481
|
|||
---|---|---|---|
#18+
wadman, В UDF много различных функций для работы с текстом. Я привел пример одной из них (предварительно удалив лишнее). В таком варианте также идет утечка памяти. Как подсказали выше (и особенно помогла статья https://ibase.ru/udf_ok/ ) проблема в неправильной регистрации функции в базе. Отсюда возник и вопрос: а можно ли оставить объявление функции в базе как было Код: plsql 1. 2. 3. 4.
а освобождение памяти реализовать в udf вот так: Код: pascal 1. 2. 3. 4. 5. 6.
... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2016, 21:48 |
|
При долгой работе переполняется память сервера Firebird 1.5.1.4481
|
|||
---|---|---|---|
#18+
vs815можно ли Нельзя, запрещаю. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2016, 22:09 |
|
При долгой работе переполняется память сервера Firebird 1.5.1.4481
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, Попробовал освобождать память в UDF - сервер упал. В логе написано следующее: SUPER (Client) Tue Mar 29 23:14:24 2016 INET/inet_error: send errno = 10054 SUPER (Client) Tue Mar 29 23:14:24 2016 REMOTE INTERFACE/gds__detach: Unsuccesful detach from database. Uncommitted work may have been lost SUPER (Client) Tue Mar 29 23:14:24 2016 INET/inet_error: send errno = 10054 Что я сделал не правильно? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2016, 23:24 |
|
При долгой работе переполняется память сервера Firebird 1.5.1.4481
|
|||
---|---|---|---|
#18+
vs815Что я сделал не правильно? 1. Не используешь мозг. 2. Не слушаешь старших. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
29.03.2016, 23:56 |
|
При долгой работе переполняется память сервера 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?all=1&fid=40&tid=1562262]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
46ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
68ms |
get tp. blocked users: |
1ms |
others: | 14ms |
total: | 174ms |
0 / 0 |