|
|
|
Очень долгий update на 30М записей
|
|||
|---|---|---|---|
|
#18+
Все пытаюсь бороться с Postgresql, теперь встал вопрос оптимизации update на таблице с постоянным инсертом, после завершения будет около 150М кластеров. Сейчас медленно движемся в районе 35М. Возникают спайки такого плана: SQL (53712.7ms) UPDATE "cluster_addresses" SET "cluster_id" = 13801883 WHERE "cluster_addresses"."cluster_id" = $1 [["cluster_id", 14099291]] Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. Повторно ( видимо после попадания в кеш ) запрос выполняется моментально. Какие есть варианты оптимизации? Можно ли как-то прогрузить всю таблицу cluster_addresses в память? После 5 дней работы Postgresql жрет около 22GB RAM из 64. Вся база сейчас на отдельном SSD диске. Postgresql 9.5, конфиг: max_connections = 50 shared_buffers = 16GB effective_cache_size = 48GB work_mem = 335544kB maintenance_work_mem = 2GB max_wal_size = 2GB checkpoint_completion_target = 0.9 wal_buffers = 16MB default_statistics_target = 100 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.02.2016, 19:32 |
|
||
|
Очень долгий update на 30М записей
|
|||
|---|---|---|---|
|
#18+
Забыл еще про пару настроек: shared_buffers = 16GB temp_buffers = 16MB wal_level = minimal fsync = off synchronous_commit = off checkpoint_completion_target = 0.9 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.02.2016, 19:49 |
|
||
|
Очень долгий update на 30М записей
|
|||
|---|---|---|---|
|
#18+
nateless, http://www.postgresql.org/docs/current/interactive/pgprewarm.html http://raghavt.blogspot.com/2014/06/utilising-caching-contribs-pgprewarm.html ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.02.2016, 21:21 |
|
||
|
Очень долгий update на 30М записей
|
|||
|---|---|---|---|
|
#18+
vyegorov, не особо помогает: D, [2016-02-24T22:11:02.947670 #17639] DEBUG -- : SQL (5919.7ms) UPDATE "cluster_addresses" SET "cluster_id" = 12480109 WHERE "cluster_addresses"."cluster_id" = $1 [["cluster_id", 14255749]] Это после pg_prewarm ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2016, 00:12 |
|
||
|
Очень долгий update на 30М записей
|
|||
|---|---|---|---|
|
#18+
nateless, а скажите, больной перед смертью потел как часто вы там вот это вот всё апдейтите ? как--то постгресу плохо , когда индексы опухши, да ещё и холодные и они и данные т.ч. он любит, чтобы апдейтили без фанатизмуса. вот скоко оно страничек за 6 сек поднимает --- вывести буферсы не пробовали в експлейне ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2016, 02:07 |
|
||
|
Очень долгий update на 30М записей
|
|||
|---|---|---|---|
|
#18+
qwwq, ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Update on public.cluster_addresses (cost=0.56..749.71 rows=653 width=14) (actual time=611.142..611.142 rows=0 loops=1) Buffers: shared hit=28384 dirtied=8567 -> Index Scan using index_cluster_addresses_on_cluster_id on public.cluster_addresses (cost=0.56..749.71 rows=653 width=14) (actual time=611.140..611.140 rows=0 loops=1) Output: id, 8508905, address_id, ctid Index Cond: (cluster_addresses.cluster_id = 5495566) Buffers: shared hit=28384 dirtied=8567 Planning time: 0.035 ms Execution time: 611.157 ms Если честно то я еще не очень понимаю вывод про буфферы и что это значит :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2016, 14:21 |
|
||
|
Очень долгий update на 30М записей
|
|||
|---|---|---|---|
|
#18+
natelessqwwq, Код: sql 1. 2. 3. 4. 5. 6. 7. 8. Если честно то я еще не очень понимаю вывод про буфферы и что это значит :) переадресуем этот вопрос админам -- тут вегоров нам наверняка объяснит, как буферсы мапятся на страницы. и что означает тот факт, что для добычи 0 записей шириной 14 нам потребовалось поднять аж 28кило буферсов. в данном случае -- из кеша (hit) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2016, 14:41 |
|
||
|
Очень долгий update на 30М записей
|
|||
|---|---|---|---|
|
#18+
qwwq, В Postgres'е IndexScan означает, что доступ идёт не только к индексу, но и к таблице тоже. Всегда. Индекс хранит все вхождения `cluster_id = 5495566` в таблице, включая те, которые уже были удалены — видимость записей храниться в таблице. База получает все указатели от индекса, лезет в таблицу, чтобы увидеть — а эту запись другая сессия уже удалила, её показывать не надо. Причём под "удалить" попадает и UPDATE, т.к. физически в Postgres'е UPDATE = DELETE + INSERT. При таком некислом кол-ве буферов, я думаю что: - у вас много "удалённых" записей, которые есть в индексе, но уже были изменены другими сессиями - пока бежит запрос, он меняет битики записям (dirtied=8567), т.е. запрос нашёл ещё 8К буферов, на которых данные были изменены недавно и ваш запрос первый это увидел - активность сильная, autovacuum не успевает. пухнут и индексы, и таблицы. autovacuum вообще включен? что говорит: Код: sql 1. Думаю, что нужно настроить autovacuum очень агрессивно, пройтись VACUUM-ом по всем таблицам и перестроить индексы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2016, 15:01 |
|
||
|
Очень долгий update на 30М записей
|
|||
|---|---|---|---|
|
#18+
vyegorov, Да, изменения частые. Настройки автовакума не менял вообще: Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2016, 15:04 |
|
||
|
Очень долгий update на 30М записей
|
|||
|---|---|---|---|
|
#18+
vyegorov, вот да то, что оно для 0 записей 5 секунд шликает ssd -- наводит на именно такую мысль. Табла гигантская, не партицированная. наверняка вакуумится сутками. Могли и отключить, по недомыслию. При этом апдейтят, как не на пж. ПЖ он слабоват в коленках на такое. (ну вот есть за ним такая слабина) Для реидекса без останова -- максимову приблуду, наверное, надо поюзать. нет ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2016, 15:08 |
|
||
|
Очень долгий update на 30М записей
|
|||
|---|---|---|---|
|
#18+
nateless, длинные транзакции есть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2016, 15:27 |
|
||
|
Очень долгий update на 30М записей
|
|||
|---|---|---|---|
|
#18+
Alexius, Не много 90% выглядят примерно так Код: plsql 1. 2. 3. 4. 5. 6. 7. В случае если кластеры уже есть то идет запись к ним и обьединение через UPDATE которые подвисают. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2016, 15:30 |
|
||
|
Очень долгий update на 30М записей
|
|||
|---|---|---|---|
|
#18+
Сделал VACUUM FULL ANALYZE cluster_addresses; Все равно виснет: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2016, 15:32 |
|
||
|
Очень долгий update на 30М записей
|
|||
|---|---|---|---|
|
#18+
nateless, При этом это повторные запросы, тоесть я веду лог запросов от Rails, вижу что он занят 3с, в другом окне через пару секнуд делают его же аналайз и он все равно выполняется 3 секунды. Если сразу повторить его в той же сесси то уже моментально за ~ .5ms ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2016, 15:37 |
|
||
|
Очень долгий update на 30М записей
|
|||
|---|---|---|---|
|
#18+
nateless, насколько длинные? смотреть можно так например: Код: sql 1. покажите вывод Код: sql 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2016, 15:52 |
|
||
|
Очень долгий update на 30М записей
|
|||
|---|---|---|---|
|
#18+
nateless, А что выдаст такой запрос?Желательно запустить в `psql` с ключём `\x` (для построчного вывода): Код: 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. Я бы сделал так: 1. изменил настройки:namesettingautovacuum_max_workers20autovacuum_vacuum_cost_delay-1autovacuum_analyze_scale_factor0.05autovacuum_vacuum_scale_factor0.02log_autovacuum_min_duration1000vacuum_cost_delay5bgwriter_delay100bgwriter_lru_maxpages1000bgwriter_lru_multiplier5commit_delay5000commit_siblings3 2. перезапустил Postgres (перечитать конфиг не поможет) 3. сделал бы `VACUUM ANALYZE cluster_addresses` 4. Перестроил бы индекс: Код: sql 1. 2. 3. 5. Ещё раз `VACUUM ANALYZE cluster_addresses` И киньте `EXPLAIN (analyze, buffers)` после этого. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2016, 16:03 |
|
||
|
Очень долгий update на 30М записей
|
|||
|---|---|---|---|
|
#18+
vyegorov, Спасибо попробую, как только разберемся что с диском, не смогли выключить postgresql, полезли в логи там нашли кучу Feb 25 13:54:54 Ubuntu-1510-wily-64-minimal kernel: [1259419.134935] sd 3:0:0:0: [sdc] tag#7 FAILED Result: hostbyte=DID_OK driverbyte=DRIVER_TIMEOUT Feb 25 13:54:54 Ubuntu-1510-wily-64-minimal kernel: [1259419.134936] sd 3:0:0:0: [sdc] tag#7 CDB: Write(10) 2a 00 1a 16 29 90 00 05 40 00 Feb 25 13:54:54 Ubuntu-1510-wily-64-minimal kernel: [1259419.134937] blk_update_request: I/O error, dev sdc, sector 437660048 Feb 25 13:54:54 Ubuntu-1510-wily-64-minimal kernel: [1259419.134963] EXT4-fs warning (device sdc1): ext4_end_bio:332: I/O error -5 writing to inode 787752 (offset 0 size 0 starting block 547 07674) Видимо были проблемы с диском, hdparam не запустить виснет, сейчас общаемся с поддержкой на тему замены диска, не знаю на сколько повреждены данные, как восстановим будем дальше оптимизироваться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2016, 18:15 |
|
||
|
Очень долгий update на 30М записей
|
|||
|---|---|---|---|
|
#18+
авторМожно ли как-то прогрузить всю таблицу cluster_addresses в память select count(*) from table_name ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2016, 18:19 |
|
||
|
Очень долгий update на 30М записей
|
|||
|---|---|---|---|
|
#18+
ScareCrowselect count(*) from table_name Чтобы избежать вымывания буферного кэша выделяется ограниченное кол-во буфферов, которые циклично используются для сканирования (SeqScan, Vacuum, etc.). Можно проверить, запустив `EXPLAIN (analyze, buffers) SELECT * FROM big_table` и наблюдая как меняются blocks hit / blocks read. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2016, 18:43 |
|
||
|
Очень долгий update на 30М записей
|
|||
|---|---|---|---|
|
#18+
vyegorov, Заного проиндексировали все, заняло 3 дня, дошли до того-же уровня, спайки пока такие же примерно Диск загружен на 50% примерно: Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util sdc 0.00 113.20 3.20 2135.80 220.80 192240.00 179.95 43.58 21.03 57.00 20.98 0.27 57.68 Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util sdc 0.20 48.20 3.60 2089.40 184.00 137387.20 131.46 53.59 25.53 13.33 25.55 0.20 41.52 Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util sdc 0.00 46.00 5.60 2038.60 78.40 141438.40 138.46 52.25 25.63 0.43 25.70 0.21 42.64 Запрос выдал следующее: Код: plsql 1. 2. 3. 4. Сейчас обновлю конфиги по вакууму и посмотрю как дальше пойдет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.02.2016, 17:14 |
|
||
|
Очень долгий update на 30М записей
|
|||
|---|---|---|---|
|
#18+
natelessvyegorov, Заного проиндексировали все, заняло 3 дня, дошли до того-же уровня, спайки пока такие же примерно вот ничего не понятно. вы что--то о своём, о девичьем. что такое "уровень" ? какой он "такой же" ? а тем паче "спайки" -- может быть ещё и "рубцы" ? и что вы проиндексировали "за ногу" пишите битым словом: 1. "вставили столько того--то", 2."наапдейтили с тех пор, как отреидексили -- ещё 100500 раз" если 2--е -- перейдите на другую субд. или найдите чела, который нарисует вам архитектуру, в которой 100500 раз в большой табличке не апдейтятся. ибо это -- не для пж. (сходите на "Сравнение СУБД", там вам Йо расскажет, какой плохой пж, и хароши ара,) если не 2--е . -- я бы поискал долгие локи. и очереди на разделяемый ресурс. Но это -- именно если вы не делаете "2". Если делаете -- то кто же вам виноват? Пишите конкурентный (ручной) реиндекс в вечном цикле (с конкурентным же дропом предыдущих версий). Не взлетит, так поплавает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.02.2016, 17:34 |
|
||
|
Очень долгий update на 30М записей
|
|||
|---|---|---|---|
|
#18+
qwwq, Извиняюсь за ошибки. Я к тому что после замены жесткого диска мы начали процесс с нуля. После наполнения базы и начала нашего кластерного анализа, дошли до того же уровня кластеров как на момент предыдущих сообщений. После замены диска видим примерно такие же делеи при выполнении запросов. Что подтекстом говорит что прошлая проблема была не связана с багнутым жестким диском. Отписал я по инфе с запросом, сейчас после апдейта конфигов по вакуму пришлю новые данные, там уже будем думать. Стоит ли оставаться на PG или искать другие решения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.02.2016, 17:41 |
|
||
|
Очень долгий update на 30М записей
|
|||
|---|---|---|---|
|
#18+
nateless, а прикинуть на пальцах, сколько версий одной и той же записи вы наапдейчиваете [или наделет--наинсёрчиваете] в сутки -- вы можете ? как долго версия у вас живёт ? она, запись эта, принципиально все время переписывается ? или это просто так заливка организована, не подумав ? кончится -- и перестанете теребонькать ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.02.2016, 17:53 |
|
||
|
Очень долгий update на 30М записей
|
|||
|---|---|---|---|
|
#18+
qwwq, Так сложно сказать, всего есть 140М транзакций, в которых около 400М outputs которые мы кластеризуем. Сейчас при создании такой БД это разовая работа, дальше мы будем индексировать около 200.000 транзакций в сутки ( что дает около 600к новых outputs в сутки ). В дальнейшем БД используется как аналитика, выборка кластеров и прочее. Иногда планируется прогонять заного создание кластеров, а так же рекластеризацию определенных записей согласно новым паттернам. Сейчас идет огромное колличество создания и изменения кластеров, так как они образовываются учитывая наши паттерны, но учитывая обьемы данных при таких задержка в 3 секунды на апдейт кластера это займет слишком большее колличество времени. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.02.2016, 18:01 |
|
||
|
Очень долгий update на 30М записей
|
|||
|---|---|---|---|
|
#18+
nateless, Через буквально пару минут после адпейта конфига, замены индекса и vacuum: D, [2016-02-29T16:01:55.368858 #5592] DEBUG -- : SQL (1853.1ms) UPDATE "cluster_addresses" SET "cluster_id" = 2632320 WHERE "cluster_addresses"."cluster_id" = $1 [["cluster_id", 5073322]] Тот же запрос в psql меньше чем через минуту: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.02.2016, 18:04 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=39178133&tid=1997396]: |
0ms |
get settings: |
5ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
42ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
66ms |
get tp. blocked users: |
1ms |
| others: | 218ms |
| total: | 364ms |

| 0 / 0 |
