RAC. DFS lock handle. Sequence. Как побеждать?

Я.
Дата: 27.02.2007 11:04:18
Привет всем!
Есть ситуация: две ноды в RAC (10.2.0.2) на HP-UX 11.23
работает куча джобов (около 100) на ОДНОМ из инстансов (второй просто бездельничает рядом). Большинство времени джобы ждут на DFS lock handle.
Кусок трейса говорит что:
=====================
PARSING IN CURSOR #89 len=69 dep=2 uid=119 oct=6 lid=119 tim=237078064849 hv=1574607469 ad='e344f4d8'
UPDATE ROAM_CALLS_012007 SET BILL_BILL_ID = :BILL WHERE ROWID = :ROWW
END OF STMT
PARSE #89:c=0,e=46,p=0,cr=0,cu=0,mis=0,r=0,dep=2,og=1,tim=237078064846
FETCH #88:c=0,e=22,p=0,cr=3,cu=0,mis=0,r=0,dep=2,og=1,tim=237078064971
STAT #88 id=1 cnt=0 pid=0 pos=1 obj=166193 op='TABLE ACCESS BY INDEX ROWID ROAM_CALLS_012007 (cr=3 pr=0 pw=0 time=39 us)'
STAT #88 id=2 cnt=0 pid=1 pos=1 obj=166195 op='INDEX RANGE SCAN ROAM_CALLS_012007_UK (cr=3 pr=0 pw=0 time=34 us)'
EXEC #86:c=0,e=11,p=0,cr=0,cu=0,mis=0,r=0,dep=2,og=1,tim=237078065829
WAIT #86: nam='DFS lock handle' ela= 489013 type|mode=1398145029 id1=28489 id2=0 obj#=-1 tim=237078555008
*** 2007-02-02 08:39:36.164
WAIT #86: nam='DFS lock handle' ela= 488246 type|mode=1398145029 id1=28489 id2=0 obj#=-1 tim=237079043291
WAIT #86: nam='DFS lock handle' ela= 488151 type|mode=1398145029 id1=28489 id2=0 obj#=-1 tim=237079531562
WAIT #86: nam='DFS lock handle' ela= 488257 type|mode=1398145029 id1=28489 id2=0 obj#=-1 tim=237080019851
WAIT #86: nam='DFS lock handle' ela= 488237 type|mode=1398145029 id1=28489 id2=0 obj#=-1 tim=237080508127
WAIT #86: nam='DFS lock handle' ela= 16968 type|mode=1398145029 id1=28489 id2=0 obj#=-1 tim=237080525130
WAIT #86: nam='latch: ges resource hash list' ela= 32 address=-4611685896082556400 number=65 tries=1 obj#=-1 tim=237080525256
FETCH #86:c=0,e=2459476,p=0,cr=0,cu=0,mis=0,r=1,dep=2,og=1,tim=237080525326
EXEC #86:c=0,e=11,p=0,cr=0,cu=0,mis=0,r=0,dep=2,og=1,tim=237080525498
WAIT #86: nam='latch: ges resource hash list' ela= 46 address=-4611685896082556400 number=65 tries=1 obj#=-1 tim=237080525641
WAIT #86: nam='DFS lock handle' ela= 490186 type|mode=1398145029 id1=28489 id2=0 obj#=-1 tim=237081015959
WAIT #86: nam='DFS lock handle' ela= 488206 type|mode=1398145029 id1=28489 id2=0 obj#=-1 tim=237081504219
Помотрел доку и запустил такой запрос:
select chr(bitand(p1,-16777216)/16777215)||
       chr(bitand(p1, 16711680)/65535) "Lock",
       bitand(p1, 65536) "Mode",
       p2text, p2raw, p2,
       p3text, p3raw, p3
from v$session_wait
where event = 'DFS lock handle';
На что собственно получил мног таких записей:
SV	0	id1	0000000000006F49	28489	id2	00	0
SV	0	id1	0000000000006F49	28489	id2	00	0
SV	0	id1	0000000000006F49	28489	id2	00	0
SV	0	id1	0000000000006F49	28489	id2	00	0
Поискал объект 28489. Оказался SEQUENCE, который объявлен как ORDERED, CACHE 1000. Т.к. мне было сказано, что ORDERED обязателен, то начал изучать единственный доступный моему понимаю парамет cache 1000.
При выборке из dba_sequences, вижу что last_number увеличивается на 1000 приблизительно раз в 15-20 секунд.
На этом идеи как побороть это ожидание закончились.
Подскажите плз. что еще можно посмотреть попробовать...

