Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Informix [игнор отключен] [закрыт для гостей] / Как найти сессию, что залочила табличку / 15 сообщений из 15, страница 1 из 1
24.10.2006, 18:21
    #34078164
Rumata Estorskiy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найти сессию, что залочила табличку
IBM Informix Dynamic Server Version 9.40.TC7 Windows 2000 Server

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

database sysmaster;
select distinct sid, username from sysrstcb a, systabnames b, syslcktab c
where b.tabname = 'table_name'
and b.dbsname = 'bd_name'
and b.partnum = c.partnum
and c.owner = a.txp;


Этот запросик выдавал id-сессии. Я её (сессию) отстреливал
onmode -z id-сессии
и всё было чётко.
Но недавно вылезла такая вот байда. Этот запрос стал дико жрать память. Да так, что система стала валиться.

Через минуту-две после выполнения запроса начинается стремительное наращивание виртуальной памяти

14:57:51 Dynamically allocated new virtual shared memory segment (size 32768KB)
14:57:59 Dynamically allocated new virtual shared memory segment (size 32768KB)
14:58:06 Dynamically allocated new virtual shared memory segment (size 32768KB)


и потом

15:00:32 shmat: [ENOMEM][12]: out of available data space, check
system memory parameters (e.g. MAXMEM).
15:00:32 out of virtual shared memory
15:00:32 shmat: [ENOMEM][12]: out of available data space, check
system memory parameters (e.g. MAXMEM).
15:00:32 out of virtual shared memory


и сервак валится.

15:01:22 PANIC: Attempting to bring system down

В onconfig:

LOCKS 100000 # Maximum number of locks
BUFFERS 200000 # Maximum number of shared buffers
NUMAIOVPS # Number of IO vps
PHYSBUFF 32 # Physical log buffer size (Kbytes)
LOGBUFF 32 # Logical log buffer size (Kbytes)
CLEANERS 4 # Number of buffer cleaner processes
SHMBASE 0xC000000L # Shared memory base address
SHMVIRTSIZE 500000 # initial virtual shared memory segment size
SHMADD 32768 # Size of new shared memory segments (Kbytes)
EXTSHMADD 32768 # Size of new extension shared memory segments (Kbytes)
SHMTOTAL 0 # Total shared memory (Kbytes). 0=>unlimited
CKPTINTVL 300 # Check point interval (in sec)
LRUS 50 # Number of LRU queues
LRU_MAX_DIRTY 60 # LRU percent dirty begin cleaning limit
LRU_MIN_DIRTY 50 # LRU percent dirty end cleaning limit
TXTIMEOUT 300 # Transaction timeout (in sec)
STACKSIZE 64 # Stack size (Kbytes)


Пробовал SHMTOTAL выставлять например 1859008 всё равно не помогает. Память доходит до этого значения. Какое-то время система в раздумьях и всё равно валится.
Как я уже понял с памятью возиться учень муторно и играться с параметрами всё равно ничё не даёт. Память эт дело тёмное.

Посоветуйте, пожалуйста, как мне найти сессию, что залочила табличку каким-нидь другим способом?
...
Рейтинг: 0 / 0
24.10.2006, 20:16
    #34078420
vasilis
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найти сессию, что залочила табличку
Rumata EstorskiyПосоветуйте, пожалуйста, как мне найти сессию, что залочила табличку каким-нидь другим способом?
Таких способов много (не считая стандартного, через onstat -k)
Например, такой:
---------------------------------------------
-- To list the all user's current locks, who owns them,
-- (db locks included)
-- IDS 7.3+ 9.2+
--
-- V.Shulzhenko DBA_Tools
---------------------------------------------
set isolation to dirty read;
SELECT username[1,8]
,sid
,dbsname[1,18]
,tabname[1,18]
,type
,substr(round(count(*),0),1,6) locks
FROM syslocks l,syssessions s
WHERE s.sid = l.owner
and s.sid !=dbinfo('sessionid') --исключить свой запрос
GROUP BY 1,2,3,4,5
ORDER BY 1,2,3,4

Можно поискать даже в этом форуме, я ранее приводил такие запросы...
...
Рейтинг: 0 / 0
24.10.2006, 20:31
    #34078450
vasilis
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найти сессию, что залочила табличку
Пожалуй, не совсем верно ответил на вопрос в предыдущем посте.
Я предложил запрос, который покажет ВСЕ текущие блокировки и при их большом количестве будет сложновато разобраться.
Вот запрос по блокировкам для одной таблицы:
---------------------------------------------
-- To list the TABLE's current locks, who owns them,
-- and if any session is waiting for a lock
-- (Who has locks on the TABLE in the current db ?)
--
-- Shulzhenko V. DBA_Tools
---------------------------------------------
SELECT
owner sid_owner
,username[1,8]
,tty[1,12]
,hex(rowidlk) rowidlock
,keynum
,type
,waiter
-- ,tabname[1,18]
-- ,dbsname[1,18]
FROM sysmaster:syslocks l,sysmaster:syssessions s
WHERE s.sid = l.owner
and dbsname='db-name'
and tabname matches
'Укажи имя таблицы (table_name) или *'
...
Рейтинг: 0 / 0
25.10.2006, 08:56
    #34078882
