Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / PostgreSQL Новый топик    Ответить
 запускаю процедуру и вешается сервак.  [new]
lr2
Member

Откуда:
Сообщений: 31
Добрый день.

Есть процедура, которая выполняется в тестовой БД, она делает следующее:

1) берет список ip из таблички в тестовой БД.
2) подключается через db_link к каждому серверу из списка, делает там простой SELECT
3) результаты SELECT вставляет в свою табличку в тестовой БД.




При этом, после 3-5 минут выполнения процедуры дико начинают тормозить промышленные БД на том же кластере.

В промышленные БД процедура никак не лезет. Нагрузки не создает (вставка 10 строк в минуту).




Тем не менее, прослеживается явная зависимость от запуска этой процедуры и торможением. Как будто эта процедура запускаетсяв промышленной БД и там индексы пухнуть начинают.




Подскажите, как сделать чтобы выполнение процедуры в тестовой БД не мешало работе промышшленным БД в том же кластере?
15 май 19, 13:19    [21885201]     Ответить | Цитировать Сообщить модератору
 Re: запускаю процедуру и вешается сервак.  [new]
mefman
Member

Откуда:
Сообщений: 2531
lr2
Подскажите, как сделать чтобы выполнение процедуры в тестовой БД не мешало работе промышшленным БД в том же кластере?

драйвера поставить, как минимум
15 май 19, 13:22    [21885207]     Ответить | Цитировать Сообщить модератору
 Re: запускаю процедуру и вешается сервак.  [new]
lr2
Member

Откуда:
Сообщений: 31
mefman
lr2
Подскажите, как сделать чтобы выполнение процедуры в тестовой БД не мешало работе промышшленным БД в том же кластере?

драйвера поставить, как минимум


Драйвера чего?
15 май 19, 13:27    [21885214]     Ответить | Цитировать Сообщить модератору
 Re: запускаю процедуру и вешается сервак.  [new]
mefman
Member

Откуда:
Сообщений: 2531
lr2
mefman
пропущено...

драйвера поставить, как минимум


Драйвера чего?

для рук и мозгов. Поскольку вы никаких данных больше не дали...
15 май 19, 13:30    [21885218]     Ответить | Цитировать Сообщить модератору
 Re: запускаю процедуру и вешается сервак.  [new]
lr2
Member

Откуда:
Сообщений: 31
Вот такая функция:



+
CREATE OR REPLACE FUNCTION my_func()
  RETURNS integer AS
$BODY$
DECLARE
client_ip text;
BEGIN

--пересоздаю таблицу для сбора данных и транкэйчу ее, если она уже была
BEGIN create table my_table(client_ip text, status numeric);EXCEPTION WHEN OTHERS THEN END;
TRUNCATE TABLE my_table;

--сбор данных по всем клиентам
    FOR client_ip IN
        SELECT ip FROM clients
    LOOP
	BEGIN


RAISE NOTICE ' %', client_ip;


--сама вставка в цикле
INSERT INTO my_table(client_ip,status)
VALUES (client_ip,
(SELECT *
   FROM dblink('host='||client_ip||'
                dbname=1c_prod port=5432 user=postgres password=odinass'::text, 
			'SELECT status FROM client_status'::text, false) q
			(status numeric))
);

EXCEPTION WHEN OTHERS THEN
INSERT INTO my_table(client_ip,status)
VALUES (client_ip,-1);
        END;
       
    END LOOP;

return 0;
END;
$BODY$
  LANGUAGE plpgsql ;



Она запускается в тестовой БД, а тормозить начинает промышленная.
15 май 19, 13:34    [21885223]     Ответить | Цитировать Сообщить модератору
 Re: запускаю процедуру и вешается сервак.  [new]
Maxim Boguk
Member

Откуда: Melbourne, Австралия
Сообщений: 3924
lr2,

А у вас случайно не на винде база стоит? Да еще и на НЕ СЕРВЕРНОЙ винде?
Очень похоже на окончание лимитов открытых коннектов в несерверной винде.

PS: тестовую и production нагрузку на одном физическом сервере не держат (даже на двух разных виртуалках не говоря о одном кластере базы).

PPS: вы бы посмотрели что именно тормозит то и как... тормозит - не это симптом... симптом - рост cpu или io или еще что то что можно как то трактовать а не гадать на кофейной гуще.