Кстати, для эксперимента попробовал потушить второй инстанс (тоесть работал только один), никакого результата не дало.
_AndreyP
Дата: 06.03.2007 11:02:09
RAC говоришь ?
а что случится то если убрать ORDERED ?
_AndreyP
Дата: 06.03.2007 12:11:53
поправлю вопрос, а то можно не верно истолковать :)

насколько важно для процесса, чтобы параметр ORDER = Yes ?

Как видно из поста происходит UPDATE.
А значение сиквенции получается в курсоре на котором "DFS lock handle" наверное #86.

а если работают около 100 джобов, как можно гарантировать такой же последовательный UPDATE ?
Alex Roudnev
Дата: 07.03.2007 01:15:21
_AndreyP
поправлю вопрос, а то можно не верно истолковать :)

насколько важно для процесса, чтобы параметр ORDER = Yes ?

Как видно из поста происходит UPDATE.
А значение сиквенции получается в курсоре на котором "DFS lock handle" наверное #86.

а если работают около 100 джобов, как можно гарантировать такой же последовательный UPDATE ?


Ваши девелоперы талантливо выбрали настоящего рако убийцу. Про проблемы с такими сиквенсами я, кажется, читал в рако-книгах.

Действительно, если бы этот ordered убрать, все бы упростилось. А зачем, простите, может оный ordered быть вообще нужен? Ведь все равно закрытие транзакций в порядке нарастания оного счетчика не обеспечивается, и скорее всего, нужда в ordered это миф.

(Я так сразу слабо представляю, зачем оно может быть нужно. Особенно если это кластер и куча слабо связанных джобов крутится. Я еще понимаю - система каких то апдейтов в реальном времени /да и то где то я видел теорию, что в кластере в такой системе порядок сиквенсов тоже не обеспечивается по жизни/).
Alex Roudnev
Дата: 07.03.2007 01:23:03
DВА
http://www.pythian.com/blogs/383/sequences-in-oracle-10g-rac


Очень неплохая статья, но там в конце есть обсуждение, применима ли она к 10g кластеру.
Я.
Дата: 07.03.2007 11:13:02
Спасибо за коментарии. Как я понял на выбор есть только 2 варианта: либо ordered, либо быстро. Жалко, что нет варианта прыгнуть выше головы... :-)
OracloidAG
Дата: 08.03.2007 18:43:25
Alex Roudnev
DВА
http://www.pythian.com/blogs/383/sequences-in-oracle-10g-rac


Очень неплохая статья, но там в конце есть обсуждение, применима ли она к 10g кластеру.


Кристо наоборот написал для 10г. А потом упомянули Метаклик доко 1031850.6 - вот оно-то походу очень старо - еще до 9ки может даже.
Ааз
Дата: 08.03.2007 20:20:42
OracloidAG
...
Alex, приветствую на www.sql.ru! Я смотрю, народ с oracle-l стал заглядывать "домой" :-).

Всего
Ааз
Дата: 08.03.2007 20:38:34
Я.
Спасибо за коментарии. Как я понял на выбор есть только 2 варианта: либо ordered, либо быстро. Жалко, что нет варианта прыгнуть выше головы... :-)
Почему же нет? Разве в указанной ссылке не объясняется, в каких именно случаях захватывается 'DFS lock handle'?

Если все job'ы на одном узле, то синхронизация между экземплярами отсутствует. Верно? Остается момент, когда кешированные (1000 в вашем случае) номера заканчиваются. Поставьте 10^6 - три порядка по частоте этих событий должны отыграть :-).

Понятно, что кешированные номера можно потерять безвозвратно. Не хочу повторяться. Было в частности в этом форуме.

Кстати, я бы разобрался, а действительно ли настолько нужен ORDERED? Очень сомнительно... Давайте разберем:

100 job'ов, судя по всему идентичных и слабо связанных, на кой-то ляд желают сохранить в БД информацию о том, в каком порядке они (эти job'ы) выполняли SEQUENCE.NEXTVAL. Заметьте, ни к началу транзакции, ни к commit'у эти номера, полученные из sequence, отношения не имеют. Точнее, имеют, но мм. весьма таки приблизительное. Т.е. не точное. Разве что в приложении точка кода, в которой выполняется NEXTVAL, действительно ключевая с точки зрения приложения...

Короче - мутно это как-то. Ежели не поможет увеличение CACHE'а, требуйте объяснений про ORDERED у разработчиков.

Всего