|
Vacuum Full без полного лока таблицы
|
|||
---|---|---|---|
#18+
[quot Andron]Maxim Bogukпропущено... Так давайте определимся что кэш ФС является посредником между диском и структурой PostgreSQL которая определяется через параметр shared_buffers. Т.е. вначале данные запрашиваются пользователем в базе, затем PostgreSQL если их не находит в shared_buffers то читает с диска, но не напрямую а используя посредника - кэш ФС. И данные эти опят таки помещает из кэша ФС в shared_buffers для дальнейшей обработки и передачи пользователю. Еще раз выделю свое предположение: PostgreSQL не управляет данными в файловом кэше ОС, только в кэше определенном как shared_buffers. Если это так то имеем интересное следствие с т.з. производительности дискового IO. Самое интересное следствие выходит если отдать около 50% под shared buffers. В итоге есть шанс получить ситуацию когда у вас данные лежат в 2х местах в памяти и эффективный размер кеша будет половина от наличной памяти. Из этого следует что по хорошему под shared buffers имеет смысл отдавать или 20-25% или 75-80% наличной памяти (предполагая что сервер выделен исключительно под базу). Из моего опыта оба варианта на 8.3+ вполне работоспособны а какой из них даст большую производительность очень сильно зависит от конкретного проекта. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2010, 11:19 |
|
Vacuum Full без полного лока таблицы
|
|||
---|---|---|---|
#18+
Maxim Boguk, Вообще напрашивается такой вопрос: а зачем дополнительно кэшировать данные базы, ведь это приводит к накладным расходам и снижению надежности. Кажется это называется Direct IO и как раз позволяет избежать использования кэширования на уровне ОС в случае использования файлов для базы. Речь идет именно про файлы а не raw device, с которыми подобной проблемы не возникает, но и PostgreSQL их не поддерживает вроде бы. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2010, 11:29 |
|
Vacuum Full без полного лока таблицы
|
|||
---|---|---|---|
#18+
AndronВообще напрашивается такой вопрос: а зачем дополнительно кэшировать данные базы, ведь это приводит к накладным расходам и снижению надежности. Кажется это называется Direct IO и как раз позволяет избежать использования кэширования на уровне ОС в случае использования файлов для базы. Речь идет именно про файлы а не raw device, с которыми подобной проблемы не возникает, но и PostgreSQL их не поддерживает вроде бы.Насчет надежности - не согласен, а насчет накладных расходов... При первом приближении - кажется да, но если подумать, то L3/L2/L1 cache в процессорах зачем-то сделан? Это к тому, что вообще говоря - надо читать, похоже, уже mailing lists, для ответа на вопрос. Я могу предположить, что это сделано для автоматического распределения ресурсов между процессорами... То есть когда у вас на одной машине стоят и Pg и Apache, то неизвестно - что больше будет читать данные Apache или Pg. И что эффективнее кешировать - файлы для Apache или файлы для Pg. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2010, 11:38 |
|
Vacuum Full без полного лока таблицы
|
|||
---|---|---|---|
#18+
AndronMaxim Boguk, Вообще напрашивается такой вопрос: а зачем дополнительно кэшировать данные базы, ведь это приводит к накладным расходам и снижению надежности. Кажется это называется Direct IO и как раз позволяет избежать использования кэширования на уровне ОС в случае использования файлов для базы. Речь идет именно про файлы а не raw device, с которыми подобной проблемы не возникает, но и PostgreSQL их не поддерживает вроде бы. До 8.3 Postgres очень плохо работал с обьемами shared memory большими чем 1gb. Поэтому так или иначе приходилось использовать кеш ОС. Сейчас эта проблема устранена в основном (не до конца на самом деле... остались некоторые внутренние накладные расходы которые линейно от обьема shared memory растут), и разговоры о direct IO ведутся но общее мнение разработчиков таково: текущая схема работы работает вполне прилично и пока никто еще не предоставил test case и результаты где бы direct IO давало бы выйгрыш в скорости работы и смысла в этом направлении двигатся нет (во всяком случае пока нет спонсоров которые бы это оплатили). ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2010, 11:46 |
|
Vacuum Full без полного лока таблицы
|
|||
---|---|---|---|
#18+
WarstoneНасчет надежности - не согласен, а насчет накладных расходов... При первом приближении - кажется да, но если подумать, то L3/L2/L1 cache в процессорах зачем-то сделан? В процессорах есть двойное кэширование? Потому что в случае с PostgreSQL имеем как раз двойное кэширование. А в IBM например думаете дураки сидят когда придумали использовать DirectIO для файлов базы? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2010, 11:48 |
|
Vacuum Full без полного лока таблицы
|
|||
---|---|---|---|
#18+
AndronWarstoneНасчет надежности - не согласен, а насчет накладных расходов... При первом приближении - кажется да, но если подумать, то L3/L2/L1 cache в процессорах зачем-то сделан? В процессорах есть двойное кэширование? Потому что в случае с PostgreSQL имеем как раз двойное кэширование. А в IBM например думаете дураки сидят когда придумали использовать DirectIO для файлов базы?L3/L1 cache. L3 от 256Кб до 2Мб сейчас, L1 32/64Кб. Читайте доки. А в IBM сидят не дураки (Причем тут IBM?) просто ИМХО считалось что их СУБД будет одна на железе. Для Пг-же считалось что на этом-же железе будет крутиться еще и веб-сервер или еще чего... И в этом случае использование кеша ОС - оправданно. Если хочется поведения а-ля IBM - ставьте shared_buffers в 70-80%. ЗЫ: Предлагаю дальнейшую дискуссию выделить в отдельную тему. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2010, 11:52 |
|
Vacuum Full без полного лока таблицы
|
|||
---|---|---|---|
#18+
Я бы даже сказал не "двойное" а дублирующее кэширование. Насчет надежности такой схемы: она однозначно ненадежна при записи . База пишет данные в лог, пишет их в файл данных и считает что они уже на диске. А они всего то попали в файловый кэш ФС и неизвестно когда они будут реально записаны на диск . Это конечно не касается супер навороченных дисковых стоек с батарейками, но вполне имеет место проблема для недорогих серверов. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2010, 11:55 |
|
Vacuum Full без полного лока таблицы
|
|||
---|---|---|---|
#18+
К модератору: если вас не затруднит, пожайлуста, отделите вопросы касащиеся shared buffers/direct IO из этой темы в отдельную. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2010, 12:02 |
|
Vacuum Full без полного лока таблицы
|
|||
---|---|---|---|
#18+
AndronЯ бы даже сказал не "двойное" а дублирующее кэширование. Насчет надежности такой схемы: она однозначно ненадежна при записи . База пишет данные в лог, пишет их в файл данных и считает что они уже на диске. А они всего то попали в файловый кэш ФС и неизвестно когда они будут реально записаны на диск . Это конечно не касается супер навороченных дисковых стоек с батарейками, но вполне имеет место проблема для недорогих серверов.Читайте мануалы. Для этого fsync придуман. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2010, 14:06 |
|
Vacuum Full без полного лока таблицы
|
|||
---|---|---|---|
#18+
Warstone... Читайте мануалы. Для этого fsync придуман. Читал, параметр действует на запись буфера write ahead log на диск при выполнении коммита в базе: сервер ждет когда буфер лога будет действительно записан на диск и только после этого коммит считается выполненным. Конечно это решает проблему с надежностью. However, using fsync results in a performance penalty: when a transaction is committed, PostgreSQL must wait for the operating system to flush the write-ahead log to disk . Но одновременно снижает производительность. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2010, 15:28 |
|
Vacuum Full без полного лока таблицы
|
|||
---|---|---|---|
#18+
Andron, "Но одновременно снижает производительность." - использование жестких дисков вообще снижает производительность.) ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2010, 15:31 |
|
Vacuum Full без полного лока таблицы
|
|||
---|---|---|---|
#18+
Maxim Boguk... Сейчас эта проблема устранена в основном (не до конца на самом деле... остались некоторые внутренние накладные расходы которые линейно от обьема shared memory растут), и разговоры о direct IO ведутся но общее мнение разработчиков таково: текущая схема работы работает вполне прилично и пока никто еще не предоставил test case и результаты где бы direct IO давало бы выйгрыш в скорости работы и смысла в этом направлении двигатся нет (во всяком случае пока нет спонсоров которые бы это оплатили). Набрав в гугле "Direct IO performance" можно сразу найти ссылки на статьи почему ведущие разработчики СУБД используют его в своих базах. А PostgreSQL разработчики сомневаются что оно полезно :) Так что думаю тут дело не в test case а в ресурсах самих разработчиков. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2010, 15:44 |
|
Vacuum Full без полного лока таблицы
|
|||
---|---|---|---|
#18+
Misha Tyurin, Обычно выделенный "диск" под вал-лог все вопросы "производительности" снимет. // ну и плюс правильно выставленные параметры "сброса" буферов, то что про чекпоинты. вот в тему: http://it.toolbox.com/blogs/database-soup/rhel-6-and-the-return-of-wal_sync_method-42931?rss=1 http://www.westnet.com/~gsmith/content/postgresql/TuningPGWAL.htm http://archives.postgresql.org/pgsql-hackers/2010-11/msg00226.php - тут надо всю ветку полистать. а вот кое-что про чекпоинты: http://www.depesz.com/index.php/2010/11/03/checkpoint_completion_target/ ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2010, 15:48 |
|
Vacuum Full без полного лока таблицы
|
|||
---|---|---|---|
#18+
Misha TyurinMisha Tyurin, Обычно выделенный "диск" под вал-лог все вопросы "производительности" снимет. совсем свалюсь в оффтопик ;) в случае скажем 4 дисков какая конфигурация будет предпочтительнее? raid 10 под data+wal или raid 1 под data + raid 1 под wal? в случае 6 и более дисков тот же самый вопрос - есть ли смысл делать отдельный raid 1 под wal? мне кажется выгоднее иметь один более быстрый массив, чем пару независимых помедленнее. ps: речь в первую очередь про сервера, соответсвенно подразумевается использование рейд-контроллеров с bbu. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2010, 16:01 |
|
Vacuum Full без полного лока таблицы
|
|||
---|---|---|---|
#18+
eddie, суть в том, что вы ничего от direct io для вал-лога по факту не получаете, кроме общих потенциальных проблем с ним связанных. ну а про директ ио для страниц - это перебор, на мой взгляд. операционка с файловой системой и всякими алгоритмами опережающего чтения и еще что там есть - всё должны сделать очень хорошо и быстро. тесты бы возможно прояснили бы конечно картину. хотя у "ораклов" как я понимаю всё это делает сервер БД. -- про конфигурацию райдов, надо прикидывать. у меня сейчас зеркало из двух винтов под вал и четыре диска в десятке под базу. ничего не меряли - просто так получилось) ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2010, 16:18 |
|
Vacuum Full без полного лока таблицы
|
|||
---|---|---|---|
#18+
Andron Если ты думаешь, что люди делающие PG делают что-то не так - возьми и помоги, если есть острое желание, время, силы и знания. Что сложного? Вот Maxim Boguk так и поступил. Maxim Boguk Насколько добавляется I/O при таком, ленивом вакууме? Можно как-то лимитировать по этому параметру? Насколько оцениваете надежность - на фронтальной базе запустить можно? А то опять эти дампы-копи-пасты между 4-мя серваками :( eddie Без знания специфики задачи что-то посоветовать нельзя. Если грубо, то мало коммитов/много чтений, то лучше один массив. Если много коммитов, то лучше отдельный массив под WAL. Надо знать профиль нагрузки на БД. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2010, 16:28 |
|
Vacuum Full без полного лока таблицы
|
|||
---|---|---|---|
#18+
AlexeyNP Maxim Boguk Насколько добавляется I/O при таком, ленивом вакууме? Можно как-то лимитировать по этому параметру? Насколько оцениваете надежность - на фронтальной базе запустить можно? А то опять эти дампы-копи-пасты между 4-мя серваками :(Если сравнивать с VACUUM FULL, то, теоретически, "не на много больше", но тут только тесты покажут. Лимитировать по IOPSам пока нельзя, но планируется, насколько я понял. Про надежность - пусть сам автор скажет, я туда пока-что не сильно залез. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2010, 16:42 |
|
Vacuum Full без полного лока таблицы
|
|||
---|---|---|---|
#18+
Misha Tyurinсуть в том, что вы ничего от direct io для вал-лога по факту не получаете, кроме общих потенциальных проблем с ним связанных. понятное дело, wal у нас в общем-то небольшой ну а про директ ио для страниц - это перебор, на мой взгляд. операционка с файловой системой и всякими алгоритмами опережающего чтения не уверен, для БД более характерен случайный доступ, всякие ухищрения ОС тут скорее всего будут мешать. наоборот, СУБД знает что она делает - index scan или seq scan, соответственно и есть смысл в учреждающем чтении или нет. AlexeyNPБез знания специфики задачи что-то посоветовать нельзя. Если грубо, то мало коммитов/много чтений, то лучше один массив. Если много коммитов, то лучше отдельный массив под WAL. Надо знать профиль нагрузки на БД. а как обосновать выделенное? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2010, 16:51 |
|
Vacuum Full без полного лока таблицы
|
|||
---|---|---|---|
#18+
AlexeyNPБез знания специфики задачи что-то посоветовать нельзя. Если грубо, то мало коммитов/много чтений, то лучше один массив. Если много коммитов, то лучше отдельный массив под WAL. Надо знать профиль нагрузки на БД. а как обосновать выделенное?[/quot] Логически - на этот массив не будет идти I/O по чтению основных данных БД. Практически - было у меня пара проектов, где выделенный массив под WAL давал прирост скорости - шла работа с большими кусками текстовых данных (документы). На практике, обычно, не удается найти достаточно лишних дисков, чтобы соорудить из них WAL-массив, так что проще все закинуть в один кусок RAID-10 и пусть ось+контроллер все сами разруливают. Ну и в среднем если по профилю нагрузки смотреть - если много коммитов, то это основной профиль БД, и нет смысла его отделять, а если много чтений, то аналогично. Так что, наверное, то что в цитате, это скорее пожелание, а не правило - т.е. если можно, то лучше выделить, но не критично. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2010, 17:45 |
|
Vacuum Full без полного лока таблицы
|
|||
---|---|---|---|
#18+
eddie, скан индекса - дело похоже и правду довольно "произвольное" - но это очень мало переборов. или я не прав? могу и ошибится. а секскан (в широком смысле, любой перебор страниц таблицы) - это последовательный перебор, сначала выстраиваем порядок (сортировка полученных указателей на страницы) а потом бежим. -- если у нас много пишущих транзакций, то нам надо их все фсинкать. сколько позволяет делать записей в секунду современный диск? а) без кеша рейда с батарейкой (может он сглаживает пики через кеш) б) с кешом рейда в) как зависит кол-во возможных записей в секунду от конфигурации рейда? может ли рейд писать быстрее чем один голый диск? мне кажется что нет, это я вывожу из определения рейд 0. можно и обсудить. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2010, 18:01 |
|
Vacuum Full без полного лока таблицы
|
|||
---|---|---|---|
#18+
Misha Tyurin, в) поправляюсь, если он может писать параллельно куски данных - то похоже имеем серьезное увеличение скорости по кол-ву винтов в рейде 0 ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2010, 18:05 |
|
Vacuum Full без полного лока таблицы
|
|||
---|---|---|---|
#18+
AlexeyNPЕсли много коммитов, то лучше отдельный массив под WAL. Надо знать профиль нагрузки на БД.Всегда казалось что если много INSERT/UPDATE операций, а не COMMIT, так как I/U операции вроед так-же в WAL оседают, даже если потом был роллбек... Поправьте меня, если я не прав. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2010, 19:14 |
|
Vacuum Full без полного лока таблицы
|
|||
---|---|---|---|
#18+
сколько позволяет делать записей в секунду современный диск? Смотрите среднее время поиска сектора (seek time) для диска. Среднее кол-во иопсов будет как 1/ на это время. Для типичных SATA HDD дисков около 100. У серверных вариантов HDD числа будут выше в разы, до 2-3. а) без кеша рейда с батарейкой (может он сглаживает пики через кеш) б) с кешом рейда От батарейки скорость не зависит, важен режим записи - write-back (блок считается записанным после записи в кэш контролёра) или write-through (... на диск). Прирост будет, а на сколько - зависит от типа нагрузки. в) как зависит кол-во возможных записей в секунду от конфигурации рейда? может ли рейд писать быстрее чем один голый диск? мне кажется что нет, это я вывожу из определения рейд 0. можно и обсудить. Опять всё зависит от типа нагрузки. Для "разбросанных" IO (random, scattered read/write) и последовательных IO большими блоками RAID0 в идеале удваивает кол-во иопсов. RAID1 удваивает максимум до 2х иопсы на scattered чтение (диски везде считаем одинаковыми). Это называется расслоением блочного устройства и различные комбинации RAID0/1/JBOD как раз используются для повышения иопсов. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2010, 00:48 |
|
Vacuum Full без полного лока таблицы
|
|||
---|---|---|---|
#18+
AlexeyNP Andron Если ты думаешь, что люди делающие PG делают что-то не так - возьми и помоги, если есть острое желание, время, силы и знания. Что сложного? Вот Maxim Boguk так и поступил. Maxim Boguk Насколько добавляется I/O при таком, ленивом вакууме? Можно как-то лимитировать по этому параметру? Насколько оцениваете надежность - на фронтальной базе запустить можно? А то опять эти дампы-копи-пасты между 4-мя серваками :( IO добавляется приблизительно столько же сколько от vacuum full было бы (+/- 2 раза от ситуации в таблице зависит). По IO лимитировать можно... смотрите параметры: --pages-per-round= (сколько страниц чистить за 1 цикл вызова хранимки) по умолчанию 10 --delay= (сколько в секундах ждать после каждой пачки в --pages-per-round принимает float по умолчанию - 0) --delay-ratio - наиболее полезный для целей лимитирования нагрузки параметр... работает он следующим образом: смотрится за сколько обработалось последняя --pages-per-round= пачка страниц, после спит (время обработки предыдущей пачки)*--delay-ration времени, умолчательное значение 2 (это позволяет одному и тому же скрипту нормально работать и в пиковую нагрузку и ночью в минимуме нагрузки... так как чем медленее идет основной процесс тем больше будут паузы между вызовами... я в при эксплуатации видел до 10 раз разницы в скорости между дневной и ночной работой). Умолчательные настройки (не быстро но не создавая большой нагрузки на сервер): --pages-per-round=10 --delay-ratio=2 Настройки упаковать любой ценой максимально быстро: --pages-per-round=100 --delay-ratio=0 (ставить больше 100 в --pages-per-round=100 не стоит начинаются накладные расходы и с 1000 уже в 1.5 раза медленее идет... меньше 10 тоже не стоит ставить пока нет реализации через DBD::Pg или managed psql). Обязательно стоит посмотреть на то чтобы у вас vacuum_cost_delay был в базе так настроен чтобы вызов vacuum не вызывал перегрузки дисковой системы, так как скрипт в процессе работы делает обычный vacuum таблицы до 20 раз. Система тестировалась на ОЧЕНЬ нагруженных базах моих клиентов (список тут: http://mboguk.moikrug.ru/) на очень разных серверах и структурах таблиц. Проблем выявлено не было (лучше не забывать делать svn up перед использованием так как выявленные сложности я оперативно исправяю). Потери или повреждения данных не было ни разу, 1 раз возникла перегрузка дисковой системы в дневное время (после чего собственно и появилась автоподстройка нагрузки через --delay-ratio). Комментарии по результатам использования приветствуются. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2010, 06:00 |
|
Vacuum Full без полного лока таблицы
|
|||
---|---|---|---|
#18+
eddieнаоборот, СУБД знает что она делает - index scan или seq scan, соответственно и есть смысл в учреждающем чтении или нет. http://www.postgresql.org/docs/current/static/runtime-config-resource.html#GUC-EFFECTIVE-IO-CONCURRENCY PG всё это умеет, и O_DIRECT и posix_fadvise. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2010, 09:46 |
|
|
start [/forum/topic.php?fid=53&msg=37016411&tid=1995575]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
46ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
others: | 16ms |
total: | 155ms |
0 / 0 |