Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / заканчивается память на сервере / 11 сообщений из 11, страница 1 из 1
20.11.2013, 14:39:20
    #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
20.11.2013, 15:07:08
    #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
20.11.2013, 15:16:38
    #38471390
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
заканчивается память на сервере
budden,

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

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

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


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