The OpenNET Project
 
Поиск (ключи):    ПРОГРАММЫ СТАТЬИ СОВЕТЫ ФОРУМ
  WIKI НОВОСТИ (+) MAN'ы ДОКУМЕНТАЦИЯ

Ускорение загрузки дампа PostgreSQL на многоядерных системах
В бета версии PostgreSQL 8.4 в утилите pg_restore появилась поддержка возможности загрузки дампа 
в несколько параллельных потоков. Например, загрузка дампа базы размером 300 Гб
на 8-ядерном сервере
занимала стандартным образом 12 часов, при распараллеливании процесса загрузки на 8 потоков, 
время загрузи сократилось до 3 часов. Полная перезагрузка дампа базы может
понадобиться например при миграции
с PostgreSQL  8.2 на 8.3 или при переходе с 32- на 64-разрядную сборку системы.

Огромным плюсом является и то, что параллельный вариант pg_restore 
из ветки 8.4 прекрасно работает  с ветками 8.2 и 8.3.

Рассмотрим процесс миграции с 8.2 на 8.3. На рабочей машине дополнительно
установим в отдельную директорию бета версию 8.4:

   ./configure --prefix=/usr/local/pgsql84
   make
   make install 

Создаем дамп работающей базы PostgreSQL 8.2, использую утилиту pg_dump из состава  PostgreSQL 8.3:

   /usr/local/pgsql83/bin/pg_dump -F c -v -f my_db.dump my_database

В зависимости от конфигурации дополнительно может потребоваться сделать дамп ролей:

   /usr/local/pgsql83/bin/pg_dumpall -g -f my_roles.dump

Восстанавливаем роли:

   /usr/local/pgsql83/bin/psql -f my_roles.dump postgres

Запускаем процесс параллельного восстановления базы, число потоков задается
через опцию -j, в нашем случае
используется загрузка в 8 потоков. При указании большого числа потоков нужно
быть уверенным, что система
ввода/вывода не окажется узким местом, т.е. база размещена на высокопроизводительном хранилище:

   /usr/local/pgsql84/bin/pg_restore -F c -j 8 -v -C -f my_db.dump

