172 похожих чатов

Всем привет. Кто как борется с большим увеличением записи при заполнении

hint bits?
wiki.postgresql.org/wiki/Hint_Bits

В общих словах симптомы такие.
Есть таблица, в которую идёт постоянный upsert небольшими батчами. Доля update = 70% от insert, а батчи с update и insert всегда в разных транзакциях.
И если в неё только писать, то запись на диск минимальна.

Но стоит включить на этой таблице select-запросы по последним записанным данным, так сразу утилизация полосы записи на диск возрастает в ~15 раз.
По pg_stat_statements видно, что select сопровождается большим количеством dirtied-страниц (12% от read + hit, сами read и hit примерно равны). Однако прирост полосы записи на диск составляет не +12%, а 15 раз.

Какой процесс в основном пишет (по iotop):
wal_writer + checkpointer в разных соотношениях, но ещё и постгресовые читающие бэкэнды.
Но если bgwriter накрутить в активное состояние, то он становится безусловным лидером по объёму записи на диск. Конечно постгресовые читающие бэкэнды перестают при этом писать.

Если глянуть pg_waldump -z, то наибольший Combined size = 14% приходится на Type = XLOG.

Может кто посоветует какие доп. средства для диагностики?

Но если это из-за hint bits, то как можно снизить этот эффект?
Понятно, что вынос читающих запросов на реплику может решить проблему, но хочется более системно подойти к проблеме, а не лечить симптомы.

12 ответов

29 просмотров

вакуум поагрессивнее, чтобы успевал хинты проставить обратно до того как страницы на диск упали

Gennady-K Автор вопроса
Darafei Praliaskouski
вакуум поагрессивнее, чтобы успевал хинты простави...

😻 спасибо. А такое сильное увеличение записи - нормально?

Gennady K
😻 спасибо. А такое сильное увеличение записи - нор...

Ну если горячий датасет в шаред буфферс не влазит, то да, придётся жонглировать

Коллеги, я правильно понял, что SELECT может порождать dirtied-страницы? Я полагал, что только update/delete/truncate на это способны Буду благодарен, если тыкнете в документацию

Alex Yu
Коллеги, я правильно понял, что SELECT может порож...

Нет, select не порождает грязные страницы. Но может вызвать запись на диск в определенных случаях. Посмотрите здесь https://blog.okmeter.io/postgresql-exploring-how-select-queries-can-produce-disk-writes-f36c8bee6b6f или на Хабре цикл статей Егора Рогова для полного понимания ситуации

Valery
Нет, select не порождает грязные страницы. Но мож...

Спасибо Как раз обдумывал как же объяснить разработчику что тысяча апдейтов по одной строчке убивает систему И тут натыкаюсь на нечто мне самому неизвестное

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

Gennady-K Автор вопроса
Alex Yu
Коллеги, я правильно понял, что SELECT может порож...

Это по ссылке в сообщении и можете увидеть экспериментально

Gennady-K Автор вопроса
Ilya Anfimov
Кроме автовакуума поагрессивнее — можно если знает...

Поток апсертов никогда не заканчивается. Но как вариант подходит, конечно

Gennady-K Автор вопроса
Valery
Нет, select не порождает грязные страницы. Но мож...

Именно что порождает, но при определенных условиях. В Вашей ссылке это тоже указано. Попробуйте и увидите сами..

Gennady K
Именно что порождает, но при определенных условиях...

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

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта