Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / PostgreSQL Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 9.2.1 segfault  [new]
tadmin
Member

Откуда:
Сообщений: 1184
Обновились с 9.1 до 9.2.1. Особых проблем не было, кое где ухудшились планы запросов.
Внезапно выяснилось, что одна единственная plpgsql функция из нескольких тысяч вызывает segfaut, после чего закрываются все коннекты. По счастью, вызывается планировщиком ночью, так что пока ее заглушили.

Эта функция с небольшими модификациями отработала 4 года, пройдя через все версии от 8.х

PostgreSQL 9.2.1 on x86_64-unknown-linux-gnu, compiled by gcc-4.4.real (Ubuntu 4.4.3-4ubuntu5.1) 4.4.3, 64-bit
Linux 2.6.32-42-server #96-Ubuntu SMP Wed Aug 15 19:52:20 UTC 2012 x86_64 GNU/Linux
На железо грешить пока нет причин, оно отработало в production примерно год и сейчас под приличной нагрузкой.

2012-10-02 23:05:05 MSK LOG: server process (PID 28234) was terminated by signal 11: Segmentation fault
2012-10-02 23:05:05 MSK DETAIL: Failed process was running: select * from empl.orderitemreservesettodeleteselect($1,'1fc50dc7-2440-465a-978f-f234ff731eea','refc') as result
2012-10-02 23:05:05 MSK LOG: terminating any other active server processes
2012-10-02 23:05:05 MSK database liferay WARNING: terminating connection because of crash of another server process
2012-10-02 23:05:05 MSK database liferay DETAIL: The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory.

Внутри функции запрос на создание курсора. Это запрос, вызванный сам по себе, так же приводит к тому же самому segfaut.
Вот этот запрос
+
        select OIR.OrderItemReserveID,
                O.orderid,
                O.number,
                coalesce(O.ForPersonID, DP.PersonID) as ForPersonID,
                O.ownpersonid,
                SA.code,
                OIR.amount
        from OrderItemReserves           as OIR
        inner join OrderItems                    as OI  on (OI.OrderItemID = OIR.OrderItemID)
        inner join Orders                        as O   on (O.OrderID = OI.OrderID)
        left outer join (select max(P.PersonID) as PersonID,
                                P.CompanyID 
                                from existed.Persons as P
                                inner join ContactInfo as CI on (CI.PersonID = P.PersonID and CI.ContactInfoTypeID = 5)
                                group by P.CompanyID
                        ) as DP on (DP.CompanyID = O.CustomerID)
        inner join SaleArticles                  as SA  on (OI.SaleArticleID = SA.SaleArticleID)
        left outer join ( select distinct CSI.SaleArticleID
                          from CatalogueSectionItems as CSI
                          inner join CatalogueSections as CS on (CS.CatalogueSectionID = CSI.CatalogueSectionID) 
                          where CS.CatalogueID = 20083
                         ) as CSI on (CSI.SaleArticleID = OI.SaleArticleID)
                          

        where O.Paidsum =0 and  
              OIR.Todeletedate <=dateToMark and OIR.ObjectStatusID = 1 and OIR.Amount >0
              and (not O.isInWork or O.isInWork is null)
              and (not O.IsInvRecieved or (O.InvRecieveddate + '7 day'::interval) <=now())
              and (not OIR.IsTodelete or OIR.istodelete is null)
              and not OIR.IsSubrelease and (OIR.StoreGroupID = 5 or (OIR.StoreGroupID = 6 and CSI.SaleArticleID is not null))
              and O.customerid not in(9463,8452,8462,8412);


Если же убрать подзапрос с left join, то никаких проблем
+
        select OIR.OrderItemReserveID,
                O.orderid,
                O.number,
                coalesce(O.ForPersonID, DP.PersonID) as ForPersonID,
                O.ownpersonid,
                SA.code,
                OIR.amount
        from OrderItemReserves           as OIR
        inner join OrderItems                    as OI  on (OI.OrderItemID = OIR.OrderItemID)
        inner join Orders                        as O   on (O.OrderID = OI.OrderID)
        left outer join (select max(P.PersonID) as PersonID,
                                P.CompanyID 
                                from existed.Persons as P
                                inner join ContactInfo as CI on (CI.PersonID = P.PersonID and CI.ContactInfoTypeID = 5)
                                group by P.CompanyID
                        ) as DP on (DP.CompanyID = O.CustomerID)
        inner join SaleArticles                  as SA  on (OI.SaleArticleID = SA.SaleArticleID)
