powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Informix [игнор отключен] [закрыт для гостей] / shmtotal на 11.50FC6 на win2003х64
11 сообщений из 11, страница 1 из 1
shmtotal на 11.50FC6 на win2003х64
    #36547001
falcon111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, возник какой-то странный вопрос по установке SHMTOTAL. Раньше стояла настройка 0, но когда сервер стал залазить за объемы памяти, которые может ему дать операционка - я решил прикрыть это дело при помощи SHMTOTAL.
На сервере 8 гиг памяти.

Настройки:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
RESIDENT  1 
SHMBASE 0x80000000L
SHMVIRTSIZE  3670016 
SHMADD  131072 
EXTSHMADD  131072 
SHMTOTAL  0  # 4089446 
SHMVIRT_ALLOCSEG  0 , 3 
#SHMNOACCESS 0x70000000-0x7FFFFFFF

В общем при старте сервер сразу аллокирует чуть больше 4 гиг памяти. решил я его ограничить 6 гигами. НО! Выяснилось, что любое значение начиная с 4 гигабайт и больше выдает ошибку
Код: plaintext
Value of SHMTOTAL exceeds operating system limits.

При указании значения SHMTOTAL меньше 4 гиг эта ругань не появлсяется, зато появляется
Код: plaintext
1.
Size of resident + virtual segments 423232KB + 3670016KB > 4089446KB
         total allowed by configuration parameter SHMTOTAL
И сервер опять-таки не стартует.

Так вот собственно вопрос - это что получается, больше 4 гиг сервер использовать не может, потому что это exceeds operating system limits, но при этом если лимиты серверу не указывать, то сервер прекрасно использует памяти больше 4 гиг и ос ему не помеха?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Memory Use on  64 -Bit Platforms
With  64 -bit addressing, you can have larger buffer pools to reduce the amount of
I/O operations to obtain data from disks. Because  64 -bit platforms allow for larger
memory-address space, the maximum values for the following memory-related
configuration parameters are larger on  64 -bit platforms:
v BUFFERPOOL
v CLEANERS
v DS_MAX_QUERIES
v DS_TOTAL_MEMORY
v LOCKS
v LRUS
Chapter  7 . Shared Memory  7 - 31 
v SHMADD
v SHMVIRTSIZE
Тут про SHMTOTAL тоже нигде ничего не упоминается

В общем, поясните мне, в каких трех соснах я заблудился, а то как-то нелогично получается с этим SHMTOTAL.

Заранее спасибо :)
...
Рейтинг: 0 / 0
shmtotal на 11.50FC6 на win2003х64
    #36547903
vasilis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
falcon111,
Какая в точности версия Windows 2003 ?
...
Рейтинг: 0 / 0
shmtotal на 11.50FC6 на win2003х64
    #36548635
falcon111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vasilisКакая в точности версия Windows 2003 ?
Данные winver:

Windows Server 2003 Enterprise x64 edition Русская.
Версия 5.2 (сборка 3790.srv03_sp2_gdr.090805-1438:service pack 2)
Доступная физическая память 8387264 Кб
...
Рейтинг: 0 / 0
shmtotal на 11.50FC6 на win2003х64
    #36549135
vasilis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
falcon111З
Тут про SHMTOTAL тоже нигде ничего не упоминается

С этим параметром на Винде уже давно были странности.
Помню, что в какой то из старых версий (7.3 или 9.3) при его установке и достижении сервером "потолка" начинались веселые траблы с постоянно выскакивавшей ошибкой. Был какой то фикс на эту тему....Также в различных, редких тогда, материалах относительно информикс на Винде, этот параметр старательно обходился вниманием. Короче, с того времени я всегда избегал его установки и не рекомендовал его использовать.
Связано это с довольно запутанной архитектурой и использованием памяти в 32-разр. архитектуре винды, чему есть масса примеров. Здесь я проводил некоторые исследования . Думал. что в 64-разр. арх. эти проблемы ушли, но, похоже, что нет.
Вроде осталась некая проблема с первым 2-Гб лимитом, через который нельзя сделать тот же большой буферный пул единым (он делится на части).
Попробуйте посмотреть Administering Informix Dynamic Server on Microsoft Windows в части памяти - может на какие-то мысли навеет.
Но я бы зашел с другой стороны - почему все таки память так сильно растет ? Может надо копнуть в сторону приложений и memory lack ?
...
Рейтинг: 0 / 0
shmtotal на 11.50FC6 на win2003х64
    #36549509
falcon111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vasilisНо я бы зашел с другой стороны - почему все таки память так сильно растет ? Может надо копнуть в сторону приложений и memory lack ?

