Форум программистов, компьютерный форум, киберфорум
PostgreSQL
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
2 / 2 / 1
Регистрация: 12.06.2022
Сообщений: 44

Postgres - непонятные фризы

12.06.2022, 20:34. Показов 1867. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
При выполнении запроса к Postgres SQL иногда запрос может зависать на 18 - 40 секуннд. Проблема возникла когда обновили ПО Ubuntu Sercer 20 Postgres 12-13-14(на всех версиях). На версиях Ubuntu Sercer 18 Postgres 11 - проблемы не было.

Сначала был подозрение на балансер npgsql. Написали свой балансер - всё тоже самое.

Есть функция которая вызывается web сервером и выполняется в postgres за микросекунды. Всё выполняется в пределах одной машины. Но иногда запрос подвисает до 40 секунд.
Картинка с Wireshark. Из неё видно что всё происходит быстро до момента отсылки команды. Сервер присылает что он выполнил DISCARD ALL и Z - готов к следующей команде. А потом завис на 18 секунд и только после прислал ответ на остальную часть запроса. Так не должно быть!

Далее в postres через запрос статистики pg_stat_statements было получено максимальное время выполнения этой функции за все вызовы - 6 микросекунд.

Куда копать уже не знаю. Все места которые можно был протестировать были проверены и отброшены. Остался сам TCP/IP стек в Ubuntu - но Web сервер работает без проблем. Значит не он. И получается что что то глючит внутри postgres. Но как это проверить не знаю.

Может кто сталкивался с таким?
Миниатюры
Postgres - непонятные фризы  
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.06.2022, 20:34
Ответы с готовыми решениями:

Непонятные фризы
Всем привет Уважаемые господа! В общем обновил свой ПК, карточкой 1060 G-1 Gaming на 6гб ( кстати под вопросом стоит ли брать 1070?) ...

Непонятные фризы
Конфигурация моего PC: CPU: AMD Athlone II x3 450 3.2GHz GPU: Geforce 9500 gt ОЗУ: Kingstone 1333 GHz 2х2гб БП: 550w ...

Непонятные фризы
Добрый день, форум. Вообщем после сборки пк сталкнулся с такой проблемой как фриз на 2-4 секунды, он очень редкий но очень мешает. Самое...

10
1267 / 980 / 385
Регистрация: 02.09.2012
Сообщений: 3,027
13.06.2022, 16:25
Начните с анализа блокировок pg_locks. Снимайте вывод этого представления во времени с какой-то периодичностью и смотрите что и как блокируется в процессе выполнения.
0
2 / 2 / 1
Регистрация: 12.06.2022
Сообщений: 44
13.06.2022, 16:57  [ТС]
Lock - смотрел. Нету его.

Пока расследование привело к тому что пауза вызвана скорее всего прогревом кеша.

Также сейчас установлен Postgres 14 и идёт сбор статистики. Пауза в нём была раз при старте. Потом вроде не наблюдалась.
До этого тестировали на всех версиях, в основном 12 - там глюки были постоянны. Было такое ощущение что в 12 версии кеши при неиспользовании удалялись из RAM. Но из за того что постоянно что то крутили - игрались с настройками, с keppalivе на стороне сервера, клиента, и прочие эксперименты - трудно было понять что вообще не работает.

Отладка выглядила феерично - через SSH и tcpdump удалённо снифили трафик между БД и веб сервером. К самому WEB серверу через SSH удалённо в режиме отладки был подключён дебагер. .net core позволяет такие извращения. Одновременно логи в файл и в БД слал WEB сервер. Которые в режиме реального времени просматривали через SFTP. Новый балансер был обложен профайелером который тоже скидывал свои логи. Мониторили количество каналов - активных, в куче и прочее. Одновремнно смотрели показатели Linux - загрузка процессора, памяти и прочее - короче чёрт ногу сломит.