/*
        left outer join ( select distinct CSI.SaleArticleID
                          from CatalogueSectionItems as CSI
                          inner join CatalogueSections as CS on (CS.CatalogueSectionID = CSI.CatalogueSectionID) 
                          where CS.CatalogueID = 20083
                         ) as CSI on (CSI.SaleArticleID = OI.SaleArticleID)
*/                          

        where O.Paidsum =0 and  
              OIR.Todeletedate <=dateToMark and OIR.ObjectStatusID = 1 and OIR.Amount >0
              and (not O.isInWork or O.isInWork is null)
              and (not O.IsInvRecieved or (O.InvRecieveddate + '7 day'::interval) <=now())
              and (not OIR.IsTodelete or OIR.istodelete is null)
              and not OIR.IsSubrelease and (OIR.StoreGroupID = 5 or (OIR.StoreGroupID = 6)) -- and CSI.SaleArticleID is not null))
              and O.customerid not in(9463,8452,8462,8412);


Убранный подзапрос можно вызвать, никаких проблем.
select distinct CSI.SaleArticleID
                          from CatalogueSectionItems as CSI
                          inner join CatalogueSections as CS on (CS.CatalogueSectionID = CSI.CatalogueSectionID) 
                          where CS.CatalogueID = 20083


Сейчас пытаемся создать минимальный proofset.
3 окт 12, 11:36    [13260452]     Ответить | Цитировать Сообщить модератору
 Re: 9.2.1 segfault  [new]
Misha Tyurin
Member

Откуда: Тюмень
Сообщений: 2243
tadmin,

просто интересно, а зачем обновлялись?
3 окт 12, 11:50    [13260563]     Ответить | Цитировать Сообщить модератору
 Re: 9.2.1 segfault  [new]
Misha Tyurin
Member

Откуда: Тюмень
Сообщений: 2243
Misha Tyurin,

думаю тоже обновляться. но я с 9.0 еще хочу вперед. думаю до последней 9.1
3 окт 12, 11:51    [13260575]     Ответить | Цитировать Сообщить модератору
 Re: 9.2.1 segfault  [new]
Misha Tyurin
Member

Откуда: Тюмень
Сообщений: 2243
tadmin,

что-то подобное у меня было на 9.1 каком-то раннем. но там было связанно с unlogged тайблами. что-то они там поломали глобально, когда их ввели.
3 окт 12, 11:55    [13260609]     Ответить | Цитировать Сообщить модератору
 Re: 9.2.1 segfault  [new]
Maxim Boguk
Member

Откуда: По разному.
Сообщений: 4985
tadmin,

Ой как интересно... да надо test case и bug report слать...
криминала я в вашем запросе не вижу... так что новую багу словили а это всегда интересно.

Совсем хорошо - поставить версию с отладкой и получить core в этом месте.... и gdb backtrace посмотреть...
впрочем при наличии test case это не особо актуально авторы сами у себя воспроизведут...
3 окт 12, 12:02    [13260674]     Ответить | Цитировать Сообщить модератору
 Re: 9.2.1 segfault  [new]
tadmin
Member

Откуда:
Сообщений: 1184
Misha Tyurin
tadmin,
просто интересно, а зачем обновлялись?

Занялись календарями, интервалы хотели. И JSON так просится на сайт, поскольку все отдаем из ХП.

Вообще с 8.2 до 9.1 обновлялись без особых задержек. А тут даже дождались 9.2.1.
3 окт 12, 12:05    [13260705]     Ответить | Цитировать Сообщить модератору
 Re: 9.2.1 segfault  [new]
Maxim Boguk
Member

Откуда: По разному.
Сообщений: 4985
Misha Tyurin
tadmin,

просто интересно, а зачем обновлялись?


index only scans могут легко давать 2-10 раз ускорение на запросах... и после 16 ядер 9.2 scale куда как лучше... а после 24 - так совсем...
3 окт 12, 12:09    [13260743]     Ответить | Цитировать Сообщить модератору
 Re: 9.2.1 segfault  [new]
tadmin
Member

Откуда:
Сообщений: 1184
Maxim Boguk
tadmin,

Ой как интересно... да надо test case и bug report слать...
криминала я в вашем запросе не вижу... так что новую багу словили а это всегда интересно.

На тестовый кластер накатили, воспроизводится. Тест удалось немного сократить. Падает и от исполнения, и от explain. Если убрать любое условие из where или подзапрос, запрос исполняется. Подзапрос можно развернуть в два left join - так же падает.

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