PPPS: еще возможно окончание лимита коннектов к кластеру базы (если баз у вас много а max_connections мало).
15 май 19, 13:44    [21885236]     Ответить | Цитировать Сообщить модератору
 Re: запускаю процедуру и вешается сервак.  [new]
lr2
Member

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

А у вас случайно не на винде база стоит? Да еще и на НЕ СЕРВЕРНОЙ винде?
Очень похоже на окончание лимитов открытых коннектов в несерверной винде.

PS: тестовую и production нагрузку на одном физическом сервере не держат (даже на двух разных виртуалках не говоря о одном кластере базы).

PPS: вы бы посмотрели что именно тормозит то и как... тормозит - не это симптом... симптом - рост cpu или io или еще что то что можно как то трактовать а не гадать на кофейной гуще.

PPPS: еще возможно окончание лимита коннектов к кластеру базы (если баз у вас много а max_connections мало).



Да, вы правы, это винда.
Серверная.

Торможение проявляется так:

Симптомы:
Запросы начинают выполняться медленнее и висят как активные по несколько сек.
CPU нагрузка с 10% подскакивает до 100%.

max_connections достаточно, не более 30% занято, да и коннекты ведь к клиентам, у них свои БД.




>Очень похоже на окончание лимитов открытых коннектов в несерверной винде.

разве тогда бы не падал весь кластер с ntstatus.h исключением?
15 май 19, 14:01    [21885267]     Ответить | Цитировать Сообщить модератору
 Re: запускаю процедуру и вешается сервак.  [new]
lr2
Member

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

вообще очень похоже что как-то связано с количеством клиентов.

Если LIMIT 100 ставлю - отрабатывает нормально.

Если LIMIT 200 - примерно на 150-м начинаются жуткие тормоза!!!
15 май 19, 14:13    [21885286]     Ответить | Цитировать Сообщить модератору
 Re: запускаю процедуру и вешается сервак.  [new]
lr2
Member

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

еще одна интересная особенность:


Если тот же самый текст оформить как анонимный блок DO - то ТОРМОЗОВ НЕТ!!!!


Все прекрасно выполняется.

А когда то же самое внутри функции появляются тормоза.



Может быть на функцию какие-то ограничения по рессурсам имеются?
15 май 19, 14:31    [21885316]     Ответить | Цитировать Сообщить модератору
 Re: запускаю процедуру и вешается сервак.  [new]
qwwq
Member

Откуда:
Сообщений: 2788
и ещё момент:
[quot lr2]
LOOP
		BEGIN


		RAISE NOTICE ' %', client_ip;


		--сама вставка в цикле
		INSERT INTO my_table(client_ip,status)
		VALUES (client_ip,
			(SELECT *
			FROM dblink('host='||client_ip||'
				dbname=1c_prod port=5432 user=postgres password=odinass'::text, 
				'SELECT status FROM client_status'::text, false) q
				(status numeric))
);

	EXCEPTION WHEN OTHERS THEN
		INSERT INTO my_table(client_ip,status) VALUES (client_ip,-1);
	END;
       
END LOOP;


похоже на многократное (пере)открытие (неименованного) соединения в лупе.
они ж (неименованные), как я помню (можете ,впрочем, перепроверить сами, могло что-то измениться), не враз закроются. и все висят до конца сеанса, недоступные к закрытию.
переоткрывайте (и явно закрывайте) "одно" "именованное" соединение и делайте все "в нем".
15 май 19, 14:35    [21885329]     Ответить | Цитировать Сообщить модератору
 Re: запускаю процедуру и вешается сервак.  [new]
lr2
Member

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

еще одна интересная особенность:


Если тот же самый текст оформить как анонимный блок DO - то ТОРМОЗОВ НЕТ!!!!


Все прекрасно выполняется.

А когда то же самое внутри функции появляются тормоза.



Может быть на функцию какие-то ограничения по рессурсам имеются?


тут я поторопился с выводом, через функцию тоже стал выполняться.

Единственное что поменял - в цикле вместо двух дблинков сделал один.

Очень странно... как будто какое-то ограничение срабатывает по количеству дблинков внутри процедуры.

При этом SELECT COUNT(*) FROM pg_stat_activity покажывает 30% от максимального количества.
15 май 19, 14:48    [21885357]     Ответить | Цитировать Сообщить модератору
 Re: запускаю процедуру и вешается сервак.  [new]
lr2
Member

Откуда:
Сообщений: 31
[quot qwwq]и ещё момент:
lr2
LOOP
		BEGIN


		RAISE NOTICE ' %', client_ip;


		--сама вставка в цикле
		INSERT INTO my_table(client_ip,status)
		VALUES (client_ip,
			(SELECT *
			FROM dblink('host='||client_ip||'
				dbname=1c_prod port=5432 user=postgres password=odinass'::text, 
				'SELECT status FROM client_status'::text, false) q
				(status numeric))
);

	EXCEPTION WHEN OTHERS THEN
		INSERT INTO my_table(client_ip,status) VALUES (client_ip,-1);
	END;
       
END LOOP;


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



так сложно отлавливать эксэпшны, когда неудачная попытка соединения.
Попробую как вы сказали сделать.
По идее коннект должен оставться висеть на клиентской БД, но его там нет.
15 май 19, 14:49    [21885361]     Ответить | Цитировать Сообщить модератору
 Re: запускаю процедуру и вешается сервак.  [new]
lr2
Member

Откуда:
Сообщений: 31
Итак, получилось смоделировать зависание.

Вернул обратно в цикл два дблинк и добавил счетчик, который увеличивается на 1 перед каждым дблинк

+
...
i_var:=i_var+1;
RAISE NOTICE '% %', clock_timestamp(), i_var;
INSERT INTO my_table(client_ip,status)
VALUES (client_ip,
(SELECT *
   FROM dblink('host='||client_ip||'
                dbname=1c_prod port=5432 user=postgres password=odinass'::text, 
			'SELECT status FROM client_status'::text, false) q
			(status numeric))
);

--и еще раз, для тестирования количества:
i_var:=i_var+1;
RAISE NOTICE '% %', clock_timestamp(), i_var;
INSERT INTO my_table(client_ip,status)
VALUES (client_ip,
(SELECT *
   FROM dblink('host='||client_ip||'
                dbname=1c_prod port=5432 user=postgres password=odinass'::text, 
			'SELECT status FROM client_status'::text, false) q
			(status numeric))
);
...





В итоге получилось что после 413 dblink начинаются тормоза, с чем связанные, непонятно:


NOTICE: 2019-05-15 15:05:13.107+03 408
NOTICE: 2019-05-15 15:05:13.247+03 409
NOTICE: 2019-05-15 15:05:13.513+03 410
NOTICE: 2019-05-15 15:05:13.793+03 411
NOTICE: 2019-05-15 15:05:13.887+03 412
NOTICE: 2019-05-15 15:05:13.987+03 413 <<---ЗАВИСАНИЕ
NOTICE: 2019-05-15 15:05:16.811+03 414
NOTICE: 2019-05-15 15:05:18.567+03 415
NOTICE: 2019-05-15 15:05:31.378+03 416
Выполнение отменено!


При этом
SELECT COUNT(*) FROM pg_stat_activity
30% то максимального.


Скажите, с чем связаны тормоза всего кластера, появляющиеся после 400+ дб линков?
15 май 19, 15:15    [21885397]     Ответить | Цитировать Сообщить модератору
 Re: запускаю процедуру и вешается сервак.  [new]
lr2
Member

Откуда:
Сообщений: 31
При использовании анонимного блока зависание случилось на 493 дблинке:




NOTICE: 2019-05-15 15:19:07.528+03 485
NOTICE: 2019-05-15 15:19:07.59+03 486
NOTICE: 2019-05-15 15:19:07.762+03 487
NOTICE: 2019-05-15 15:19:07.824+03 488
NOTICE: 2019-05-15 15:19:07.918+03 489
NOTICE: 2019-05-15 15:19:08.09+03 490
NOTICE: 2019-05-15 15:19:08.242+03 491
NOTICE: 2019-05-15 15:19:08.362+03 492
NOTICE: 2019-05-15 15:19:08.492+03 493 <<--ЗАВИСАНИЕ
NOTICE: 2019-05-15 15:19:11.169+03 494
NOTICE: 2019-05-15 15:19:11.987+03 495
NOTICE: 2019-05-15 15:19:59.74+03 496
NOTICE: 2019-05-15 15:19:59.873+03 497
Выполнение отменено!




Но тоже случилось. Т.е. не только внутри функции но и внутри анонимного блока происходят эти странности.

Может быть какой-то баг встречался на эту тему?

Или есть какой-то ограничение на количество дблинков в запросе?
15 май 19, 15:25    [21885413]     Ответить | Цитировать Сообщить модератору
 Re: запускаю процедуру и вешается сервак.  [new]
qwwq
Member