Топик создал для того - может кто знает как залогировать весь запрос в постгресе полностью? Всё остальное уже под наблюдением. Потому как вроде - туже загрузку с диска данных в RAM он вроде не учитывает в pg_stat_statements.
0
1267 / 980 / 385
Регистрация: 02.09.2012
Сообщений: 3,027
13.06.2022, 23:41
Тогда надо смотреть планы запросов. Причем желательно с прогретым буферным кэшем (shared_buffers) и нет, чтобы видеть разницу.
Планы смотреть с доп. опциями:
SQL
1
EXPLAIN (ANALYZE, BUFFERS, WAL, TIMING) SELECT ...
1
2 / 2 / 1
Регистрация: 12.06.2022
Сообщений: 44
15.06.2022, 22:01  [ТС]
Проблема не ушла. Также наблюдается периодические фризы.

Удалось словить сбойный запрос от Web сервера. И почти одновременно сделать такой же запрос из отладчика SQL Manager с припиской EXPLAIN (ANALYZE, BUFFERS, WAL, TIMING) SELECT ...

Оба запроса зависли на 50 секунд. И проблема не в прогревании буферов - SQL активен сутки.

EXPLAIN вернул следующее:

ProjectSet (cost=0.00..5.28 rows=1000 width=32) (actual time=54698.607..54698.610 rows=3 loops=1)
Buffers: shared hit=69, local hit=3 dirtied=1 written=1
WAL: records=5 bytes=374
-> Result (cost=0.00..0.01 rows=1 width=0) (actual time=0.001..0.002 rows=1 loops=1)
Planning Time: 0.025 ms
Execution Time: 54698.635 ms
Пауза в 50 секунд

При этом нормально этот запрос выполняется так:
ProjectSet (cost=0.00..5.28 rows=1000 width=32) (actual time=1.475..1.478 rows=3 loops=1)
Buffers: shared hit=63 dirtied=4, local hit=3 dirtied=1 written=1
WAL: records=5 fpi=4 bytes=27374
-> Result (cost=0.00..0.01 rows=1 width=0) (actual time=0.002..0.002 rows=1 loops=1)
Planning Time: 0.037 ms
Execution Time: 1.507 ms
Честно говоря - мне это ни о чём не говорит.

Wireshark опять показал уже обычную картину:
Никих ошибок в запросах - просто ответ зависает на 50 секунд на стороне postgres.

При этом проблема была в 2 отдельных каналах - SQL Manager устанавливал свой канал, Web сервер свой. Отсюда отметаем проблему что что то не так с конкретным каналом.

Куда копать не пойму. Вот реально бесит - всё написанное своё работает как часы. Как возьмёшь что то чужое - всё глючит. И ничего с этим не поделаешь. И при этом работают же на postgres тысячи и не жалуются.

Добавлено через 10 минут
тут сказано что EXPLAIN не может пролезть внутрь функции. Собственно мне ничего и не показало кроме общего времени с которого мне ни холодно ни жарко. Буду искать как пролезть внутрь.

Добавлено через 9 минут
Попробую такую штуку auto-explain
0
1267 / 980 / 385
Регистрация: 02.09.2012
Сообщений: 3,027
16.06.2022, 00:37
Так а что за функция-то вызывается?? Можете сам запрос еще показать и текст функции??
Да, auto-explain в помощь и обязательно включить log_nested_statements
0
2 / 2 / 1
Регистрация: 12.06.2022
Сообщений: 44
16.06.2022, 01:28  [ТС]
Да запрос простой select * my_func(a,b,c);

Да и функция вроде ничего криминального. Выложу - может у меня глаз замылен и я чего то не вижу.

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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
CREATE OR REPLACE FUNCTION core.statistic__get (
  var_sites INTEGER,
  var_day TIMESTAMP,
  var_week TIMESTAMP,
  var_month TIMESTAMP
)
RETURNS TABLE (
  log_day INTEGER,
  reg_day INTEGER,
  reg_week INTEGER,
  reg_month INTEGER
) AS
$body$
DECLARE
    var_users INTEGER;
    /*---*/
    var_log_day INTEGER;
    /*---*/
    var_reg_day INTEGER;
    var_reg_week INTEGER;
    var_reg_month INTEGER;