+
select OIR.OrderItemReserveID
from OrderItemReserves as OIR
inner join OrderItems as OI on (OI.OrderItemID = OIR.OrderItemID)
left outer join ( select distinct CSI.SaleArticleID
                  from CatalogueSectionItems as CSI
                  inner join CatalogueSections as CS on (CS.CatalogueSectionID = CSI.CatalogueSectionID)
                  where CS.CatalogueID = 20083
                  ) as CSI on (CSI.SaleArticleID = OI.SaleArticleID)
where OIR.ObjectStatusID = 1 
and OIR.Amount >0
and (OIR.StoreGroupID = 5 or (OIR.StoreGroupID = 6 and CSI.SaleArticleID is not null))
3 окт 12, 12:40    [13260992]     Ответить | Цитировать Сообщить модератору
 Re: 9.2.1 segfault  [new]
Misha Tyurin
Member

Откуда: Тюмень
Сообщений: 2243
Maxim Boguk
и после 16 ядер 9.2 scale куда как лучше... а после 24 - так совсем...


дааа. это да. подожду до хотя бы 9.2.4 - буду тоже апдейтить
3 окт 12, 13:07    [13261226]     Ответить | Цитировать Сообщить модератору
 Re: 9.2.1 segfault  [new]
Misha Tyurin
Member

Откуда: Тюмень
Сообщений: 2243
tadmin
И JSON так просится на сайт

угу
3 окт 12, 13:08    [13261244]     Ответить | Цитировать Сообщить модератору
 Re: 9.2.1 segfault  [new]
tadmin
Member

Откуда:
Сообщений: 1184
Мы сегодня вечером сделаем downgrade. Кто его знает, откуда еще выстрелит.

А на 9.2 будем выпиливать минимальный датасет, в котором можно баг воспроизвести.
3 окт 12, 13:09    [13261247]     Ответить | Цитировать Сообщить модератору
 Re: 9.2.1 segfault  [new]
Misha Tyurin
Member

Откуда: Тюмень
Сообщений: 2243
Maxim Boguk
index only scans могут легко давать 2-10 раз ускорение на запросах


а вот это пока какая-то загадка для меня)
3 окт 12, 13:09    [13261253]     Ответить | Цитировать Сообщить модератору
 Re: 9.2.1 segfault  [new]
tadmin
Member

Откуда:
Сообщений: 1184
Maxim Boguk
index only scans могут легко давать 2-10 раз ускорение на запросах...

У нас каждый день в таблицу пишется время наработки всех функций из pg_stat_user_functions. Потом строим diff за день. Довольно объективно.

В целом много где показатели ухудшились на 2-5%. Несколько функций выросли с 5-6 до 15мс, есть случай 15мс - 150 мс - тут вообще пришлось запрос переписывать. Ярких улучшений в "горячих" функция просто нет.
3 окт 12, 13:16    [13261307]     Ответить | Цитировать Сообщить модератору
 Re: 9.2.1 segfault  [new]
Maxim Boguk
Member

Откуда: По разному.
Сообщений: 4985
tadmin
Maxim Boguk
tadmin,

Ой как интересно... да надо test case и bug report слать...
криминала я в вашем запросе не вижу... так что новую багу словили а это всегда интересно.

На тестовый кластер накатили, воспроизводится. Тест удалось немного сократить. Падает и от исполнения, и от explain. Если убрать любое условие из where или подзапрос, запрос исполняется. Подзапрос можно развернуть в два left join - так же падает.

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


+
+
select OIR.OrderItemReserveID
from OrderItemReserves as OIR
inner join OrderItems as OI on (OI.OrderItemID = OIR.OrderItemID)
left outer join ( select distinct CSI.SaleArticleID
                  from CatalogueSectionItems as CSI
                  inner join CatalogueSections as CS on (CS.CatalogueSectionID = CSI.CatalogueSectionID)
                  where CS.CatalogueID = 20083
                  ) as CSI on (CSI.SaleArticleID = OI.SaleArticleID)
where OIR.ObjectStatusID = 1 
and OIR.Amount >0
and (OIR.StoreGroupID = 5 or (OIR.StoreGroupID = 6 and CSI.SaleArticleID is not null))


а без distinct в подзапросе не падает?
или без условия на CSI.SaleArticleID is not null в конце?

