powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / ExclusiveLock
40 сообщений из 40, показаны все 2 страниц
ExclusiveLock
    #37585324
xtron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть простейшая таблица:

# \d request
Table "public.request"
Column | Type | Modifiers
-----------------+-----------------------------+-----------------------------------------------------------
id | bigint | not null default nextval('public.request_id_seq'::regclass)
other_id | bigint | not null default 1
enabled | boolean | not null default true
Indexes:
"request__idx001" btree (other_id, id DESC) WHERE enabled = true

Индекс только один, primary key удален, оставлен только сиквенс для формирования следующего id.

В таблице уже порядка 100 миллионов записей, в основном идут массовые INSERT, изредка SELECT, UPDATE/DELETE/транзакций нету, при этом
при INSERT часто возникают ExclusiveLock, причем переиодичски по 2 ExclusiveLock на один INSERT...

Подскажите плиз что это может быть и как лечить?
...
Рейтинг: 0 / 0
ExclusiveLock
    #37585385
Фотография Misha Tyurin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtron,

а в чем проблема то?

--

http://www.postgresql.org/docs/9.1/static/explicit-locking.html

вот такие блокировки бывают да.

--

у вас ROW EXCLUSIVE при инсерте - один к таблице относиться, другой к индексу.

как вы эти блокировки видите?
...
Рейтинг: 0 / 0
ExclusiveLock
    #37585411
xtron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
именно ExclusiveLock а не RowExclusiveLock
...
Рейтинг: 0 / 0
ExclusiveLock
    #37585430
xtron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
именно ExclusiveLock в INSERT на такую простую таблицу! что это? на всякий случай версия сервера:

Код: plsql
1.
2.
3.
4.
# select version();
                                                version                                                
-------------------------------------------------------------------------------------------------------
 PostgreSQL 9.1.1 on x86_64-unknown-linux-gnu, compiled by gcc-4.6.real (Debian 4.6.2-4) 4.6.2, 64-bit
...
Рейтинг: 0 / 0
ExclusiveLock
    #37585437
Фотография Ёш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtron, почему Вы решили что ExclusiveLock на таблицу? Возможно Вы путаете ExclusiveLock на таблицу с ExclusiveLock на номер транзакции?
...
Рейтинг: 0 / 0
ExclusiveLock
    #37585447
xtron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ёш,

transactionid в pg_locks пуст
...
Рейтинг: 0 / 0
ExclusiveLock
    #37585450
xtron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ёш,

явных транзакций через BEGIN/COMMIT/ROLLBACK нету, только отдельные команды INSERT (массовые) и SELECT (относительно редкие)
...
Рейтинг: 0 / 0
ExclusiveLock
    #37585453
Фотография Misha Tyurin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtron,

покажите. вам никто не верит)
...
Рейтинг: 0 / 0
ExclusiveLock
    #37585456
Фотография Ёш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtron, покажите. Он и у virtualxid тоже пуст.
...
Рейтинг: 0 / 0
ExclusiveLock
    #37585462
Фотография Ёш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtron,

Код: sql
1.
2.
3.
4.
5.
SELECT l.locktype, pg_class.relname AS table_name, l.transactionid, l.virtualtransaction, l.virtualxid, l.mode, l.granted, s.procpid AS process_id, age(now(), s.query_start)
   FROM pg_stat_activity s, pg_locks l
   LEFT JOIN pg_class ON l.relation = pg_class.oid
  WHERE l.pid = s.procpid and l.pid <> pg_backend_pid()                                         
  ORDER BY s.query_start;
...
Рейтинг: 0 / 0
ExclusiveLock
    #37585479
xtron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ёш,


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SELECT
  s.usename,
  l.mode,
  l.transactionid,
  d.datname,
  c.relname,
  l.granted,
  s.waiting,
  s.current_query
FROM
  pg_locks AS l