BEGIN
    CREATE TEMP TABLE IF NOT EXISTS SITE_STATISTIC (
        log_day INTEGER,
        reg_day INTEGER,
        reg_week INTEGER,
        reg_month INTEGER
    ) ON COMMIT DELETE ROWS;
    /****/
    TRUNCATE SITE_STATISTIC;
    /****/
    FOR var_n IN 0..var_sites LOOP
        /***Day***/
        SELECT COALESCE(SUM(login),0)
        INTO var_log_day
        FROM core.statistic_login
        WHERE date>var_day AND site=var_n;
        
        /***Day***/
        SELECT COALESCE(SUM(reg),0)
        INTO var_reg_day
        FROM core.statistic_reg
        WHERE date>var_day AND site=var_n;
        
        /***Week***/
        SELECT COALESCE(SUM(reg),0)
        INTO var_reg_week
        FROM core.statistic_reg
        WHERE date>var_week AND site=var_n;
        
        /***Month***/
        SELECT COALESCE(SUM(reg),0)
        INTO var_reg_month
        FROM core.statistic_reg
        WHERE date>var_month AND site=var_n;
        
        /***Insert***/
        INSERT INTO SITE_STATISTIC (log_day,reg_day,reg_week,reg_month)
        VALUES (var_log_day,var_reg_day,var_reg_week,var_reg_month); 
    END LOOP;
 
    /******Get all users****/
    INSERT INTO SITE_STATISTIC (log_day,reg_day,reg_week,reg_month)
    VALUES ((SELECT COUNT(*) FROM core.user),0,0,0);
    
    /*---*/
    RETURN QUERY SELECT * FROM SITE_STATISTIC;
END
$body$
LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY DEFINER
PARALLEL UNSAFE
COST 100 ROWS 1000;
 
ALTER FUNCTION core.statistic__get (var_sites INTEGER, var_day TIMESTAMP, var_week TIMESTAMP, var_month TIMESTAMP)
  OWNER TO postgres;
0
1267 / 980 / 385
Регистрация: 02.09.2012
Сообщений: 3,027
16.06.2022, 02:12
Ну тут смотреть планы через auto-explain.
Сложно предположить на каком из выражений база спотыкается.

Может быть связано с транзакциями из предыдущего топика.
TRUNCATE на этом может спотыкаться... Будет ждать возможности очищения после предыдущего вызванного SELECT FROM site_statistic (SELECT выставляет ACCESS SHARE блокировку, TRUNCATE не может продолжать, пока такая блокировка висит на таблице)
1
107 / 68 / 29
Регистрация: 22.04.2022
Сообщений: 233
16.06.2022, 06:37
Цитата Сообщение от dev_usr Посмотреть сообщение
Да и функция вроде ничего криминального. Выложу - может у меня глаз замылен и я чего то не вижу.
Может переписать Вашу функцию без использования временных таблиц, как-то вот так...
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
CREATE OR REPLACE FUNCTION core.statistic__get (
  var_sites INTEGER,
  var_day TIMESTAMP,
  var_week TIMESTAMP,
  var_month TIMESTAMP
)
RETURNS TABLE (
  log_day INTEGER,
  reg_day INTEGER,
  reg_week INTEGER,
  reg_month INTEGER
) AS
$body$
SELECT *
FROM (
    SELECT  COALESCE(SUM(login),0)
            ,COALESCE(SUM(reg) FILTER(WHERE r.date>var_day),0)
            ,COALESCE(SUM(reg) FILTER(WHERE r.date>var_week),0)
            ,COALESCE(SUM(reg) FILTER(WHERE r.date>var_month),0)
    FROM    generate_series(0,var_sites) var_n
            LEFT JOIN core.statistic_login l ON (l.site = var_n AND l.date > var_day)
            LEFT JOIN core.statistic_reg  r ON (r.site = var_n AND r.date > var_month)
    GROUP   BY var_n
    ORDER   BY var_n
)
UNION   ALL
SELECT  COUNT(*),0,0,0
FROM    core.user;
$body$
LANGUAGE 'sql'
VOLATILE
CALLED ON NULL INPUT
SECURITY DEFINER
PARALLEL UNSAFE
COST 100 ROWS 1000;
1
2 / 2 / 1
Регистрация: 12.06.2022
Сообщений: 44
16.06.2022, 12:37  [ТС]
Цитата Сообщение от grgdvo Посмотреть сообщение
TRUNCATE на этом может спотыкаться...
Проблема наблюдалась и без TRUNCATE

Добавлено через 5 минут
Цитата Сообщение от fte65 Посмотреть сообщение
Может переписать Вашу функцию без использования временных таблиц, как-то вот так...
Спасибо.

Существующая функция написана так сказать в стиле обычного программирования. Заводим массив. Складируем данные. Отдаём массив. Но в postgres для массива строк походу есть только временные таблицы - которые походу несут на себя бремя основных таблиц. И все оверхеды связанные с этим.

Мне тоже не очень нравится использование временной таблицы - и я постоянно касился на неё, т.к. выглядила наиболее подозрительным местом в функции.
Обязательно попробуем ваш вариант. Но для начала попробую разобраться - с существующим. Надо понять, что же именно в нем не работает.
0
2 / 2 / 1
Регистрация: 12.06.2022
Сообщений: 44
24.06.2022, 19:14  [ТС]
fte65,
Попробовал ваш вариант функции и он не совсем корректно работает. А именно дело в этих двух JOIN
SQL
1
2
LEFT JOIN core.statistic_login l ON (l.site = var_n AND l.date > var_day)
LEFT JOIN core.statistic_reg  r ON (r.site = var_n AND r.date > var_month)
вот это COALESCE(SUM(login),0) выдавало результат больше чем надо. Всё из-за второго LEFT JOIN core.statistic_reg

Переделал под такой вариант. Всё заработало корректно.
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
CREATE OR REPLACE FUNCTION core.statistic__get (
  var_sites INTEGER,
  var_day TIMESTAMP,
  var_week TIMESTAMP,
  var_month TIMESTAMP
)
RETURNS TABLE (
  log_day INTEGER,
  reg_day INTEGER,
  reg_week INTEGER,
  reg_month INTEGER
) AS
$body$
BEGIN
    RETURN QUERY SELECT *
    FROM (  
        SELECT 
            (SELECT COALESCE(SUM(login),0)::INTEGER FROM core.statistic_login WHERE site=var_n AND date>var_day),
            (SELECT COALESCE(SUM(reg),0)::INTEGER FROM core.statistic_reg WHERE site=var_n AND date>var_day),
            (SELECT COALESCE(SUM(reg),0)::INTEGER FROM core.statistic_reg WHERE site=var_n AND date>var_week),
            (SELECT COALESCE(SUM(reg),0)::INTEGER FROM core.statistic_reg WHERE site=var_n AND date>var_month)
        FROM generate_series(0,var_sites) var_n
        GROUP BY var_n
        ORDER BY var_n
    ) AS _
    UNION ALL SELECT COUNT(*)::INTEGER,0,0,0 FROM core.user;
END
$body$
LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY DEFINER
PARALLEL UNSAFE
COST 100 ROWS 1000;
 
ALTER FUNCTION core.statistic__get (var_sites INTEGER, var_day TIMESTAMP, var_week TIMESTAMP, var_month TIMESTAMP)
  OWNER TO postgres;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.06.2022, 19:14
Помогаю со студенческими работами здесь

Непонятные фризы
Комп уже не новый, может и полетело что, но хочу разобраться с чем именно проблема. Проц Athlon X4 760k мать MSI A78 G41 видюха 1050я....

Непонятные фризы продолжение
Конфигурация моего PC: CPU: AMD Athlone II x3 450 3.2GHz GPU: Geforce 9500 gt ОЗУ: Kingstone 1333 GHz 2х2гб БП: 550w ...

Внезапные и непонятные фризы
Добрый день, уважаемые форумчане, как 4 месяца я уже мучаюсь с назревшей проблемой на моем пк - фризы. Они меня преследует и не дают...

Непонятные фризы компьютера
Всем доброго времени суток! Где то две недели назад столкнулся с проблемой которая до сих пор выносит мне мозг. Хелп ми а то я скоро сума...

Непонятные редкие фризы
Всем привет, после сборки компьютера столкнулся с такой проблемой как редкий фриз на 3-4 секунды. Конфиг: проц: amd ryzen 3 2200g...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru