powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / заканчивается память на сервере
11 сообщений из 11, страница 1 из 1
заканчивается память на сервере
    #38471297
budden
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго времени суток.

32-разрядный Firebird 2.5.2 Classic на 64-разрядном Windows server 2003.

Проблема такая - имеется довольно большой отчёт, для отладки сделано протоколирование через автономные транзакции.
По ошибке протоколирование оказалось включено в production версии.
Процедура, которая пишет в журнал - такая:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
create or alter procedure PRTKL_ZAPISAT (REF_EXTERNAL_PRTKL integer,TYP char(20),TEXT varchar(510))
as
begin 
if (ref_external_prtkl is null) then
  select rdb$get_context('USER_SESSION','ref_external_prtkl') from dual into ref_external_prtkl;

if (ref_external_prtkl is null) then 
  ref_external_prtkl=gen_id(g_prtkl,0);

if (row_count=0) then 
  begin
  exception e_debug 'Нет протокола с кодом'||ref_external_prtkl; 
  exit;
  end

in autonomous transaction do
  begin
  insert into prtkla_zapis(ref_prtkl,vremya,typ,text,id) values
  (:ref_external_prtkl,cast('NOW' as timestamp),:typ,:text,gen_id(g_prtkla_zapis,1));
  end 
 
 END^



Похоже, что кусок с row_count - это рудимент, оставшийся от старых версий процедуры, но оставляю его для чистоты эксперимента. Таблица, в которую делается запись - такая

Код: plsql
1.
2.
3.
4.
5.
6.
7.
CREATE TABLE PRTKLA_ZAPIS (
    REF_PRTKL  INTEGER,
    VREMYA     TIMESTAMP default current_timestamp(3),
    TYP        CHAR(20) COLLATE PXW_CYRL,
    TEXT       VARCHAR(510) COLLATE PXW_CYRL,
    ID         INTEGER
);


Ещё есть процедура dual,
Код: sql
1.
2.
3.
4.
5.
6.
7.
create or alter procedure DUAL
returns (C char(1))
as
begin
c=' ';
suspend;
end^



Отчёт приводить не буду - он очень большой. Отчёт - это хранимая процедура, возвращающая значения через suspend.

В отчёте есть внешний цикл, скажем, по товарам, для каждого товара заполняются временные таблицы, выводятся данные по товару. Затем порождается исключение, которое отлавливается блоком on ... do. При этом происходит откат изменений во временных таблицах и благодаря этому предотвращается замедление отчёта по мере прохождения цикла по товарам.
Запись в протокол разбросана везде по коду.

Если не вызывать из отчёта процедуру prtkl_zapisat, то всё нормально. Если вызывать, то через какое-то количество вызовов
(не считал, но возможно, около миллиона) заканчивается память в серверном процессе - "unable to allocate memory from operating system".

Естественно, после обнаружения проблемы я отключил протоколирование в production и на этом неприятности закончились. Но осадочек остался - непонятно, в чём дело и где в следующий раз я подорвусь.

Раньше был Firebird 2.1, протоколирование было сделано через внешние таблицы. Не могу сказать, что я формировал логи такого размера, как этот, случайно получившийся, но, во всяком случае, проблем с нехваткой памяти не было ни разу за 3-4 года эксплуатации. Я грешу на автономные транзакции, но, в общем-то, наверное, на это нет достаточных оснований.

Блобов в отчёте вроде бы нигде нет. Во всяком случае (повторюсь) при отключённом протоколировании он работает совершенно нормально.

Что может быть не так?
...
Рейтинг: 0 / 0
заканчивается память на сервере
    #38471368
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
budden,

процедура dual явно лишняя

Код: plsql
1.
2.
3.
4.
....
if (ref_external_prtkl is null) then
  ref_external_prtkl = rdb$get_context('USER_SESSION','ref_external_prtkl');
....



Этот кусок тоже не нужен
Код: plsql
1.
2.
3.
4.
5.
if (row_count=0) then 
  begin
  exception e_debug 'Нет протокола с кодом'||ref_external_prtkl; 
  exit;
  end



В основной процедуре отчёта есть UDF? Для таблицы prtkla_zapis есть триггеры?
...
Рейтинг: 0 / 0
заканчивается память на сервере
    #38471390
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
budden,

в процедуре есть конкатенация блобов, функция LIST?
...
Рейтинг: 0 / 0
заканчивается память на сервере
    #38471939
budden
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис, kdv, возможно, что лишняя, но именно этот код дал у меня ошибку, привожу его для чистоты эксперимента. Про кусок с row_count я уже оговорил.
Триггеров нет. udf есть: mod - стандартная, c - из rfunc, listadd - есть на сайте.
Насчёт list - не знаю, как посмотреть, там ведь не один исходник, а целое дерево. Вроде нет, хотя это не 100%. Конкатенации блобов нет.

Особенность состоит вот в чём: отчёт выдаёт довольно много строк (точно не знаю, но думаю, не меньше 10000).
Если вызывается prtkl_zapisat, то он падает довольно рано (то ли на строке 4000, то ли на 400).

В общем, понятно, что я не ответил на ваши вопросы. Что, пытаться сделать маленький пример без моего отчёта?
...
Рейтинг: 0 / 0
заканчивается память на сервере
    #38471970
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buddenЧто, пытаться сделать маленький пример без моего отчёта?
Для начала хотя бы посмотри: кончается физическая память на сервере или виртуальная у
процесса.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
заканчивается память на сервере
    #38472174
budden
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov, на 90% я уверен, что память кончалась в серверном процессе. Память там ограничена уж по меньшей мере разрядностью сервера Firebird, а физически памяти на железе навалом. По правде сказать, проблема была месяц назад, я её быстро "решил" отключением протоколирования (которое было не к месту в промышленной базе) и бросил в трекер. Сегодня проводил уборку в трекере и нашёл её. Сейчас некогда её воспроизводить повторно, т.к. до возникновения ошибки отчёт крутится примерно полчаса. Я наделся, это что-то очевидное и мне сразу на это укажут. Если неочевидное, видимо, придётся отложить до лучших времён.
...
Рейтинг: 0 / 0
заканчивается память на сервере
    #38472191
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
budden32-разрядный Firebird 2.5. 2 . . . сделано протоколирование через автономные транзакции.
<...>
Что может быть не так?Может, выделенная циферка слегка влияет ?..
Ибо "Fix Version/s: 3.0 Alpha 1, 2.5. 3 "
...
Рейтинг: 0 / 0
заканчивается память на сервере
    #38472520
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я бы посоветовал запустить в цикле вызов процедуры лога без собственно отчета и посмотреть, течет ли память. Скрипты для такого теста можно глянуть тут
...
Рейтинг: 0 / 0
заканчивается память на сервере
    #38472528
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, и механизм намеренного вызова исключений с целью отката транзакции меня как-то смущает
...
Рейтинг: 0 / 0
заканчивается память на сервере
    #38472746
budden
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид, вот этого я и хотел. Большое спасибо! При случае обновлюсь, а там посмотрим, повторится ли проблема.
...
Рейтинг: 0 / 0
заканчивается память на сервере
    #38472750
budden
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Да, и механизм намеренного вызова исключений с целью отката транзакции меня как-то смущает
Fr0sT-Brutal, только с помощью этого механизма удалось добиться приемлемой производительности. Этот механизм вполне законен и прописан в документации (во всяком случае, в книжке он описан). Другое дело, какие баги при этом могут оказаться затронуты. Но практика показывает, что этот отчёт был вполне работоспособен в течение нескольких лет с этим механизмом. Так что рекомендую :)
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / заканчивается память на сервере
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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