В этом направлении работы тоже ведутся :)
Один и тот же С-шный код (в части взаимодействия с sql-базой), но выполняющий разные процедуры, работает с разными результатами.
Два бинарника аллокируют по 200К-300К на сессию и дальше объем памяти на их сессиях не растет.

А вот еще два...

В худшем случае за одно выполнение процедуры на сервере на сессии увеличивается объем потребляемой памяти на порядка 100К. Похоже на утечки в самом сервере.
Я уже процедуру и так и сяк переписывал, выкинул часть спорного кода, но все равно память расходуется.

Ладно, гулять так гулять :) , вот пример худшего сценария. Смысл процедуры - выбирает из таблицы часть записей во временную таблицу и по выбранным полям меняет в изначальной таблице несколько полей. Возвращает приложению число подготовленных записей.

Было:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
create procedure T_Get_Ch (
  ) returning integer as CRows;

  define CommitMe      integer;
  define rc            integer;

  define t_TId         like LOData.TID;
  define t_LId         like LOData.LId;
  define t_ModuleId    like LOData.ModuleId;
  define t_Port        like LOData.Port;
  define t_IP          like LOData.IP;
  define t_LCDt        like LOData.LCDt;
  define t_Host        like LOData.Host;
  define t_LimTimeOut  like LOData.LimTimeOut;
  define t_CfgVer      like LOData.CfgVer;

  set lock mode to wait  3 ;

  begin
    on exception in (- 535 ) -- Already in transaction
      let CommitMe= 0 ;
    end exception with resume;
    let CommitMe= 1 ;
    begin work;
  end;
  begin
    define vSQL, vISAM     integer;
    define vMES            varchar( 250 );

    on exception set vSQL, vISAM, vMES
      if CommitMe!= 0  then rollback work; end if;
      raise exception vSQL, vISAM, vMES;
    end exception;

    begin
      on exception in (- 310 , - 958 )  -- Table already exists
        delete from t_t_ch; let rc= 1 ;
      end exception with resume;
      let rc= 0 ;
      create temp table t_t_ch (
        TId      integer,
        LId      integer,
        ModuleId integer,
        Port     integer,
        IP       numeric( 10 , 0 ),
        NCDt     integer,
        HostName varchar( 128 ),
        TimeOut  integer,
        CfgVer   smallint
      ) with no log;
      if rc== 0  then
        create index I_tmp_t_cfg    on t_t_ch(moduleid,Lid);
      end if;
    end;

    let t_LCDt=dbinfo('utc_current');
    let rc= 0 ;

    foreach cur1 for
      select o.TID, o.LId, o.ModuleId, nvl(o.Port,  0 ), o.ip, o.host, o.LimTimeOut, o.CfgVer
      into t_TID, t_LId, t_ModuleId, t_Port, t_IP, t_Host, t_LimTimeOut, t_CfgVer
      from LOData o
      where o.ModType='T' and o.Status in ( 0 , 1 ) and o.CMode='Y' and o.CStatus='G'

      insert into t_t_ch(TID, LId, ModuleId, Port, IP, NCDt, HostName, TimeOut, CfgVer)
      values(t_TID, t_LId, t_ModuleId, t_Port, t_IP, t_LCDt, t_Host, t_LimTimeOut, t_CfgVer);

      update LOData set (CStatus, CNum, CDt)=
                              ('W',  1 , t_LCDt)
      where current of cur1;

      let rc=rc+ 1 ;
    end foreach;

    update statistics low for table t_t_ch;

    if CommitMe!= 0  then commit work; end if;
  end;

  return rc;
end procedure;

Жрало по 100К за один запуск.