Журавлев Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найти сессию, что залочила табличку
похоже на баг при использовании systabnames, у вас табличек в инстансе не стало больше в несколько раз, недавно? Может копию бд сделали на том же сервере?
...
Рейтинг: 0 / 0
25.10.2006, 09:30
    #34078981
Тан
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найти сессию, что залочила табличку
Rumata EstorskiyIBM Informix Dynamic Server Version 9.40.TC7 Windows 2000 Server

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

database sysmaster;
select distinct sid, username from sysrstcb a, systabnames b, syslcktab c
where b.tabname = 'table_name'
and b.dbsname = 'bd_name'
and b.partnum = c.partnum
and c.owner = a.txp;



чтобы не использовать systabnames, я таким пользуюсь запросом

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
database sysmaster;
select sid, username from sysrstcb a, syslcktab c
where c.owner = a.txp and 
c.partnum in (select hex(partnum) from 'bd_name':systables
              where tabname matches 'table_name' and partnum <> 0  
              union all
              select hex(partn) from 'bd_name':sysfragments f, 'bd_name':systables t 
              where tabname matches 'table_name' and t.tabid=f.tabid and fragtype = 'T')
;
...
Рейтинг: 0 / 0
25.10.2006, 10:40
    #34079225
Rumata Estorskiy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найти сессию, что залочила табличку
vasilisВот запрос по блокировкам для одной таблицы:
.........
'Укажи имя таблицы (table_name) или *'