Дополнительно можно упомянуть, что в рамках проекта EnterpriseDB ведется
разработка утилиты pg_migrator
(http://pgfoundry.org/projects/pg-migrator/), позволяющей осуществлять перенос
базы на новый сервер
без остановки работы СУБД. Но  pg_migrator к сожалению находится еще на стадии альфа тестирования.


Некоторые советы по оптимизации процесса создания дампа и его восстановления:

* Во время восстановления можно отключить fsync режим и autovacuum, значительно
увеличить размер памяти
(до 1 Гб если памяти много), заданный в параметрах конфигурации work_mem и maintenance_work_mem, 
при этом  размер wal_buffers и checkpoint_segments также нужно увеличить до 16 или 32 Мб;

* При наличии больших GIN или GiST индексов, время восстановления которых
нередко занимает 75% от всего времени
восстановления, если без этих индексов можно себе позволить немного поработать,
имеет смысл разделить
процесс восстановления на две стадии: восстановление первичных данных, запуск БД в продакшин, 
восстановление GIN или GiST индексов уже на работающей базе.

* Всегда следует использовать pg_dump из более новой версии PostgreSQL, а не из
старой, апгрейд которой производится.

* Для продакшин систем, время и наличие возможных подводных камней стоит предварительно оценить, 
выполнив тестовые dump/restore без остановки первичной базы;
 
14.05.2009 , Источник: http://it.toolbox.com/blogs/databas...
Раздел:    Корень / Программисту и web-разработчику / SQL и базы данных / PostgreSQL специфика / Оптимизация и администрирование PostgreSQL

Обсуждение [ Линейный режим | Показать все | RSS ]
 
  • 1.1, pavlinux, 02:01, 14/05/2009 [ответить] [смотреть все]
  • +/
    Звиняйте, но в исходниках написано

    /*
    03482  * Restore a single TOC item in parallel with others
    03483  *
    03484  * this is the procedure run as a thread (Windows) or a
    03485  * separate process (everything else).
    03486  */

    Про cpu_affinity/irq_affinity/cpu_mask там ни слова.

    Так что, многозадачность != многопроцессорность

     
     
  • 2.3, Аноним, 12:35, 14/05/2009 [^] [ответить] [смотреть все]
  • +/
    Ваша операционная система сама не в состоянии равномерно распределить нагрузку п... весь текст скрыт [показать]
     
     
  • 3.4, pavlinux, 16:24, 14/05/2009 [^] [ответить] [смотреть все]  
  • +/
    >> Про cpu_affinity/irq_affinity/cpu_mask там ни слова.
    >> Так что, многозадачность != многопроцессорность
    >
    >Ваша операционная система сама не в состоянии равномерно распределить нагрузку по процессорам ? как интересно... :)

    Процессы в SMP системе - стадо тупых мамонтов - идут равномерно, а не отдельно мелкие детишки, отдельно самцы с 5-метровыми бивнями, дабы случайно не придавили мелких.

    К примеру, в последних RealTime патчах, все ядреные процессы работают на 0 CPU,
    но остальные, так же, равномерно раскидываются.

    Не изучал на предмет динамической балансировки, но по-моему, её в ядре нет.
    Как при создании треда/форка/потока присвоился процессор/ядро, так он и не меняется до смерти. /* FIXME */

    Есть утиль taskset - но это не динамика. :(
      

     
     
  • 4.5, cubite, 18:19, 14/05/2009 [^] [ответить] [смотреть все]  
  • +/
    следует понимать, о linux-ядре идет речь?

    Предположим, имеем 2 ядра и 2 процесса, каждый из которых работает на "своем" ядре и пожирает 100% процессорного времени.
    Появляется 3-тий процесс, который в равной степени претендует на процессорное время. Т.е. на одном из ядер будем иметь load averages примерно 2.0.

    Не верится, что при завершении процесса, который самолично занимает одно ядро, на освободившееся ядро не будет перекинут один из оставшихся процессов.

     
     
  • 5.6, pavlinux, 21:21, 14/05/2009 [^] [ответить] [смотреть все]  
  • +/
    Чей-та я тебя не пойму, по сему сокращу

    Не верится,... что не будет перекинут... .

    То есть перекинется?


     
  • 4.7, Вовчик, 23:14, 14/05/2009 [^] [ответить] [смотреть все]  
  • +/
    Всё это звучит очень хорошо, но какое отношение оно имеет к данной теме?
    На многопроцессорной машине не будет прироста производительности при использовании многопоточности/многопроцессности в pg_restore?
     
     
  • 5.8, Аноним, 23:38, 14/05/2009 [^] [ответить] [смотреть все]  
  • +/
    Да нет, народ просто выпендривается не понимая что они щас клоуны на весь рунет ... весь текст скрыт [показать]
     
     
  • 6.9, pavlinux, 01:24, 15/05/2009 [^] [ответить] [смотреть все]  
  • +/
    >Да нет, народ просто выпендривается не понимая что они щас клоуны на
    >весь рунет. Спорить про потоки любимая для многих тема, даже если
    >они не понимают о каких потоках речь. Таких хлебом не корми,
    >дай поспорить что круче-pthread_start или fork безотносительно к задаче.
    >
    >Для Ъ объясню: тут о потоках данных речь а не о scheduling
    >entities ядра.

    Ну тогда  20 раз перечитай заголовок -
    "Ускорение загрузки дампа PostgreSQL на многоядерных системах"

    Прочёл? - Ни слова о многопоточности.

    Собственно к чему это я, да к тому, что как фишка ляжет,
    так ядро и распределит потоки/процессы, обычно равномерно,
    но не уверен что тоже самое будет на системе, которая
    дышит под нагрузкой в 64K соединений.



     
     
  • 7.10, Аноним, 08:46, 15/05/2009 [^] [ответить] [смотреть все]  
  • +/
    64к соединений к постгресу Сразу видно что ты с ним боевого опыта не имел С... весь текст скрыт [показать]
     
  • 7.11, Вовчик, 11:05, 15/05/2009 [^] [ответить] [смотреть все]  
  • +/
    Я перечитал заголовок...

    На многоядерной системе при восстановлении в один поток можно упереться в возможности одного ядра/процессора, а при многих потоках/процессах вероятно этого не произойдёт и нагрузка распределится более равномерно. Поправь меня, если я ошибаюсь, или прекрати разводить флейм.

     
     
  • 8.12, pavlinux, 15:12, 15/05/2009 [^] [ответить] [смотреть все]  
  • +/
    >На многоядерной системе

    Все гораздо веселее :)

    В ядре есть так называемые "Области планирования" - логическое множество процессоров.
    Например на 4-х процессорной системе - это множество с двумя подмножествами, по два CPU в каждом.

    С ними работает функция schedule() далее schedule_tick(), которая вызывает rebalance_tick()
    та смотрит флаги SCHED_IDLE или NOT_IDLE и на основании их вызывает load_balance();

    Вывод: Планировщику на...ать на процессы, он присвоит процессу первый свободный CPU

    P.S. Если процесс не запускать со специально сформированым флагом CPU_MASK,
    который явно ограничит область планирования для процесса, вплоть до одного CPU.

    P.P.S.

    1. Утиль pg_restore с флагом -j n - создаст n процессов для работы с базой.
    2. Эти процессы равномерно распределятся относительно ОБЩЕЙ нагрузки системы
    3. Но не обязательно, распределятся, раздельно на каждый процессор.

     
     
  • 9.13, Вовчик, 15:22, 15/05/2009 [^] [ответить] [смотреть все]  
  • +/
    Упоминание о linux я нашёл только в твоих сообщениях. Есть другие ядра...
    Почитай статью, она не о планировщике.

    Все твои твои сообщения в этом треде выглядят как "я видел исходники, но не понимаю о чем все здесь пишут".

     
  • 9.14, Одмин, 15:28, 15/05/2009 [^] [ответить] [смотреть все]  
  • +/
    Если нет свободных ядер то облом в любом случае. Даже ежу в этом топике ясно что ускорение будет только если есть свободные ресурсы сразу на нескольких ядрах.

    Ну и что что первый свободный присвоит. Главное что свободный.

     
     
  • 10.15, pavlinux, 15:39, 15/05/2009 [^] [ответить] [смотреть все]  
  • +/
    >Ну и что что первый свободный присвоит. Главное что свободный.

    А свободный может быть и один :)


     
  • 1.2, pavlinux, 02:04, 14/05/2009 [ответить] [смотреть все]  
  • +/
    Тут  http://doxygen.postgresql.org/pg__restore_8c.html и дальше по коду
     

    Ваш комментарий
    Имя:         
    E-Mail:      
    Заголовок:
    Текст:

     Добавить заметку
     Версия для печати
     
     Поиск заметки:
     

    Последние заметки
    - 12.05 Организация шифрованного бэкапа с помощью rdiff-backup, encfs и Dropbox
    - 11.05 Настройка беспроводного соединения в Debian GNU/Linux
    - 07.05 Использование Google Drive в Linux
    - 18.04 Использование нескольких сетевых стеков в Linux
    - 15.04 Восстановление стандартного KDE меню после его удаления (например, wine)
    - 11.04 Настройка gmirror при использовании GPT во FreeBSD 9
    - 09.04 Маршрутизатор на базе FreeBSD с приоритизация трафика средствами PF и ALTQ
    - 02.04 Частичное восстановление данных MySQL из бэкапа, созданного с использованием LVM
    - 21.03 Настройка DNSSEC в BIND 9.9
    - 17.03 Набор номера на Cisco IP Phone 7960/7940 из скрипта
    RSS | Следующие 15 записей >>


    ПОДПИШИСЬ НА ЖУРНАЛ Linux Format 2012!

    Журнал "Linux Format" (Линукс Формат)- Единственный в России и странах СНГ журнал на русском языке, посвящённый Linux и свободному ПО. Журнал для IT-директоров, IT-менеджеров, программистов, системных администраторов, учителей школ и преподавателей ВУЗов и всех пользователей ПК. В каждом выпуске: Новости индустрии OpenSource, обзоры новинок свободного ПО, обучающие и методические статьи.

    Каждый, кто оформит подписку, получает бонусы и подарки- объёмные наклейки на системный блок, диск с архивом номеров за 2005-2011 г.г. и ежемесячно электронную версию журнала в pdf-формате.

    Оформить подписку на год


      Закладки на сайте
      Проследить за страницей
    Created 1996-2012 by Maxim Chirkov  
    ДобавитьРекламаВебмастеруГИД  
    RUNNet TopList