налаштування postgresql для великої кількості барана


29

У мене є два однакові сервери (з точки зору апаратури), вони обидва стандартні установки Windows Server 2008 r2, з встановленим мінімальним програмним забезпеченням (в основному мій код та потрібні речі, такі як jvm тощо).

На одному сервері я запускаю сервер sql 2005, на другому сервері postgresql 9.1. Різниця в продуктивності б / п цих двох серверів приголомшлива, на postgresql це так погано, що я шкодую про свою первинну промову "давайте використовувати postgresql замість того, щоб платити за ліцензію сервера sql" моєму начальнику. Ми говоримо про різниці 30 секунд проти 15 хвилин для однієї команди, і це не лише ця одна команда, це будь-який запит чи команда, яку я кидаю на неї. Вони обидва мають однакові дані (записи були вставлені в різному порядку), і обидві бази даних мають абсолютно однакову структуру / індекси тощо.

Але я сподіваюся, що це лише питання настройки продуктивності. Справа в тому, що сервер sql в значній мірі використовує всі 32 гіги оперативної пам’яті на сервері, тоді як postgresl не використовує нічого, безумовно, менше, ніж концерт, хоча я насправді не зрозумів це до дрібниць.

Як змусити postgresql використовувати 20+ концертних балів? Ці сервери були побудовані спеціально для цієї бази даних, тому будь-яка оперативна пам’ять, яка не використовується базою даних та підтримуючими процесами, на мою думку, даремно.


4
Ви щось змінили до початкової настройки? Крок 1: SET effective_cache_size=18G;(налаштування за замовчуванням є надзвичайно низьким) BTW: якщо припустити, що це 64-бітна машина (без PTE)

1
Ти насправді не даєш нам достатньо, щоб багато допомогти. Окрім "повільно", ми не знаємо багато про ваш набір даних, про те, як ви отримуєте доступ до нього, які типи запитів, як правило, працюють повільно, що ви вже зробили, щоб настроїти (і, можливо, неправильно налаштувати) ваш сервер. Хек, на машині Linux з великою кількістю ядер та каналів пам'яті ви можете отримати шалену продуктивність задовго до того, як встановите postgresql. Ви пов'язані процесором чи IO? Які налаштування за замовчуванням у вас уже є? Які запити повільні?
Скотт Марлоу

2
Postgres не "використовує таран" так, як ви говорите про нього. Він покладається на кеш сторінок файлової системи ОС для більшої частини кешування, тому під час перегляду використання оперативної пам’яті в системі, що працює з postgres, ви зазвичай бачите багато ГБ, які використовуються буферами / кешем ОС, та окремими процесами резервного копіювання постгресів, використовуючи лише кілька до кілька десятків МБ кожен.
dbenhur

1
Дивіться це посилання: tekadempiere.blogspot.ae/2014/09 / ... і знайти свій ресурс на основі значення конфігураційного тут: pgtune.leopard.in.ua
Sajeev

пов'язане питання, можливо, цікавить: stackoverflow.com/questions/47311485/…
mountainclimber

Відповіді:


41

Існує багато налаштованих констант, ініціалізованих через postgres.conf. Найважливіші з них:

  • max_connections: кількість паралельних сеансів
  • work_mem : максимальний об'єм пам'яті, який буде використовуватися для проміжних результатів, таких як хеш-таблиці, і для сортування
  • shared_buffers об'єм пам'яті, виділений на "закріплений" буферний простір.
  • effective_cache_size об'єм пам'яті, що передбачається використовувати буферами LRU ОС.
  • random_page_cost : оцінка відносної вартості шуканих дисків.

max_connectionsне повинні встановлюватися вище, ніж потрібно, з'єднання коштують ресурсів навіть у режимі очікування; у більшості випадків зв’язок витратить більше часу на очікування всередині, ніж очікування на вулиці. (за ціною одночасності) Приємною формулою правила є "кількість шпинделів + кількість процесорів + X"

work_memє складним: може застосовуватися до кожного підзапиту, тому запит з 5 HASHJOINSможе коштувати 5 * work_mem. А для найгірших сценаріїв слід також подумати про кілька сеансів, які споживають цю суму (знову ж таки, причину залишатись max_connectionsнизькою).

shared_buffersє (ІМХО) завищеною. Зазвичай рекомендується встановити його приблизно на 1/4 ... 1/2 всієї доступної "вільної" пам'яті, але я схильний тримати її низькою та встановлювати effective_cache_sizeвсю наявну "вільну" пам'ять.

random_page_costце вартість пошуку + читання на диску. Це відносно значення sequential_disk_cost, яке дорівнює 1. За замовчуванням (4) для random_page_costсучасних машин та мережевого сховища встановлено занадто високий рівень, зазвичай він може бути знижений між 2 і 1.x. На SSD-дисках ви навіть встановили його на 1,0, оскільки пошук на SSD майже безкоштовний.


Відмінно! Я ніколи не бачив значення ефективної_cache_size, завжди обдурив її лише спільними_буферами. Це дійсно мало величезну зміну. Я також запускаю pgtune, і він рекомендував використовувати 20GB з 96 для shard_buffers, але 64GB для ефективної_cache_size. Спасибі!