Попробовал. К сожалению на этом запросе память поплыла так же как и на моём. :(
...
Рейтинг: 0 / 0
25.10.2006, 10:47
    #34079255
Rumata Estorskiy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найти сессию, что залочила табличку
Танчтобы не использовать systabnames, я таким пользуюсь запросом

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
database sysmaster;
select sid, username from sysrstcb a, syslcktab c
where c.owner = a.txp and 
c.partnum in (select hex(partnum) from 'bd_name':systables
              where tabname matches 'table_name' and partnum <> 0  
              union all
              select hex(partn) from 'bd_name':sysfragments f, 'bd_name':systables t 
              where tabname matches 'table_name' and t.tabid=f.tabid and fragtype = 'T')
;


Хм... А Ваш запрос по-моему отработал "на Ура". Я конечно его ещё "в деле" полностью не отработал. Но эксперименты показывают, что во-первых он отрабатывает мгновенно (в отличие от долгого моего), во-вторых кажется выдаёт-таки правильный результат о блокировках. Я сделал такой эксперимент. Создал табличку. Стартовал транзакцию. Добавил пару записей и пока не сделал commit запустил Ваш запрос. Он мне честно выдал мою сессию. Я подожду когда он понадобится по настоящему, но мне кажется, что это то, что мне нужно. Спасибо!
...
Рейтинг: 0 / 0
25.10.2006, 10:51
    #34079274
Rumata Estorskiy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найти сессию, что залочила табличку
Журавлев Дениспохоже на баг при использовании systabnames, у вас табличек в инстансе не стало больше в несколько раз, недавно? Может копию бд сделали на том же сервере?

Так чтобы резко больше, то точно нет. Я за этим слежу. Просто у меня и раньше память плыла, просто я точно не знал причины. А сейчас абсолютно точно идентифицировал, что из-за этого запроса. Баз конечно у меня много. Больше 100 баз и в каждой бывает по несколько сотен таблиц. Это может влиять на фокусы с памятью, да?
...
Рейтинг: 0 / 0
25.10.2006, 11:03
    #34079325
Журавлев Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найти сессию, что залочила табличку
Rumata EstorskiyТак чтобы резко больше, то точно нет. Я за этим слежу. Просто у меня и раньше память плыла, просто я точно не знал причины. А сейчас абсолютно точно идентифицировал, что из-за этого запроса. Баз конечно у меня много. Больше 100 баз и в каждой бывает по несколько сотен таблиц. Это может влиять на фокусы с памятью, да?Баг: при обращении к systabnames кушается память, чем больше таблиц тем больше кушает, назад не отдает. Правят года четыре уже. У кого 1000 таблиц не замечает, а у кого 10000 те :(
...
Рейтинг: 0 / 0
25.10.2006, 11:14
    #34079372
Igor Zaiets
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найти сессию, что залочила табличку
Вопрос такого плана - на 9.40хС6 есть бага связанная с блокировками.
После динамического выделения новой порции блокировок - отследить блокировки не получается.
onstat -u показывает что ждем освобождения блокировки.
onstat -k не показывает, что данная нить ждет блокировку,
Запросы по syslckta не помогают.

Помимо перехода на более поздний релиз, пересмотра кода и увеличения количества блокировок при старте , как еще боретесь с выявлением сессий, заблокировавших ресурс?

Я "выявляю" сессии заблокировавшие ресурс достаточно геморройно - выявляю таблицу, смотрю кто ее держит и потихоньку в неком избирательном порядке отстреливаю сессии.
Может есть более красивый способ и не все так плохо?
...
Рейтинг: 0 / 0
25.10.2006, 12:22
    #34079695
Тан
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найти сессию, что залочила табличку
Журавлев Денис Rumata EstorskiyТак чтобы резко больше, то точно нет. Я за этим слежу. Просто у меня и раньше память плыла, просто я точно не знал причины. А сейчас абсолютно точно идентифицировал, что из-за этого запроса. Баз конечно у меня много. Больше 100 баз и в каждой бывает по несколько сотен таблиц. Это может влиять на фокусы с памятью, да?Баг: при обращении к systabnames кушается память, чем больше таблиц тем больше кушает, назад не отдает. Правят года четыре уже. У кого 1000 таблиц не замечает, а у кого 10000 те :(
это не то чтобы совсем баг, это такое поведение у Informix.
При обращении к таблице информация о ней сохраняется в памяти, что-то вроде кэша. Информация эта не удаляется никогда. И вот если вдруг вы решите обратиться ко всем таблицам на сервере, то при большом количестве таблиц память потечет.
Сканирование systabnames порождает обращения ко всем таблицам на сервере.
Update statistics порождает обращения ко всем таблицам в базе.
Чем больше таблиц "открыто", тем больше памяти утекло...
...
Рейтинг: 0 / 0
25.10.2006, 12:35
    #34079754
Журавлев Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найти сессию, что залочила табличку
Танэто не то чтобы совсем баг, это такое поведение у Informix.
Согласен не баг. Но исправить пытаются , у тебя ведь и case в саппорте имеется?
...
Рейтинг: 0 / 0
25.10.2006, 13:16
    #34079950
Тан
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найти сессию, что залочила табличку
Журавлев Денис Танэто не то чтобы совсем баг, это такое поведение у Informix.
Согласен не баг. Но исправить пытаются , у тебя ведь и case в саппорте имеется?
Был. Закрыт.

Bug: 115066 SYSTEM WITH LARGE NUMBER OF TABLES CAN CONSUME LARGE AMOUNTS OF MEMORY IN THE RSAM POOL

We, our development team, are actually working on seeing if we can change how the 9.40 and 10 version of the IDS is handling some things in the RSAM pool.
...
Рейтинг: 0 / 0
25.10.2006, 21:44
    #34081807
Выбегалло
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найти сессию, что залочила табличку
Rumata Estorskiy
Посоветуйте, пожалуйста, как мне найти сессию, что залочила табличку каким-нидь другим способом?

1. Узнать partnum вашей таблицы
можно используя oncheck -pt <database>:<table>
C:\Informix94>oncheck -pt stores_demo:call_type

TBLspace Report for stores_demo:smitin.call_type

Physical Address 1:240
Creation date 07/03/2006 16:09:05
TBLspace Flags 801 Page Locking
TBLspace use 4 bit bit-maps
Maximum row size 31
Number of special columns 0
Number of keys 0
Number of extents 1
Current serial value 1
First extent size 8
Next extent size 8
Number of pages allocated 8
Number of pages used 2
Number of data pages 1
Number of rows 5
Partition partnum 1048803
Partition lockid 1048803

1048803 = 0x1000E3

2. найти, кто ее лочит : делаете onstat -k , ищете tblsnum 1000e3 где rowid = 0 (это значит, что залочена вся таблица)

IBM Informix Dynamic Server Version 9.40.TC2E1 -- On-Line -- Up 00:01:12 -- 25728 Kbytes

Locks
address wtlist owner lklist type tblsnum rowid key#/bsiz
c0967b0 0 caf9e54 0 HDR+S 100002 205 0
c096804 0 caf9e54 c0967b0 HDR+X 1000e3 0 0


3. По адресу сессии находите ее информацию :
делаете onstat -u

Userthreads
address flags sessid user tty wait tout locks nreads nwrites
caf8018 ---P--D 1 informix - 0 0 0 26 7
caf8624 ---P--F 0 informix - 0 0 0 0 0
caf8c30 ---P--- 6 informix - 0 0 0 0 0
caf923c ---P--B 7 informix - 0 0 0 0 0
caf9e54 Y--P--- 13 user PHX00012 d1cdf30 0 2 61 0
cafa460 ---P--D 10 informix - 0 0 0 0 0
...
Рейтинг: 0 / 0
25.10.2006, 21:47
    #34081815
Выбегалло
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как найти сессию, что залочила табличку
Преимуществом такого подхода является скорость исполнения и отсутствие багов (onstat берет данные прямо из определенных областей памяти сервера, не нагружая сам сервер). недостатком - необходимость прямого доступа к боксу, на котором сервер крутится (админы как правило такой доступ имеют).

В таком вот аксепте
...
Рейтинг: 0 / 0
Форумы / Informix [игнор отключен] [закрыт для гостей] / Как найти сессию, что залочила табличку / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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