Стал искать. Сперва убрал создание индекса и апдейт статистики перед отдачей таблицы приложению.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
create procedure T_Get_Ch (
  ) returning integer as CRows;

  define CommitMe      integer;
  define rc            integer;

  define t_TId         like LOData.TID;
  define t_LId         like LOData.LId;
  define t_ModuleId    like LOData.ModuleId;
  define t_Port        like LOData.Port;
  define t_IP          like LOData.IP;
  define t_LCDt        like LOData.LCDt;
  define t_Host        like LOData.Host;
  define t_LimTimeOut  like LOData.LimTimeOut;
  define t_CfgVer      like LOData.CfgVer;

  set lock mode to wait  3 ;

  begin
    on exception in (- 535 ) -- Already in transaction
      let CommitMe= 0 ;
    end exception with resume;
    let CommitMe= 1 ;
    begin work;
  end;
  begin
    define vSQL, vISAM     integer;
    define vMES            varchar( 250 );

    on exception set vSQL, vISAM, vMES
      if CommitMe!= 0  then rollback work; end if;
      raise exception vSQL, vISAM, vMES;
    end exception;

    begin
      on exception in (- 310 , - 958 )  -- Table already exists
        delete from t_t_ch;
      end exception with resume;
      create temp table t_t_ch (
        TId      integer,
        LId      integer,
        ModuleId integer,
        Port     integer,
        IP       numeric( 10 , 0 ),
        NCDt     integer,
        HostName varchar( 128 ),
        TimeOut  integer,
        CfgVer   smallint
      ) with no log;
    end;

    let t_LCDt=dbinfo('utc_current');
    let rc= 0 ;

    foreach cur1 for
      select o.TID, o.LId, o.ModuleId, nvl(o.Port,  0 ), o.ip, o.host, o.LimTimeOut, o.CfgVer
      into t_TID, t_LId, t_ModuleId, t_Port, t_IP, t_Host, t_LimTimeOut, t_CfgVer
      from LOData o
      where o.ModType='T' and o.Status in ( 0 , 1 ) and o.CMode='Y' and o.CStatus='G'

      insert into t_t_ch(TID, LId, ModuleId, Port, IP, NCDt, HostName, TimeOut, CfgVer)
      values(t_TID, t_LId, t_ModuleId, t_Port, t_IP, t_LCDt, t_Host, t_LimTimeOut, t_CfgVer);

      update LOData set (CStatus, CNum, CDt)=
                              ('W',  1 , t_LCDt)
      where current of cur1;

      let rc=rc+ 1 ;
    end foreach;

    if CommitMe!= 0  then commit work; end if;
  end;

  return rc;
end procedure;

Жрать стало сразу на порядок меньше, но точно сейчас не скажу сколько и при каждом запуске или нет.

Дальше стал искать наугад. Пределал создание временной таблицы:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
    begin
      on exception in (- 206 ) -- table not found
        create temp table t_t_ch (
          TId      integer,
          LId      integer,
          ModuleId integer,
          Port     integer,
          IP       numeric( 10 , 0 ),
          NCDt     integer,
          HostName varchar( 128 ),
          TimeOut  integer,
          CfgVer   smallint
        ) with no log;
      end exception with resume;

      delete from t_t_ch;
    end;

Не помогло. Избавился от foreach-а, получил такой вариант:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
create procedure T_Get_Ch (
  ) returning integer as CRows;

  define CommitMe      integer;
  define rc            integer;

  define t_TId         like LOData.TID;
  define t_LId         like LOData.LId;
  define t_ModuleId    like LOData.ModuleId;
  define t_Port        like LOData.Port;
  define t_IP          like LOData.IP;
  define t_LCDt        like LOData.LCDt;
  define t_Host        like LOData.Host;
  define t_LimTimeOut  like LOData.LimTimeOut;
  define t_CfgVer      like LOData.CfgVer;

  set lock mode to wait  3 ;

  begin
    on exception in (- 535 ) -- Already in transaction
      let CommitMe= 0 ;
    end exception with resume;
    let CommitMe= 1 ;
    begin work;
  end;
  begin
    define vSQL, vISAM     integer;
    define vMES            varchar( 250 );

    on exception set vSQL, vISAM, vMES
      if CommitMe!= 0  then rollback work; end if;
      raise exception vSQL, vISAM, vMES;
    end exception;

    begin
      on exception in (- 206 ) -- table not found
        create temp table t_t_ch (
          TId      integer,
          LId      integer,
          ModuleId integer,
          Port     integer,
          IP       numeric( 10 , 0 ),
          NCDt     integer,
          HostName varchar( 128 ),
          TimeOut  integer,
          CfgVer   smallint
        ) with no log;
      end exception with resume;

      delete from t_t_ch;
    end;

    let t_LCDt=dbinfo('utc_current');

    insert into t_t_ch(TID, LId, ModuleId, Port, IP, NCDt, HostName, TimeOut, CfgVer)
    select o.TID, o.LId, o.ModuleId, nvl(o.Port, 0 ), o.IP, t_LCDt, o.Host, o.LimTimeOut, o.CfgVer
    from LOData o
    where o.ModType='T' and o.Status in ( 0 , 1 ) and o.CMode='Y' and o.CStatus='G';

    let rc=DBINFO('sqlca.sqlerrd2');

    if rc> 0  then
      update LOData set (CStatus, CNum, CSent)=('W',  1 , t_LCDt)
      where LId in (select LId from t_t_ch);
    end if;

    if CommitMe!= 0  then commit work; end if;
  end;

  return rc;
end procedure;

В таком варианте - холостые запуски процедуры - когда из LOData ничего не выбирается и не апдейтится, память не жрет. Но если там хоть одна запись выбирается - сессия "дожирает" 4К памяти.

Клиентских сессий много, таких приложений - тоже. Память поедается аж бегом :(

memory leak в самом сервере? И что делать с этим дальше?
...
Рейтинг: 0 / 0
shmtotal на 11.50FC6 на win2003х64
    #36551525
vasilis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А на сколько времени в среднем хватает выделенного сегмента SHMVIRTSIZE=3670016 после заполнения которого сервер начинает добавлять по SHMADD=131072 ?
...
Рейтинг: 0 / 0
shmtotal на 11.50FC6 на win2003х64
    #36551810
falcon111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vasilisА на сколько времени в среднем хватает выделенного сегмента SHMVIRTSIZE=3670016 после заполнения которого сервер начинает добавлять по SHMADD=131072 ?

Было - порядка 3-4 дней. через пару недель в системе просто заканчивалась виртуальная память.
Сейчас после перетруски основных утечек, пока третий день, новых сегментов пока нет.
...
Рейтинг: 0 / 0
shmtotal на 11.50FC6 на win2003х64
    #36556421
falcon111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В данном конкретном случае, утечка остановилась после изменения последнего варианта процедуры на вот такой (добавил индекс) :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
create procedure T_Get_Ch (
  ) returning integer as CRows;

  define CommitMe      integer;
  define rc            integer;

  define t_LCDt        like LOData.LCDt;

  set lock mode to wait  3 ;

  begin
    on exception in (- 535 ) -- Already in transaction
      let CommitMe= 0 ;
    end exception with resume;
    let CommitMe= 1 ;
    begin work;
  end;
  begin
    define vSQL, vISAM     integer;
    define vMES            varchar( 250 );

    on exception set vSQL, vISAM, vMES
      if CommitMe!= 0  then rollback work; end if;
      raise exception vSQL, vISAM, vMES;
    end exception;

    begin
      on exception in (- 206 ) -- table not found
        create temp table t_t_ch (
          TId      integer,
          LId      integer,
          ModuleId integer,
          Port     integer,
          IP       numeric( 10 , 0 ),
          NCDt     integer,
          HostName varchar( 128 ),
          TimeOut  integer,
          CfgVer   smallint
        ) with no log;
        create index I_tmp_t_ch    on t_t_ch(moduleid,Lid);
        update statistics low for table t_t_ch;
      end exception with resume;

      delete from t_t_ch;
    end;

    let t_LCDt=dbinfo('utc_current');

    insert into t_t_ch(TID, LId, ModuleId, Port, IP, NCDt, HostName, TimeOut, CfgVer)
    select o.TID, o.LId, o.ModuleId, nvl(o.Port, 0 ), o.IP, t_LCDt, o.Host, o.LimTimeOut, o.CfgVer
    from LOData o
    where o.ModType='T' and o.Status in ( 0 , 1 ) and o.CMode='Y' and o.CStatus='G';

    let rc=DBINFO('sqlca.sqlerrd2');

    if rc> 0  then
      update LOData set (CStatus, CNum, CSent)=('W',  1 , t_LCDt)
      where LId in (select LId from t_t_ch);
    end if;

    if CommitMe!= 0  then commit work; end if;
  end;

  return rc;
end procedure;
Выходит, утечка была при сортировке при выборке результата клиентским приложением (оно выбирает select from t_t_ch order by moduleid,lid) или в чем-то связанным с этим. Мдя, неприятно.

Один источник утечек устранил, еще ...дцать раз и, может, все будет нормально, но, как говорится, осадок остался :(
...
Рейтинг: 0 / 0
shmtotal на 11.50FC6 на win2003х64
    #36556546
vasilis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
falcon111Выходит, утечка была при сортировке при выборке результата клиентским приложением (оно выбирает select from t_t_ch order by moduleid,lid) или в чем-то связанным с этим.
Интересно, а параметр DS_NONPDQ_QUERY_MEM у вас в какое значение установлен ?
...
Рейтинг: 0 / 0
shmtotal на 11.50FC6 на win2003х64
    #36556802
falcon111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vasilisИнтересно, а параметр DS_NONPDQ_QUERY_MEM у вас в какое значение установлен ?
128
...
Рейтинг: 0 / 0
shmtotal на 11.50FC6 на win2003х64
    #36557322
vasilis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
falcon111vasilisИнтересно, а параметр DS_NONPDQ_QUERY_MEM у вас в какое значение установлен ?
128
Странно, почему не использовать возможность эффективной сортировки в памяти ?
Посмотрите описание параметра
Рекомендую установить в значение от 5000 до 10000 (только предварительно установите правильно DS_TOTAL_MEMORY).
Может поможет и устранить утечки памяти :)
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Informix [игнор отключен] [закрыт для гостей] / shmtotal на 11.50FC6 на win2003х64
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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