|
Разогнать применение WAL на реплике (странное происходит)
|
|||
---|---|---|---|
#18+
Коллеги, нужен ваш совет, что-то не понимаю, что происходит. Дано : в Hetzner стоят две совершенно одинаковые машины AX41-NVMe. На обеих PostgreSQL 12/Ubuntu 20.04. Первая -- мастер, настраивал исходя из паттерна OLTP-нагрузки, с подстроенным вакуумом. На ней вся логика, все обновления, вставки, всё вот это вот. Нагрузка +- равномерная по времени суток и дням недели. Примерно так выглядит в pgtop: Код: plaintext 1. 2. 3. 4. 5. 6. 7.
Вторая -- физическая реплика первой + на ней веб-морда с недо-аналитикой и некоторые простые, но длительные запросы выполняюся через dblink, настраивал как OLAP. Выглядит так: Код: plaintext 1. 2. 3. 4.
Из необычного: и там, и там используется zfs с включённым сжатием: Код: plaintext 1. 2. 3. 4. 5. 6.
Кроме того, так как zfs -- это copy-on-write, отключены Код: plaintext
Код: plaintext
Размер базы 372 Гб. ПРОБЛЕМА : Реплика при почти полном отсутствии нагрузки не успевает применять WAL-логи на базу. Сеть исключил, количество файлов в каталоге мастера -- 138, слейва -- 1568, и это число растёт, но медленно, примерно 350 файлов в сутки. При этом логи применяются, проверял. Сейчас отставание реплики от мастера 8 часов и 2 минуты, и это время растёт, примерно на 4..5 секунд в минуту. Не понимаю даже, куда смотреть. Мастер нагружен, и там всё ок, слейв свободен, но не успевает. Что ещё: на слейве включен Код: plaintext
Дайте, пожалуйста, наводку: куда посмотреть, где почесать. Началось примерно дней 5 назад, как мне кажется, на пустом месте. Примерно две недели назад тюнил на мастере autovacuum. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2020, 15:26 |
|
Разогнать применение WAL на реплике (странное происходит)
|
|||
---|---|---|---|
#18+
flashgun, Для начала top -S первые строк 20 на реплике покажите причем подождите 10 секунд чтобы статистика накопилась побольше. Тогда и можно будет гипотезы выдвигать. И покажите отличия конфига базы на мастере и на реплике у вас. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.07.2020, 18:08 |
|
Разогнать применение WAL на реплике (странное происходит)
|
|||
---|---|---|---|
#18+
Maxim Boguk, Вот top -S: Код: plaintext 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.
А вот отличия реплики от мастера: Код: plaintext 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. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93.
Там, где в начале строки ">" -- это мастер. Где "<" -- реплика. Сегодня уже 2236 wal-файлов на слейве, на мастере 156. Почитал про то, что реплика применяет логи в один поток, поэтому так медленно. Есть даже средство борьбы: https://github.com/joyent/pg_prefaulter -- но с моим скудным пониманием экосистемы go запустить не удалось: жалуется на невозможность подключения к агенту. Плюс, списался с Константином Книжником по поводу его патча двухлетней давности: https://www.postgresql-archive.org/WAL-prefetch-td6024900.html по его словам, интерес к этой теме недавно возник снова: https://www.postgresql.org/message-id/flat/226b5950-7404-a51d-8dc7-53895b363a38@pgmasters.net#6ee015f86ddc1c235f7086af4f4fa103 но мне надо сперва понять, в этом ли проблема. Спасибо, Максим, буду рад наводкам, куда ещё посмотреть! ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2020, 14:30 |
|
Разогнать применение WAL на реплике (странное происходит)
|
|||
---|---|---|---|
#18+
flashgun, А что на реплике показывает iostat -xmd 1 (десяток-другой отсчетов)? У меня сильное подозрение что все таки беда в zfs в которой я не сильно большой специалист. Потому что обычно если упирается в проигрывание WAL то у вас или %IO под 80% будет и диски не справляются или recovery процесс postgresql в 100% cpu сидит (а у вас он только 5% занимает). Если есть возможность я бы поднял реплику на таком же железе но на ext4 без сжатия и посмотрел бы. Может у zfs где то есть настройки больше потоков или процессора ей выдать. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2020, 17:26 |
|
Разогнать применение WAL на реплике (странное происходит)
|
|||
---|---|---|---|
#18+
Maxim Boguk, Код: plaintext 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. 79.
Два диска собраны в страйп (raid0). Скорость важна, RTO/RPO -- нет. Ну, я пока склоняюсь к версии, изложенной здесь: https://github.com/joyent/pg_prefaulter https://github.com/joyent/pg_prefaulter PostgreSQL’s streaming-based replication system is based on "log-shipping:" the WAL is streamed to remote hosts. Database replicas apply the changes listed in the instructions within the WAL using the PostgreSQL crash recovery mechanism: they read the log from beginning to end, find the changes to the underlying datafiles (the "PostgreSQL Heap", or "Heap" for short) and make the relevant changes to the database files. The replica’s WAL-apply operation is performed in a single process, using a single thread . Each time a WAL-entry is "consumed" as the replica reads in the corresponding page of the underlying datafile. The WAL-replay process on the replica waits for the serial execution of disk I/O to complete and load the underlying page(s) from the heap. Unlike the primary, the follower lacks the ability to spread its work across multiple processes . As a consequence, the replicas only perform single-process, single-threaded, blocking IO, and cannot apply the WAL as quickly as the primary who generates the WAL files and are using parallel IO. To add insult to injury, the follower is prone to having its filesystem cache fault, resulting in a physical disk IO, further slowing down the apply process. Получается, что, в отличие от Мастера, который накатывает логи не из WAL-файлов на диске, а из кеша операционной системы, к тому же в несколько потоков, реплика вынуждена их (WAL) брать всё-таки с диска и в один поток с блокирующим в/в. Так я это понял, по крайней мере. Не очень понятно, что мешает receiver-у точно также при записи попадать в кеш ОС, а recovery из этого кеша и читать. Ну, разве что да, один поток. И ещё понятен выигрыш при HDD, но у меня то аж NVMe... Посмотрю параметры zfs в части настройки под постгрес, тем более, что там есть, что настраивать: https://github.com/timescale/timescaledb/issues/638 https://gist.github.com/saurabhnanda/5258207935bf23cd112be292d22f00d5 Спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2020, 19:47 |
|
Разогнать применение WAL на реплике (странное происходит)
|
|||
---|---|---|---|
#18+
flashgun, реплика тоже может с кеша брать если его хватает но да там блокирующий IO в один поток... и скорее всего zfs добавляет такую задержку что реплику не справляется (именно изза задержек на IO при сжатии-разжатии). кстати у zfs свой кеш не тот что у обычных FS и у вас он явно не настроен... потому что у вас там 40G free а должно быть не так очевидно... так что у вас два пути (можно оба пробовать) 1)настойку кеша zfs 2)попробовать на реплике 48GB (а то и 56gb) shared buffers поставить чтобы база кешировала все что можно у себя только обязательно с huge pages on вариант 2 проверить 15 минут займет.. и понаблюдать час-два не стало ли быстрее фактически что мастер что реплика у вас работают как сервера не с 64gb памяти а с 16-18gb сейчас ... |
|||
:
Нравится:
Не нравится:
|
|||
27.07.2020, 21:51 |
|
Разогнать применение WAL на реплике (странное происходит)
|
|||
---|---|---|---|
#18+
Maxim Boguk, спасибо за совет! База, правда, запускалась 23 минуты, но при первом приближении количество WAL-сегментов начало уменьшаться. Сейчас их 3089 (было 3103 на момент останова базы). Продолжаю наблюдение. Скажите, есть ли смысл на основном сервере включить huge pages и увеличить размер shared_buffers? Там похожая картина: вечно свободно 20+ гигабайт ОЗУ. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2020, 01:46 |
|
Разогнать применение WAL на реплике (странное происходит)
|
|||
---|---|---|---|
#18+
flashgun, При тех настройках zfs что у вас сейчас - скорее всего да имеет. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2020, 08:54 |
|
Разогнать применение WAL на реплике (странное происходит)
|
|||
---|---|---|---|
#18+
Maxim Boguk 2)попробовать на реплике 48GB (а то и 56gb) shared buffers поставить чтобы база кешировала все что можно у себя только обязательно с huge pages on Супер, похоже, что это помогло! Количество WAL медленно, но верно уменьшается, уже 1100 (было 3100). ... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2020, 09:48 |
|
Разогнать применение WAL на реплике (странное происходит)
|
|||
---|---|---|---|
#18+
flashgun что мешает receiver-у точно также при записи попадать в кеш ОС, а recovery из этого кеша и читать Вы ещё упускаете момент, что писать-читать надо не только сами WAL. Если там целиком страница данных (первое изменение после чекпойнта, full page writes) то может и ладно. Но на каждый чих в wal писать целиком страницу - это очень много wal. А если из wal читаем не целиком страницу, а дельту изменения на ней - то сперва надо достать страницу данных которую меняем, её поменять и пометить dirty. Если в shared_buffers нужной странички нет - просим у ОС прочитать. А ОС уже может достать из своего page cache, но с которым у вас похоже что-то очень не так. (я так же по zfs не специализируюсь) Я если ещё и bgwriter и чекпойнтер не справляются со сбросом dirty страниц - то сам startup их будет ещё и писать на диск чтобы расчистить места в shared_buffers для изменяемой в данный момент страницы. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.07.2020, 11:04 |
|
Разогнать применение WAL на реплике (странное происходит)
|
|||
---|---|---|---|
#18+
Melkij, Спасибо за уточнения! С кешем zfs всё действительно не так просто: почему-то у меня его объём 1,3..1,5 Гб, должно при нормальных условиях быть в разы больше. Но, в любом случае мне проще увеличить shared_buffers, чем разбираться с zfs: я погуглил, у большинства прямо противоположная проблема: arc забирает всю память, и люди вынуждены ограничивать объём кеша сверху. Вот один из немногих примеров схожей с моей проблемы: https://www.reddit.com/r/zfs/comments/98klp2/zfs_arc_size_not_increasing/ - и советы окружающих "zfs/arc виднее". Тем более, что shared_buffers быстро и понятно помогло: за сутки количество WAL уменьшилось до 625, а задержка с 53 тысяч секунд до 5900. Спасибо, коллеги! ... |
|||
:
Нравится:
Не нравится:
|
|||
29.07.2020, 02:01 |
|
|
start [/forum/topic.php?fid=53&fpage=24&tid=1994555]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
39ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
others: | 294ms |
total: | 424ms |
0 / 0 |