LEFT JOIN pg_stat_activity AS s ON l.pid = s.procpid
LEFT JOIN pg_database AS d ON l.database = d.oid
LEFT JOIN pg_class AS c ON l.relation = c.oid WHERE l.mode = 'ExclusiveLock';




Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
usename |     mode      | transactionid | datname | relname | granted | waiting |         ?column?
--------+---------------+---------------+---------+---------+---------+---------+--------------------------
   user | ExclusiveLock |               | fff     |         | t       | f       | INSERT INTO public.request
   user | ExclusiveLock |               | fff     |         | t       | f       | INSERT INTO public.request
   user | ExclusiveLock |               | fff     |         | t       | f       | INSERT INTO public.request
   user | ExclusiveLock |               | fff     |         | t       | f       | INSERT INTO public.request
   user | ExclusiveLock |    1109147258 |         |         | t       | f       | INSERT INTO public.request
   user | ExclusiveLock |               |         |         | t       | f       | INSERT INTO public.request
   user | ExclusiveLock |    1109147253 |         |         | t       | f       | INSERT INTO public.request
   user | ExclusiveLock |               |         |         | t       | f       | INSERT INTO public.request
   user | ExclusiveLock |               | fff     |         | t       | f       | INSERT INTO public.request
(9 rows)
...
Рейтинг: 0 / 0
ExclusiveLock
    #37585489
Фотография Misha Tyurin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а у меня вот такая есть

Код: sql
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.
--
select
  
  s.procpid                          as pid,
  
  nullif(s.waiting, false)::integer  as wx,                  -- "1" - ждет блокировки
  ( now() - s.xact_start )           as tx,
    
  btrim(s.current_query, ' \t\n')    as q,

  --- блокировки // l.relation::regclass::text - раскрывает внутри текущей базы только

  count( 1 ) as total_locks,
    
  count( nullif( (l.mode = 'RowExclusiveLock'), false ) ) as row_exclusive,
  array_to_string(array_agg( distinct ( case when ( l.mode = 'RowExclusiveLock' ) then coalesce(l.relation::regclass::text, l.relation::text) else null end ) ), ', ')
  as row_exclusive_rel,

  count( nullif( (l.mode = 'ShareUpdateExclusiveLock'), false ) ) as share_update_exclusive,
  array_to_string(array_agg( distinct ( case when ( l.mode = 'ShareUpdateExclusiveLock' ) then coalesce(l.relation::regclass::text, l.relation::text) else null end ) ), ', ')
  as share_update_exclusive_rel,

  count( nullif( (l.mode = 'ExclusiveLock'), false ) ) as exclusive,
  array_to_string(array_agg( distinct ( case when ( l.mode = 'ExclusiveLock' ) then coalesce(l.relation::regclass::text, l.relation::text) else null end ) ), ', ')
  as exclusive_rel,

  count( nullif( (l.mode = 'AccessShareLock'), false ) ) as access_share,
  array_to_string(array_agg( distinct ( case when ( l.mode = 'AccessShareLock' ) then coalesce(l.relation::regclass::text, l.relation::text) else null end ) ), ', ')
  as access_share_rel

/*
http://www.postgresql.org/docs/9.1/static/explicit-locking.html#LOCKING-TABLES

"ExclusiveLock"
"RowShareLock"
"RowExclusiveLock"
"ShareUpdateExclusiveLock"
"AccessShareLock"

...

*/
  
from

  pg_stat_activity s
    left join pg_locks l on ( (l.locktype = 'relation') and (l.pid = s.procpid) )

group by

  s.procpid, s.waiting, s.xact_start, s.current_query, s.backend_start
  
order by

  ( s.current_query = '<IDLE>' ), ( s.current_query like 'autovacuum: %' ), tx desc
...
Рейтинг: 0 / 0
ExclusiveLock
    #37585495
xtron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Misha Tyurin,

Код: plsql
1.
2.
3.
4.
5.
SELECT l.locktype, pg_class.relname AS table_name, l.transactionid, l.virtualtransaction, l.virtualxid, l.mode, l.granted, s.procpid AS process_id, age(now(), s.query_start)
   FROM pg_stat_activity s, pg_locks l
   LEFT JOIN pg_class ON l.relation = pg_class.oid
  WHERE l.pid = s.procpid and l.pid <> pg_backend_pid() AND l.mode = 'ExclusiveLock' AND current_query iLike 'INSERT INTO main.request%'                     
  ORDER BY s.query_start;