вообще достаточно проверить эти две версии и можно писать баг для начала достаточно...
если нет времени - могу я багу зарепортить.... это весьма критичный баг на самом деле
3 окт 12, 13:46    [13261576]     Ответить | Цитировать Сообщить модератору
 Re: 9.2.1 segfault  [new]
tadmin
Member

Откуда:
Сообщений: 1184
Maxim Boguk
а без distinct в подзапросе не падает?
или без условия на CSI.SaleArticleID is not null в конце?
вообще достаточно проверить эти две версии и можно писать баг для начала достаточно...
если нет времени - могу я багу зарепортить.... это весьма критичный баг на самом деле

Без distinct и без CSI.SaleArticleID is not null не падает.

Зарепортить - буду очень благодарен. Единственно - не могу обещать оперативное появление датасета.
Завтра уезжаю, даже не смогу проверить другие гипотезы до сл. недели. Так что можно и подождать чутка.
3 окт 12, 13:54    [13261639]     Ответить | Цитировать Сообщить модератору
 Re: 9.2.1 segfault  [new]
Гость_0
Guest
tadmin,

в debian есть пакет postgresql-9.2-dbg, в ubuntu он наверняка тоже есть, поставьте его и сохраните backtrace после падения.
3 окт 12, 14:00    [13261700]     Ответить | Цитировать Сообщить модератору
 Re: 9.2.1 segfault  [new]
Maxim Boguk
Member

Откуда: По разному.
Сообщений: 4985
tadmin
Maxim Boguk
а без distinct в подзапросе не падает?
или без условия на CSI.SaleArticleID is not null в конце?
вообще достаточно проверить эти две версии и можно писать баг для начала достаточно...
если нет времени - могу я багу зарепортить.... это весьма критичный баг на самом деле

Без distinct и без CSI.SaleArticleID is not null не падает.

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

два вопроса
1)достаточно убрать или distinct или is not null Или надо убирать оба?
2)падает уже на explain или только на explain analyze ?
3 окт 12, 14:01    [13261705]     Ответить | Цитировать Сообщить модератору
 Re: 9.2.1 segfault  [new]
tadmin
Member

Откуда:
Сообщений: 1184
Maxim Boguk
два вопроса
1)достаточно убрать или distinct или is not null Или надо убирать оба?

убрать хоть из двух, запрос исполняется нормально
2)падает уже на explain или только на explain analyze ?

Всегда падает на Explain. Варианта, чтобы падало на запросе но не падало на Explain не обнаружил.

Конфиг в тестовом кластере:
+
hba_file = '/etc/postgresql/9.2/test/pg_hba.conf'
ident_file = '/etc/postgresql/9.2/test/pg_ident.conf'
external_pid_file = '/var/run/postgresql/9.2-test.pid'

listen_addresses = 'localhost,192.168.0.13'
port = 5435
max_connections = 20
unix_socket_directory = '/var/run/postgresql'

ssl = false # (change requires restart)
shared_buffers = 1GB
work_mem = 16MB
maintenance_work_mem = 100MB
effective_cache_size=2GB

log_min_duration_statement = 200 # -1 is disabled, 0 logs all statements
log_min_messages = notice
log_temp_files = 0
log_line_prefix = '%t %d %u '
track_functions = all # none, pl, all

update_process_title = on

bytea_output = 'escape'

datestyle = 'iso, dmy'
log_timezone = 'Europe/Moscow'
timezone = 'Europe/Moscow'

#------------------------------------------------------------------------------
user_session.access_level = 0
3 окт 12, 14:08    [13261812]     Ответить | Цитировать Сообщить модератору
 Re: 9.2.1 segfault  [new]
tadmin
Member

Откуда:
Сообщений: 1184
Извините "убрать хоть из двух, запрос исполняется нормально" => "убрать хоть один из двух, запрос исполняется нормально"
3 окт 12, 14:09    [13261818]     Ответить | Цитировать Сообщить модератору
 Re: 9.2.1 segfault  [new]
Maxim Boguk
Member

Откуда: По разному.
Сообщений: 4985
tadmin
Извините "убрать хоть из двух, запрос исполняется нормально" => "убрать хоть один из двух, запрос исполняется нормально"


ага я понял... и последнее -


explain     select 
        distinct CSI.SaleArticleID 
    from CatalogueSectionItems as CSI 
    inner join CatalogueSections as CS on (CS.CatalogueSectionID = CSI.CatalogueSectionID) 
    where CS.CatalogueID = 20083 


что выдает?
3 окт 12, 14:12    [13261855]     Ответить | Цитировать Сообщить модератору
 Re: 9.2.1 segfault  [new]
