powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / запускаю процедуру и вешается сервак.
21 сообщений из 21, страница 1 из 1
запускаю процедуру и вешается сервак.
    #39813501
lr2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
lr2
Гость
Добрый день.

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

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




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

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




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




Подскажите, как сделать чтобы выполнение процедуры в тестовой БД не мешало работе промышшленным БД в том же кластере?
...
Рейтинг: 0 / 0
запускаю процедуру и вешается сервак.
    #39813504
Фотография mefman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lr2Подскажите, как сделать чтобы выполнение процедуры в тестовой БД не мешало работе промышшленным БД в том же кластере?
драйвера поставить, как минимум
...
Рейтинг: 0 / 0
запускаю процедуру и вешается сервак.
    #39813507
lr2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
lr2
Гость
mefmanlr2Подскажите, как сделать чтобы выполнение процедуры в тестовой БД не мешало работе промышшленным БД в том же кластере?
драйвера поставить, как минимум

Драйвера чего?
...
Рейтинг: 0 / 0
запускаю процедуру и вешается сервак.
    #39813509
Фотография mefman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lr2mefmanпропущено...

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

Драйвера чего?
для рук и мозгов. Поскольку вы никаких данных больше не дали...
...
Рейтинг: 0 / 0
запускаю процедуру и вешается сервак.
    #39813513
lr2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
lr2
Гость
Вот такая функция:



Код: 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.
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 ;




Она запускается в тестовой БД, а тормозить начинает промышленная.
...
Рейтинг: 0 / 0
запускаю процедуру и вешается сервак.
    #39813520
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lr2,

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

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

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

PPPS: еще возможно окончание лимита коннектов к кластеру базы (если баз у вас много а max_connections мало).
...
Рейтинг: 0 / 0
запускаю процедуру и вешается сервак.
    #39813535
lr2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
lr2
Гость
Maxim Boguklr2,

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

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

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

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


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

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

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

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




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

разве тогда бы не падал весь кластер с ntstatus.h исключением?
...
Рейтинг: 0 / 0
запускаю процедуру и вешается сервак.
    #39813548
lr2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
lr2
Гость
Maxim Boguk,

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

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

Если LIMIT 200 - примерно на 150-м начинаются жуткие тормоза!!!
...
Рейтинг: 0 / 0
запускаю процедуру и вешается сервак.
    #39813570
lr2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
lr2
Гость
Maxim Boguk,

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


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


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

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



Может быть на функцию какие-то ограничения по рессурсам имеются?
...
Рейтинг: 0 / 0
запускаю процедуру и вешается сервак.
    #39813579
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и ещё момент:
[quot lr2]
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
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;



похоже на многократное (пере)открытие (неименованного) соединения в лупе.
они ж (неименованные), как я помню (можете ,впрочем, перепроверить сами, могло что-то измениться), не враз закроются. и все висят до конца сеанса, недоступные к закрытию.
переоткрывайте (и явно закрывайте) "одно" "именованное" соединение и делайте все "в нем".
...
Рейтинг: 0 / 0
запускаю процедуру и вешается сервак.
    #39813595
lr2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
lr2
Гость
lr2Maxim Boguk,

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


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


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

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



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

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

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

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

При этом SELECT COUNT(*) FROM pg_stat_activity покажывает 30% от максимального количества.
...
Рейтинг: 0 / 0
запускаю процедуру и вешается сервак.
    #39813597
lr2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
lr2
Гость
[quot qwwq]и ещё момент:
lr2
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
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;



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


так сложно отлавливать эксэпшны, когда неудачная попытка соединения.
Попробую как вы сказали сделать.
По идее коннект должен оставться висеть на клиентской БД, но его там нет.
...
Рейтинг: 0 / 0
запускаю процедуру и вешается сервак.
    #39813611
lr2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
lr2
Гость
Итак, получилось смоделировать зависание.

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

Код: 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.
...
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+ дб линков?
...
Рейтинг: 0 / 0
запускаю процедуру и вешается сервак.
    #39813619
lr2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
lr2
Гость
При использовании анонимного блока зависание случилось на 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
Выполнение отменено!




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

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

Или есть какой-то ограничение на количество дблинков в запросе?
...
Рейтинг: 0 / 0
запускаю процедуру и вешается сервак.
    #39813633
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lr2так сложно отлавливать эксэпшны, когда неудачная попытка соединения.

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

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

и ещё: столько сейвпойнтов (блоков обработки ошибок) в цикле -- это тоже не лучшая идея. иногда лучше задействовать fail_on_error = False, и обрабатывать значение FOUND . но в вашем случае жаль, что ошибку соединения нельзя так обойти. по крайней мере навскидку способа поднять соединение dblink без выбрасывания ошибки соединения наверх не видно.
...
Рейтинг: 0 / 0
запускаю процедуру и вешается сервак.
    #39813686
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lr2Итак, получилось смоделировать зависание.

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

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


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

А максимальное это сколько у вас? И что при этом интересного в логе базы пишется? (если пишется конечно).
...
Рейтинг: 0 / 0
запускаю процедуру и вешается сервак.
    #39813724
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lr2Но тоже случилось. Т.е. не только внутри функции но и внутри анонимного блока происходят эти странности.

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

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

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

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

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

ps: это просто гипотеза... то что вы описываете - я раньше не слышал и не видел в живую так что придется скорее вам разбираться.
...
Рейтинг: 0 / 0
запускаю процедуру и вешается сервак.
    #39813917
lr2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
lr2
Гость
Maxim Boguklr2Итак, получилось смоделировать зависание.

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

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


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

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

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

В логе ничего не пишется, кроме того что запросы дольше секунды начинают и в лог падают.
...
Рейтинг: 0 / 0
запускаю процедуру и вешается сервак.
    #39813920
lr2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
lr2
Гость
Maxim Boguklr2Но тоже случилось. Т.е. не только внутри функции но и внутри анонимного блока происходят эти странности.

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

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

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

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

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

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


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

Это началось три дня назад, при этом раньше абсолютно та же процедура выполнялась без проблем, всего там было около 800 дблинков. Потом внезапно начались тормоза при ее выполнении.
...
Рейтинг: 0 / 0
запускаю процедуру и вешается сервак.
    #39822315
lr2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
lr2
Гость
Проблема актуальна.

Решения не нашел.

Пока думаю что это какая-нибудь память в винде забивается.




Есть ли какие-нибудь другие объяснения такому поведению постгресса?
...
Рейтинг: 0 / 0
запускаю процедуру и вешается сервак.
    #39822421
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwqlr2так сложно отлавливать эксэпшны, когда неудачная попытка соединения.

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

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

и ещё: столько сейвпойнтов (блоков обработки ошибок) в цикле -- это тоже не лучшая идея. иногда лучше задействовать fail_on_error = False, и обрабатывать значение FOUND . но в вашем случае жаль, что ошибку соединения нельзя так обойти. по крайней мере навскидку способа поднять соединение dblink без выбрасывания ошибки соединения наверх не видно.

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


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