Код: plsql
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.
   locktype    | table_name | transactionid | virtualtransaction | virtualxid |     mode      | granted | process_id |       age
---------------+------------+---------------+--------------------+------------+---------------+---------+------------+-----------------
 virtualxid    |            |               | 62/90031           | 62/90031   | ExclusiveLock | t       |      23809 | 00:00:00.300563
 transactionid |            |    1109469710 | 62/90031           |            | ExclusiveLock | t       |      23809 | 00:00:00.300563
 advisory      |            |               | 62/90031           |            | ExclusiveLock | t       |      23809 | 00:00:00.300563
 transactionid |            |    1109469727 | 37/141489          |            | ExclusiveLock | t       |      23788 | 00:00:00.28569
 advisory      |            |               | 37/141489          |            | ExclusiveLock | t       |      23788 | 00:00:00.28569
 virtualxid    |            |               | 37/141489          | 37/141489  | ExclusiveLock | t       |      23788 | 00:00:00.28569
 advisory      |            |               | 37/141489          |            | ExclusiveLock | t       |      23788 | 00:00:00.28569
 virtualxid    |            |               | 27/172595          | 27/172595  | ExclusiveLock | t       |      23783 | 00:00:00.208176
 advisory      |            |               | 27/172595          |            | ExclusiveLock | t       |      23783 | 00:00:00.208176
 transactionid |            |    1109469800 | 27/172595          |            | ExclusiveLock | t       |      23783 | 00:00:00.208176
 advisory      |            |               | 27/172595          |            | ExclusiveLock | t       |      23783 | 00:00:00.208176
 advisory      |            |               | 72/86707           |            | ExclusiveLock | t       |      23817 | 00:00:00.161147
 transactionid |            |    1109469852 | 72/86707           |            | ExclusiveLock | t       |      23817 | 00:00:00.161147
 virtualxid    |            |               | 72/86707           | 72/86707   | ExclusiveLock | t       |      23817 | 00:00:00.161147
 virtualxid    |            |               | 51/117302          | 51/117302  | ExclusiveLock | t       |      23800 | 00:00:00.160751
 advisory      |            |               | 51/117302          |            | ExclusiveLock | t       |      23800 | 00:00:00.160751
 transactionid |            |    1109469855 | 51/117302          |            | ExclusiveLock | t       |      23800 | 00:00:00.160751
 transactionid |            |    1109469932 | 35/154657          |            | ExclusiveLock | t       |      23786 | 00:00:00.069691
 advisory      |            |               | 35/154657          |            | ExclusiveLock | t       |      23786 | 00:00:00.069691
 virtualxid    |            |               | 35/154657          | 35/154657  | ExclusiveLock | t       |      23786 | 00:00:00.069691
 advisory      |            |               | 35/154657          |            | ExclusiveLock | t       |      23786 | 00:00:00.069691
 advisory      |            |               | 35/154657          |            | ExclusiveLock | t       |      23786 | 00:00:00.069691
 advisory      |            |               | 92/54020           |            | ExclusiveLock | t       |      23939 | 00:00:00.061729
 advisory      |            |               | 92/54020           |            | ExclusiveLock | t       |      23939 | 00:00:00.061729
 transactionid |            |    1109469934 | 92/54020           |            | ExclusiveLock | t       |      23939 | 00:00:00.061729
 advisory      |            |               | 92/54020           |            | ExclusiveLock | t       |      23939 | 00:00:00.061729
 virtualxid    |            |               | 92/54020           | 92/54020   | ExclusiveLock | t       |      23939 | 00:00:00.061729
 advisory      |            |               | 92/54020           |            | ExclusiveLock | t       |      23939 | 00:00:00.061729
(28 rows)
...
Рейтинг: 0 / 0
ExclusiveLock
    #37585503
Фотография Misha Tyurin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtron,

у вас запрос не верный)
...
Рейтинг: 0 / 0
ExclusiveLock
    #37585508