tadmin
Member

Откуда:
Сообщений: 1184
Maxim Boguk

explain     select 
        distinct CSI.SaleArticleID 
    from CatalogueSectionItems as CSI 
    inner join CatalogueSections as CS on (CS.CatalogueSectionID = CSI.CatalogueSectionID) 
    where CS.CatalogueID = 20083 


что выдает?


HashAggregate  (cost=874.87..878.88 rows=401 width=4)
-> Nested Loop (cost=5.16..873.87 rows=401 width=4)
-> Index Scan using i_cataloguesections_catalogue on cataloguesections cs (cost=0.00..22.50 rows=5 width=4)
Index Cond: ((catalogueid)::integer = 20083)
-> Bitmap Heap Scan on cataloguesectionitems csi (cost=5.16..169.18 rows=109 width=8)
Recheck Cond: ((cataloguesectionid)::integer = (cs.cataloguesectionid)::integer)
-> Bitmap Index Scan on i_cataloguesectionitem_section (cost=0.00..5.13 rows=109 width=0)
Index Cond: ((cataloguesectionid)::integer = (cs.cataloguesectionid)::integer)
3 окт 12, 14:16    [13261907]     Ответить | Цитировать Сообщить модератору
 Re: 9.2.1 segfault  [new]
Maxim Boguk
Member

Откуда: По разному.
Сообщений: 4985
tadmin
Maxim Boguk
explain     select 
        distinct CSI.SaleArticleID 
    from CatalogueSectionItems as CSI 
    inner join CatalogueSections as CS on (CS.CatalogueSectionID = CSI.CatalogueSectionID) 
    where CS.CatalogueID = 20083 


что выдает?


HashAggregate  (cost=874.87..878.88 rows=401 width=4)
-> Nested Loop (cost=5.16..873.87 rows=401 width=4)
-> Index Scan using i_cataloguesections_catalogue on cataloguesections cs (cost=0.00..22.50 rows=5 width=4)
Index Cond: ((catalogueid)::integer = 20083)
-> Bitmap Heap Scan on cataloguesectionitems csi (cost=5.16..169.18 rows=109 width=8)
Recheck Cond: ((cataloguesectionid)::integer = (cs.cataloguesectionid)::integer)
-> Bitmap Index Scan on i_cataloguesectionitem_section (cost=0.00..5.13 rows=109 width=0)
Index Cond: ((cataloguesectionid)::integer = (cs.cataloguesectionid)::integer)


welcome

create table t1 as select id from generate_series(1,100000) as g(i);
create table t2 as select id from generate_series(1,100000) as g(id);
alter table t1 add primary key (id);
alter table t2 add primary key (id);
analyze t1;
analyze t2;

explain select * from t1
left outer join 
(
  select distinct t2.id from t2 
  where t2.id>100
) as _t on _t.id=t1.id
where
(t1.id>100  or (t1.id<100 and _t.id IS NOT NULL));

The connection to the server was lost.
3 окт 12, 14:27    [13262018]     Ответить | Цитировать Сообщить модератору
 Re: 9.2.1 segfault  [new]
tadmin
Member

Откуда:
Сообщений: 1184
create table t1 as select id from generate_series(1,100000) as g(id);
- так у меня нельзя.

А вот это воспроизвелось:
create table t1 as select * from generate_series(1,100000) as g(id);
create table t2 as select * from generate_series(1,100000) as g(id);
alter table t1 add primary key (id);
alter table t2 add primary key (id);
analyze t1;
analyze t2;

explain select * from t1
left outer join 
(
  select distinct t2.id from t2 
  where t2.id>100
) as _t on _t.id=t1.id
where
(t1.id>100  or (t1.id<100 and _t.id IS NOT NULL));


Спасибо, впечатляет!
3 окт 12, 14:36    [13262099]     Ответить | Цитировать Сообщить модератору
 Re: 9.2.1 segfault  [new]
Maxim Boguk
Member

Откуда: По разному.
Сообщений: 4985
tadmin,

опечатался когда из лога базы переносил в первой строчке...
3 окт 12, 14:40    [13262133]     Ответить | Цитировать Сообщить модератору
 Re: 9.2.1 segfault  [new]
tadmin
Member

Откуда:
Сообщений: 1184
Maxim Boguk,
если будет багрепорот, дайте ссылку сюда, пожалуйста.
3 окт 12, 14:45    [13262172]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / PostgreSQL Ответить