1
FWIW, я переглянув ці та інші налаштування, запропоновані в документах Postgres, і зробив аналіз для нашого сервера .
mlissner

Дуже дякую за відповідь. Чи можу я запитати, що рекомендується work_mem, коли значення за max_connectionsзамовчуванням 100, а оперативна пам’ять сервера - 32 ГБ (виділений сервер після пошти)? Я знав, що мені потрібно це налаштувати самостійно на основі щоденних запитів. Мені просто цікаво, чи можете ви сказати мені значення "один розмір, який відповідає всім відповідям" (або значення початкової точки). 50MB занадто великий? Дуже дякую.
sgon00

Це залежить від типових одночасних дій на вашій машині. 100 сесій , які бажають 50М (на вершині їх 10..20M) кожен може вміститися. Або, може, і ні. Щоб отримати враження, відстежуйте vmstat або top. Плюс: це залежить від вашого запиту (та інших). Подивіться лише на плани.
wildplasser

@wildplasser дякую вам за швидку відповідь. Я знайшов цікавий веб-сайт pgtune.leopard.in.ua . Я думаю, що я буду використовувати 40 МБ як вихідну точку від його пропозиції та налаштування на основі цього. Ура.
sgon00

20

Спробуйте використовувати pgtune, щоб допомогти вам налаштувати конфігурацію PostgreSQL. Від PgFoundry:

pgtune приймає wimpy за замовчуванням postgresql.conf і розширює сервер баз даних настільки ж потужний, як і апаратне забезпечення, на яке він розгорнувся.

Конфігурація PostgreSQL за замовчуванням дуже консервативна, і цей інструмент призначений для допомоги у цій точній ситуації. Документація легко читається, а використання інструменту досить просто.

Майте на увазі, що не потрібно використовувати точні пропозиції pgtune. Гра з його налаштуваннями та перегляд отриманих змін у файлі conf допоможе вам краще зрозуміти конфігурацію PostgreSQL та спосіб її налаштування вручну.


8
Останнє оновлення pgtune було в 2009 році, це було 5 років тому і досі рахується. Мені цікаво, чи все ще він дійсний для серії 9.1-9.2-9.3.
sorin

9
pgtune тепер доступна в Інтернеті
Alfabravo

3

Якщо кожен запит чи команда працює повільно, я підозрюю, що:

  • ви підключаєтесь до бази даних для кожного запущеного запиту;
  • ви налаштували якийсь метод аутентифікації, який не працює, і він зупиняє ваші запити, поки не вичерпається цей конкретний метод аутентифікації.

Скажіть, будь ласка, скільки часу потрібно для запуску запиту select version()? Якщо слід миттєво (0,16 мс на моїй робочій станції).


2

Якщо ВСЕ запит полягає в тому, що набагато повільніше щось страшенно неправильно з сервером чи щось. На моєму досвіді у кожного db є кілька речей, у яких він кращий, ніж у інших, але продуктивний pgsql легко знаходиться в тій самій царині, що і сервер mssql.

Отже, на якій ОС ви запускаєте pgsql? Яке обладнання? Які налаштування ви вже змінили? Наскільки великий ваш набір даних? Що є прикладом поганого запиту та результатом роз'яснення аналізу (запустіть запит так:

пояснити аналізу виберіть ... решта запитів тут ...;

Опублікуйте вихід на http://explain.depesz.com/ та опублікуйте посилання тут.


1
Так, кожен запит / команда працює повільно, і так "щось" - це жахливо неправильно, звідси і моє запитання. Проблема полягає в тому, що mssql повною мірою використовує наявний операційний сервер на сервері (настільки важке кешування), тоді як psql - ні. Я вдячний за коментарями та порадами, але ви, мабуть, пропустили основну частину мого запитання та саму тему теми ... Я просто хочу знати, як отримати psql, щоб скористатися наявним оперативним модулем; В даний час пробую деякі пропозиції, перелічені іншими ...
user85116

1
Використання оперативної пам’яті НЕ є проблемою. Postgresql покладається на ОС, щоб зробити більшу частину кешування. Отже, не потрібно використовувати всю ОЗУ. Знову ви пропустили основну частину моєї точки зору. Ви даєте нам дорогоцінне мало, щоб допомогти вам. Я запускаю 5000 TPS postgresql кластерів на життя. Ви можете приймати мої поради або продовжувати думати, що знаєте, як працює pgsql і сперечаються.
Скотт Марлоу

@ user85116, будь ласка, почуйте Скотта, у нас вже є робочий процес із MySQL, який залежить від затримки, тому в даний час MySQL використовує 64 ГБ оперативної пам’яті для швидкого виконання цих запитів, тоді як те саме можна досягти і на 2G Postgres із лише матеріалізованими переглядами. Якщо збереження всієї бази даних в оперативній пам'яті не вирішить вашу проблему, вона просто зробить її менш помітною. Якщо у вас є ті самі проблеми в структурі БД, Postgres не виправить це для вас і не спробує приховати.
kworr
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.