Фотография Misha Tyurin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtron,

у вас там как раз и видно что локи на "транзакцию" и еще адвизори откуда-то
...
Рейтинг: 0 / 0
ExclusiveLock
    #37585511
Фотография Misha Tyurin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если по бекенду каждому смотреть.

--

а что вас смущает то?

в чем причина. почему вы к блокировкам обратились?
...
Рейтинг: 0 / 0
ExclusiveLock
    #37585528
xtron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Misha Tyurin,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
  pid  | wx |       tx        | total_locks | row_exclusive |          row_exclusive_rel            | share_update_exclusive | share_update_exclusive_rel | exclusive | exclusive_rel | access_share |  access_share_rel   
-------+----+-----------------+-------------+---------------+---------------------------------------+------------------------+----------------------------+-----------+---------------+--------------+---------------------
 19144 |    | 00:00:00.031736 |           3 |             2 | public.request, main.request__idx001  |                      0 |                            |         0 |               |            1 | public.request_id_seq
 19457 |    | 00:00:00.031429 |           3 |             2 | public.request, main.request__idx001  |                      0 |                            |         0 |               |            1 | public.request_id_seq
 19755 |    | 00:00:00.018274 |           3 |             2 | public.request, main.request__idx001  |                      0 |                            |         0 |               |            1 | public.request_id_seq
 19489 |    | 00:00:00.018113 |           3 |             2 | public.request, main.request__idx001  |                      0 |                            |         0 |               |            1 | public.request_id_seq
 19483 |    | 00:00:00.013677 |           3 |             2 | public.request, main.request__idx001  |                      0 |                            |         0 |               |            1 | public.request_id_seq
 19157 |    | 00:00:00.012211 |           3 |             2 | public.request, main.request__idx001  |                      0 |                            |         0 |               |            1 | public.request_id_seq
(6 rows)
...
Рейтинг: 0 / 0
ExclusiveLock
    #37585535
Фотография Misha Tyurin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtron,

ну и? всё вроде как и должно быть. а вы чего ожидаете?
...
Рейтинг: 0 / 0
ExclusiveLock
    #37585577
xtron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Misha Tyurin, смотрите:

Код: plsql
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.
select
  s.procpid                          as pid,
  nullif(s.waiting, false)::integer  as wx,                  -- "1" - ждет блокировки
  ( now() - s.xact_start )           as tx,
--  btrim(s.current_query, ' \t\n')    as q,
  --- блокировки // l.relation::regclass::text - раскрывает внутри текущей базы только
  count( 1 ) as total_locks,
  count( nullif( (l.mode = 'RowExclusiveLock'), false ) ) as row_exclusive,
  array_to_string(array_agg( distinct ( case when ( l.mode = 'RowExclusiveLock' ) then coalesce(l.relation::regclass::text, l.relation::text) else null end ) ), ', ')
  as row_exclusive_rel,
  count( nullif( (l.mode = 'ShareUpdateExclusiveLock'), false ) ) as share_update_exclusive,
  array_to_string(array_agg( distinct ( case when ( l.mode = 'ShareUpdateExclusiveLock' ) then coalesce(l.relation::regclass::text, l.relation::text) else null end ) ), ', ')
  as share_update_exclusive_rel,
  count( nullif( (l.mode = 'ExclusiveLock'), false ) ) as exclusive,
  array_to_string(array_agg( distinct ( case when ( l.mode = 'ExclusiveLock' ) then coalesce(l.relation::regclass::text, l.relation::text) else null end ) ), ', ')
  as exclusive_rel,
  count( nullif( (l.mode = 'AccessShareLock'), false ) ) as access_share,
  array_to_string(array_agg( distinct ( case when ( l.mode = 'AccessShareLock' ) then coalesce(l.relation::regclass::text, l.relation::text) else null end ) ), ', ')
  as access_share_rel
from
  pg_stat_activity s
    left join pg_locks l on ( l.pid = s.procpid )
WHERE s.current_query iLike 'INSERT INTO public.request%'
group by
  s.procpid, s.waiting, s.xact_start, s.current_query, s.backend_start
order by
  ( s.current_query = '<IDLE>' ), ( s.current_query like 'autovacuum: %' ), tx desc;






Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
  pid  | wx |       tx        | total_locks | row_exclusive |          row_exclusive_rel             | share_update_exclusive | share_update_exclusive_rel | exclusive | exclusive_rel | access_share |  access_share_rel   
-------+----+-----------------+-------------+---------------+----------------------------------------+------------------------+----------------------------+-----------+---------------+--------------+---------------------
 19863 |    | 00:00:00.37361  |           6 |             2 | public.request, public.request__idx001 |                      0 |                            |         3 |               |            1 | public.request_id_seq
 20116 |    | 00:00:00.373521 |          10 |             2 | public.request, public.request__idx001 |                      0 |                            |         7 |               |            1 | public.request_id_seq
 20118 |    | 00:00:00.361178 |           7 |             2 | public.request, public.request__idx001 |                      0 |                            |         4 |               |            1 | public.request_id_seq
 20124 |    | 00:00:00.348249 |           6 |             2 | public.request, public.request__idx001 |                      0 |                            |         3 |               |            1 | public.request_id_seq
 20065 |    | 00:00:00.299794 |           5 |             2 | public.request, public.request__idx001 |                      0 |                            |         2 |               |            1 | public.request_id_seq
 20117 |    | 00:00:00.292552 |           5 |             2 | public.request, public.request__idx001 |                      0 |                            |         2 |               |            1 | public.request_id_seq
 20125 |    | 00:00:00.243793 |          11 |             2 | public.request, public.request__idx001 |                      0 |                            |         8 |               |            1 | public.request_id_seq
 20122 |    | 00:00:00.216375 |          11 |             2 | public.request, public.request__idx001 |                      0 |                            |         8 |               |            1 | public.request_id_seq
 20161 |    | 00:00:00.135266 |           6 |             2 | public.request, public.request__idx001 |                      0 |                            |         3 |               |            1 | public.request_id_seq
 20162 |    | 00:00:00.090813 |           6 |             2 | public.request, public.request__idx001 |                      0 |                            |         3 |               |            1 | public.request_id_seq
(10 rows)
...
Рейтинг: 0 / 0
ExclusiveLock
    #37585679
Фотография Misha Tyurin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtron,

Что вы еще делаете в этих транзакциях, рассказывайте. Через что базу дергаете. Там же видно было, что у вас есть локи на таблицы на транзакции и на адвизори еще. Откуда там адвизори?
...
Рейтинг: 0 / 0
ExclusiveLock
    #37585691
xtron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Misha Tyurin,

эта таблица не участвует ни в каких транзакциях, транзакций нет. есть массовые INSERT и более редкие SELECT - все.
...
Рейтинг: 0 / 0
ExclusiveLock
    #37585705
Фотография Misha Tyurin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtron,

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

Какой клиент к бд? Что за логика. Вообще выглядит все прилично - никто никого не ждет. Но кажется что вы не контролируете как точно идут вызовы. Может эти бекенды еще где-то юзаете. Есть ли пулы коннектов?
...
Рейтинг: 0 / 0
ExclusiveLock
    #37585755
xtron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Misha Tyurin,

используется node.js и его модуль pg к postgresql со встроенным пулом коннектов. со стороны базы pgbouncer
...
Рейтинг: 0 / 0
ExclusiveLock
    #37585770
Фотография Misha Tyurin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtron,

сорри, сижу в баре) нету коннекта проверить про адвизори. Такое впечатление, что они там где то копяться от других вызовов. Что еще там происходит с базой? кто и как ее дергает ?еще может пригодится, Пгбоунсер в каком режиме пул: сессии или транзакции?
...
Рейтинг: 0 / 0
ExclusiveLock
    #37585799
xtron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Misha Tyurin,

про адвизори - то попали другие запросы, к другой таблице, пгбоунсер пробывали в разных режимах - все одно - странность именно в этой таблице с которой делаются простые операции
...
Рейтинг: 0 / 0
ExclusiveLock
    #37585971
Фотография Misha Tyurin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtron,

Про баунсер там скорее дело не в режиме было - а в reset_query.

Так. Если дело не в адвизори, то вроде как должны иметь

инсерт:
Две блокировки на роу - таблица и индекс
Одна/две (точно не уверен, может кто подскажет) блокировки на айдишники транзакций - там айдишник и виртуальный айдишник бывают - надо разобраться
Шаред блокировка на таблицу.

Еще такой вопрос. А там нет никаких триггеров еще случайно, репликаций может еще чего подобного?
...
Рейтинг: 0 / 0
ExclusiveLock
    #37585974
Фотография Misha Tyurin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Misha Tyurin,

шаред - на сиквенс там

--

вам надо точно поймать бекенд один подозрительный и вывести все блокировки в нем которые
...
Рейтинг: 0 / 0
ExclusiveLock
    #37586025
Фотография Misha Tyurin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtron,

а какой модуль в node используете для постгреса? ноде же хитрая штука. она там как-то хитро синхронится может и может чего своего добавляет ко взаимодействию с базой.

вам надо попробовать эти инсерты напрямую, например из пгадмина или псикуеля.

в одной сессии подвешиваем транзакцию
Код: sql
1.
begin; insert into наша неудачная таблица ...;



а в другой смотрим за локами и сравниваем с тем, что видно через node.
...
Рейтинг: 0 / 0
ExclusiveLock
    #37586069
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Misha Tyurinxtron,

а какой модуль в node используете для постгреса? ноде же хитрая штука. она там как-то хитро синхронится может и может чего своего добавляет ко взаимодействию с базой.

вам надо попробовать эти инсерты напрямую, например из пгадмина или псикуеля.

в одной сессии подвешиваем транзакцию
Код: sql
1.
begin; insert into наша неудачная таблица ...;



а в другой смотрим за локами и сравниваем с тем, что видно через node.

как альтернатива можно включить log_min_duration_statement=0 минут на 5 и посмотреть какие реально запросы в лог ходят.
...
Рейтинг: 0 / 0
ExclusiveLock
    #37586070
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim BogukMisha Tyurinxtron,

а какой модуль в node используете для постгреса? ноде же хитрая штука. она там как-то хитро синхронится может и может чего своего добавляет ко взаимодействию с базой.

вам надо попробовать эти инсерты напрямую, например из пгадмина или псикуеля.

в одной сессии подвешиваем транзакцию
Код: sql
1.
begin; insert into наша неудачная таблица ...;



а в другой смотрим за локами и сравниваем с тем, что видно через node.

как альтернатива можно включить log_min_duration_statement=0 минут на 5 и посмотреть какие реально запросы в лог ходят.

вообще не понятно что смущает... все локи какие должны быть на месте
лишего ничего нет вроде...

основные локи тут это

ROW EXCLUSIVE

Conflicts with the SHARE, SHARE ROW EXCLUSIVE, EXCLUSIVE, and ACCESS EXCLUSIVE lock modes.

The commands UPDATE, DELETE, and INSERT acquire this lock mode on the target table (in addition to ACCESS SHARE locks on any other referenced tables). In general, this lock mode will be acquired by any command that modifies data in a table.
...
Рейтинг: 0 / 0
ExclusiveLock
    #37586072
Фотография Misha Tyurin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Misha Tyurin,

вспомнил, вот написано тут http://www.postgresql.org/docs/9.1/static/view-pg-locks.html

любая транзакция лочит свой виртуальный айди, а если она еще и меняет базу (например, инсерт), то у неё появляется реальный айди и она и его тоже лочит.

итого ваш инсерт должен вроде давать 5 блокировок (где-то у вас так и видно).
1) RowExclusiveLock: две на строки - таблица и индекс
2) AccessShareLock на сиквенс
3) две на айдишники транзакции

еще раз глянул ваши локи - адвизори мешает, как кажется. вы мой запрос перепишите, сделайте группировку по locktype - должно стать понятно.