Откуда:
Сообщений: 2788
lr2
так сложно отлавливать эксэпшны, когда неудачная попытка соединения.

сложно трусы через голову одевать.

а написать правильно блок с ( перепроверкой наличия незакрытого именованного соединения в {конце лупа|перед открытием}) -- вопрос гигиены.

и ещё: столько сейвпойнтов (блоков обработки ошибок) в цикле -- это тоже не лучшая идея. иногда лучше задействовать fail_on_error = False, и обрабатывать значение FOUND . но в вашем случае жаль, что ошибку соединения нельзя так обойти. по крайней мере навскидку способа поднять соединение dblink без выбрасывания ошибки соединения наверх не видно.
15 май 19, 15:43    [21885443]     Ответить | Цитировать Сообщить модератору
 Re: запускаю процедуру и вешается сервак.  [new]
Maxim Boguk
Member

Откуда: Melbourne, Австралия
Сообщений: 3924
lr2
Итак, получилось смоделировать зависание.

Вернул обратно в цикл два дблинк и добавил счетчик, который увеличивается на 1 перед каждым дблинк

При этом
SELECT COUNT(*) FROM pg_stat_activity
30% то максимального.


Скажите, с чем связаны тормоза всего кластера, появляющиеся после 400+ дб линков?


А максимальное это сколько у вас? И что при этом интересного в логе базы пишется? (если пишется конечно).
15 май 19, 16:49    [21885554]     Ответить | Цитировать Сообщить модератору
 Re: запускаю процедуру и вешается сервак.  [new]
Maxim Boguk
Member

Откуда: Melbourne, Австралия
Сообщений: 3924
lr2
Но тоже случилось. Т.е. не только внутри функции но и внутри анонимного блока происходят эти странности.

Может быть какой-то баг встречался на эту тему?

Или есть какой-то ограничение на количество дблинков в запросе?


А сколько времени ваша процедура работает?

Если просто сделать begin; insert (что то там в my_table );
и не коммитя запрос просто оставить на сравнимое или несколько большее время относительно вашей функции
то не будет ли похожий эффект наблюдаться?

Т.е. может у вас там просто слишком долгая транзакция получается а dblink вообще не причем.

ps: это просто гипотеза... то что вы описываете - я раньше не слышал и не видел в живую так что придется скорее вам разбираться.
15 май 19, 17:41    [21885631]     Ответить | Цитировать Сообщить модератору
 Re: запускаю процедуру и вешается сервак.  [new]
lr2
Member

Откуда:
Сообщений: 31
Maxim Boguk
lr2
Итак, получилось смоделировать зависание.

Вернул обратно в цикл два дблинк и добавил счетчик, который увеличивается на 1 перед каждым дблинк

При этом
SELECT COUNT(*) FROM pg_stat_activity
30% то максимального.


Скажите, с чем связаны тормоза всего кластера, появляющиеся после 400+ дб линков?


А максимальное это сколько у вас? И что при этом интересного в логе базы пишется? (если пишется конечно).


Да не долго, минуты три.

В логе ничего не пишется, кроме того что запросы дольше секунды начинают и в лог падают.
16 май 19, 10:53    [21885997]     Ответить | Цитировать Сообщить модератору
 Re: запускаю процедуру и вешается сервак.  [new]
lr2
Member

Откуда:
Сообщений: 31
Maxim Boguk
lr2
Но тоже случилось. Т.е. не только внутри функции но и внутри анонимного блока происходят эти странности.

Может быть какой-то баг встречался на эту тему?

Или есть какой-то ограничение на количество дблинков в запросе?


А сколько времени ваша процедура работает?

Если просто сделать begin; insert (что то там в my_table );
и не коммитя запрос просто оставить на сравнимое или несколько большее время относительно вашей функции
то не будет ли похожий эффект наблюдаться?

Т.е. может у вас там просто слишком долгая транзакция получается а dblink вообще не причем.

ps: это просто гипотеза... то что вы описываете - я раньше не слышал и не видел в живую так что придется скорее вам разбираться.



Я по наячалу тоже думал что дело в этом, но если просто запустить большой SELECT он может выполняться и пол часа и час и подобного не возникает.

Это началось три дня назад, при этом раньше абсолютно та же процедура выполнялась без проблем, всего там было около 800 дблинков. Потом внезапно начались тормоза при ее выполнении.
16 май 19, 10:56    [21886001]     Ответить | Цитировать Сообщить модератору
Все форумы / PostgreSQL Ответить