Код: sql
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.
--
select
  s.procpid                          as pid,
  nullif(s.waiting, false)::integer  as wx,                  -- "1" - ждет блокировки
  ( now() - s.xact_start )           as tx,
  btrim(s.current_query, ' \t\n')    as q,
  
  count( 1 ) as total_locks,

  count( nullif( (l.locktype = 'advisory'), false ) ) as adv,
  array_agg( distinct ( case when ( l.locktype = 'advisory' ) then row(l.*) else null end ) ) as adv_l,

  count( nullif( (l.locktype = 'virtualxid'), false ) ) as vrt,
  array_agg( distinct ( case when ( l.locktype = 'virtualxid' ) then row(l.*) else null end ) ) as vrt_l,
  
  count( nullif( (l.locktype = 'transactionid'), false ) ) as trx,
  array_agg( distinct ( case when ( l.locktype = 'transactionid' ) then row(l.*) else null end ) ) as trx_l,

  count( nullif( (l.locktype = 'relation'), false ) ) as rel,
  array_agg( distinct ( case when ( l.locktype = 'relation' ) then row(l.*) else null end ) ) as rel_l
  
from
  pg_stat_activity s
    left join pg_locks l on ( l.pid = s.procpid )
group by
  s.procpid, s.waiting, s.xact_start, s.current_query
order by
  tx desc;



это в дополнение ко всему остальному)
...
Рейтинг: 0 / 0
ExclusiveLock
    #37587454
xtron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Misha Tyurin,

триггеров на таблицу никаких нет
...
Рейтинг: 0 / 0
ExclusiveLock
    #37587458
Фотография Misha Tyurin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtron,

Код: sql
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.
--
select
  s.procpid                          as pid,
  nullif(s.waiting, false)::integer  as wx,                  -- "1" - ждет блокировки
  ( now() - s.xact_start )           as tx,
  btrim(s.current_query, ' \t\n')    as q,
  
  count( 1 ) as total_locks,

  count( nullif( (l.locktype = 'advisory'), false ) ) as adv,
  array_agg( distinct ( case when ( l.locktype = 'advisory' ) then row(l.*)::text else null end ) ) as adv_l,

  count( nullif( (l.locktype = 'virtualxid'), false ) ) as vrt,
  array_agg( distinct ( case when ( l.locktype = 'virtualxid' ) then row(l.*)::text else null end ) ) as vrt_l,
  
  count( nullif( (l.locktype = 'transactionid'), false ) ) as trx,
  array_agg( distinct ( case when ( l.locktype = 'transactionid' ) then row(l.*)::text else null end ) ) as trx_l,

  count( nullif( (l.locktype = 'relation'), false ) ) as rel,
  array_agg( distinct ( case when ( l.locktype = 'relation' ) then row(l.*)::text else null end ) ) as rel_l
  
from
  pg_stat_activity s
    left join pg_locks l on ( l.pid = s.procpid )
group by
  s.procpid, s.waiting, s.xact_start, s.current_query
order by
  tx desc;



вот еще помониторте так. и как советовал Maxim Boguk можете посмотреть что там на базу валится через логи
...
Рейтинг: 0 / 0
ExclusiveLock
    #37587465
xtron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Misha Tyurin,

cat /etc/pgbouncer/pgbouncer.ini | grep server_reset_query

server_reset_query = SET SESSION AUTHORIZATION DEFAULT; RESET ALL; DEALLOCATE ALL; CLOSE ALL; UNLISTEN *; SELECT pg_advisory_unlock_all(); DISCARD PLANS; DISCARD TEMP;
...
Рейтинг: 0 / 0
ExclusiveLock
    #37587468
xtron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maxim Boguk,

log_min_duration_statement=0 бессмысленно - все запросы мои
...
Рейтинг: 0 / 0
ExclusiveLock
    #37587473
xtron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Misha Tyurinxtron,

а какой модуль в node используете для постгреса? ноде же хитрая штука. она там как-то хитро синхронится может и может чего своего добавляет ко взаимодействию с базой.


pg https://github.com/brianc/node-postgres
...
Рейтинг: 0 / 0
ExclusiveLock
    #37587474
Фотография Misha Tyurin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xtron,

ну это чтобы наверняка исключить вмешательство node . и проверти еще через подвешивание интсерта не через ноду, а на прямую
...
Рейтинг: 0 / 0
ExclusiveLock
    #37587478
xtron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maxim Bogukвообще не понятно что смущает... все локи какие должны быть на месте
лишего ничего нет вроде...

смущает EXCLUSIVE lock, не ROW EXCLUSIVE а именно EXCLUSIVE
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
ExclusiveLock
    #39218035
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2All,
а на чём сошлись ?

А то на записи блобов в тосты имею это самое "ExclusiveLock". а как подопрет с диском -- так и множественно.
и чего ждут -- без стаканА не ясно.

'extend''pg_toast.pg_toast_816650291'25025'select r::void from XXXX_set_proxy($1::int4,$2::int8,$3::"numeric",$4::"timestamp",$5::bytea,$6::date,$7::"varchar") r''ExclusiveLock'32724'select r::void from XXXX_set_proxy($1::int4,$2::int8,$3::"numeric",$4::"timestamp",$5::bytea,$6::date,$7::"varchar") r''ExclusiveLock'

запрос цельнотянутый из инетов. примерно такой

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
SELECT
	BL.locktype
	,BL.relation::regclass
	,a.pid AS blocked_pid
	,replace( replace( a.query,E'\n','\n'),E'\t','\t') as blocked_query
	,L.mode as blocked_mode
	,BA.pid AS blocking_pid
	,replace( replace( Ba.query,E'\n','\n'),E'\t','\t') as blocking_query
	,BL.mode as blocking_mode
FROM pg_catalog.pg_locks L
	JOIN pg_stat_activity a ON L.pid = a.pid
		LEFT JOIN pg_catalog.pg_locks BL ON(BL.relation=L.relation	
			AND BL.locktype=L.locktype AND L.pid != BL.pid)			
			AND BL.granted =true 
		LEFT JOIN pg_stat_activity BA ON BL.pid = BA.pid
WHERE
	NOT L.granted
	AND a.waiting


-- чтобы квери читать, значится.


есть идеи ?

навскидку -- ничего не альтерится нигде. set ф--ии читают что---то по-мелочи, не лоча, и пишут в табличку с блобами.

-- т.е. , похоже, при записи тостов имеет место ExclusiveLock
...
Рейтинг: 0 / 0
ExclusiveLock
    #39218060
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwq,

Проблема разбиралась много раз.
Называется relation extenstion locking (ExclusiveLock на таблицу когда к файлу новую страницу добавляют).
Например вот
http://www.postgresql.org/message-id/flat/7DC73570-1A80-470D-8B7B-46E2713C41D4@simply.name#7DC73570-1A80-470D-8B7B-46E2713C41D4@simply.name]http://www.postgresql.org/message-id/flat/7DC73570-1A80-470D-8B7B-46E2713C41D4@simply.name#7DC73570-1A80-470D-8B7B-46E2713C41D4@simply.name

Причины может быть две что этот лок надолго вылезает:
1)перегруженная дисковая система и в итоге просто file append долгий
2)многовато выделено shared buffers (редкий случай когда это может быть конкретно вредно).

Судя по
http://www.postgresql.org/message-id/flat/CAJjS0u3oVpuSAT8NviryeRNqA0nj8WEEXfSx=uRPqWF1=ORSVg@mail.gmail.com#CAJjS0u3oVpuSAT8NviryeRNqA0nj8WEEXfSx=uRPqWF1=ORSVg@mail.gmail.com]http://www.postgresql.org/message-id/flat/CAJjS0u3oVpuSAT8NviryeRNqA0nj8WEEXfSx=uRPqWF1=ORSVg@mail.gmail.com#CAJjS0u3oVpuSAT8NviryeRNqA0nj8WEEXfSx=uRPqWF1=ORSVg@mail.gmail.com
если я правильно понял в 9.6 это будет исправлено.

--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
40 сообщений из 40, показаны все 2 страниц
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / ExclusiveLock
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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