За последние 24 часа нас посетили 10604 программиста и 889 роботов. Сейчас ищут 232 программиста ...

Установка Postgres 9 на Linux под высокую нагрузку

Тема в разделе "PostgreSQL", создана пользователем 440Hz, 31 дек 2010.

  1. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    Это не мануал. Это то, с чем я столкнулся. Благодарю всех, чьими статьями я пользовался и всех тех, кто помогал мне в этом. Многие увидят куски других статей, чьим авторам отдельное большое спасибо.


    Предварительная установка:

    Встала задача поставить Постгрес на тачку:

    CPU: Intel(R) Xeon(R) CPU E5420 @ 2.50GHz (8 ядер)
    MEM: 24ГБ
    DSK: 12 дисков FUJITSU MBB2147RC по 160Г каждый

    Требовалось максимально выжать из железа производительность при размере БД 50ГБ с учетом роста до 200ГБ. Самая большая таблица с индексами была примерно 10Г. Текущий сервер упирался в производительность дисков. Загрузка винтов доходила до 90%. С учетом этого на новой тачке 10 винтов (4/6) из 12 были объединены в 2 массива RAID10. и 2 оставлены на hotswap.

    Код (Text):
    1.  
    2. /dev/sda1             261G  3,1G  245G   2% /
    3. ...
    4. /dev/sdb1             409G   48G  341G  13% /postgres
    такое разбиение позволяло разнести данные БД (/var/lib/postgresql/9.0/main/base) и файлы транзакций (/var/lib/postgresql/9.0/main/(pg_clog|pg_xlog)), что значительно уменьшало нагрузку на дисковое пространство. так же был вынесен файл статистики в отдельный виртуальный диск.

    Код (Text):
    1.  
    2. tmpfs                 400M  272K  400M   1% /var/lib/postgresql/9.0/main/pg_stat_tmp
    таким способом мы получили 3 отдельных устройства распределяющие нагрузку между собой. что бы еще более разгрузить нагрузку на диски были смонтированы разделы с опциями noatime,nodiratime.

    Код (Text):
    1.  
    2. UUID=32adf683-9ed6-4cb8-9245-52323ba7c0b5 /               ext4    noatime,nodiratime,errors=remount-ro 0       1
    3. ...
    4. /dev/sdb1 /postgres                                       ext4    noatime,nodiratime 0       1
    5. tmpfs /var/lib/postgresql/9.0/main/pg_stat_tmp            tmpfs   noatime,nodiratime,size=500M,mode=700,uid=104,gid=113
    Разобравшись с дисками началась сама установка...

    Код (Text):
    1.  
    2. #apt-get install python-software-properties
    3. #add-apt-repository ppa:pitti/postgresql
    4. #apt-get update
    5. #apt-get install postgresql postgresql-contrib-9.0
    6. #sudo -u postgres pg_dropcluster --stop 9.0 main
    7. #sudo -u postgres pg_createcluster --start -locale=ru_RU.UTF8 9.0 main
    8. #sudo -u postgres psql postgres
    9. psql (9.0.2)
    10. Type "help" for help.
    11. postgres=# \password
    12. Enter new password:
    13. Enter it again:
    14. postgres=# \q
    15. #/etc/init.d/postgresql stop
    16.  * Stopping PostgreSQL 9.0 database server
    тут надо вынести файл статистики на виртуальный диск и разнести БД и транзакции на разные диски.
    смотрим uid и gid пользователя postgres и мапим рамдиск

    Код (Text):
    1.  
    2. # id postgres
    3. uid=104(postgres) gid=113(postgres) группы=113(postgres),112(ssl-cert)
    добаляем в /etc/fstab/, перемонтируем. сейчас на боевой БД размер файла достигает 100М-150М. С запасом берем 500М.

    Код (Text):
    1.  
    2. #nano /etc/fstab
    3. + tmpfs /var/lib/postgresql/9.0/main/pg_stat_tmp tmpfs noatime,nodiratime,size=500M,mode=700,uid=104,gid=113
    4. #mount -a
    Изначально раздел был сделан 100М и получили косяк, когда ПГ не хватало места для файла статистики. Останавливать ПГ было нельзя. Боевой сервер. Поэтому добавляли размер на лету.

    Код (Text):
    1.  
    2. #mount -o remount,size=500M /var/lib/postgresql/8.4/main/pg_stat_tmp
    разносим БД и все остальное. копируем на диск2 (/postgres) каталог base/ и делаем на него линк
    Код (Text):
    1.  
    2. /var/lib/postgresql/9.0/main#ln -s /postgres/base base
    3. lrwxrwxrwx  1 root     root        14 2010-12-24 18:36 base -> /postgres/base
    пускаем

    Код (Text):
    1.  
    2. #/etc/init.d/postgresql start
    3.  * Starting PostgreSQL 9.0 database server
    таким образом получили разнос основных дисковых операций ПГ на различные файловые системы. это даст нам прирост производительности за счет разброса дисковых операций по разным устройствам и шинам.


    Опимизация (она же тюнинг):

    Имея 24Г памяти можно немного расслабится...


    postgres.conf
    Код (Text):
    1.  
    2. max_connections = 500
    3. shared_buffers = 16GB
    4. temp_buffers = 64MB
    5. work_mem = 512MB
    6. maintenance_work_mem = 4GB
    7. max_stack_depth = 4MB
    8. ...
    9. vacuum_cost_delay = 10ms
    10. ...
    11. wal_buffers = 32MB
    12. ...
    13. effective_cache_size = 4GB
    14. ...
    15. autovacuum = on
    16. autovacuum_max_workers = 16
    17. autovacuum_naptime = 1min
    18. ...
    19. max_locks_per_transaction = 256
    20. checkpoint_segments = 64
    21. checkpoint_timeout = 15min
    скажем ядру, что нам надо много памяти. пусть выдает.

    /etc/sysctl.conf
    Код (Text):
    1.  
    2. kernel.shmall = 17670512640
    3. kernel.shmmax = 17670512640
    перезапускаем

    Код (Text):
    1.  
    2. # sysctl -p
    3. kernel.shmall = 17670512640
    4. kernel.shmmax = 17670512640
    и делаем stop/start постгре.

    Имеем:

    Код (Text):
    1.  
    2. # ipcs
    3.  
    4. ------ Сегменты совм. исп. памяти --------
    5. ключ   shmid      владелец права байты nattch     состояние
    6. 0x0052e2c1 9797632    postgres   600        17670512640 19
    7. 0x7a010596 9633793    zabbix     666        1245800    8
    8.  
    9. ------ Массивы семафоров --------
    10. ключ   semid      владелец права nsems
    11. 0x0052e2c1 94044160   postgres   600        17
    12. 0x0052e2c2 94076929   postgres   600        17
    13. 0x0052e2c3 94109698   postgres   600        17
    14. 0x0052e2c4 94142467   postgres   600        17
    15. 0x0052e2c5 94175236   postgres   600        17
    16. 0x0052e2c6 94208005   postgres   600        17
    17. 0x0052e2c7 94240774   postgres   600        17
    18. 0x7a010596 89686023   zabbix     666        5
    19. 0x0052e2c8 94273544   postgres   600        17
    20. 0x0052e2c9 94306313   postgres   600        17
    21. 0x0052e2ca 94339082   postgres   600        17
    22. 0x0052e2cb 94371851   postgres   600        17
    23. 0x0052e2cc 94404620   postgres   600        17
    24. 0x0052e2cd 94437389   postgres   600        17
    25. 0x0052e2ce 94470158   postgres   600        17
    26. 0x0052e2cf 94502927   postgres   600        17
    27. 0x0052e2d0 94535696   postgres   600        17
    28. 0x0052e2d1 94568465   postgres   600        17
    29. 0x0052e2d2 94601234   postgres   600        17
    30. 0x0052e2d3 94634003   postgres   600        17
    31. 0x0052e2d4 94666772   postgres   600        17
    32. 0x0052e2d5 94699541   postgres   600        17
    33. 0x0052e2d6 94732310   postgres   600        17
    34. 0x0052e2d7 94765079   postgres   600        17
    35. 0x0052e2d8 94797848   postgres   600        17
    36. 0x0052e2d9 94830617   postgres   600        17
    37. 0x0052e2da 94863386   postgres   600        17
    38. 0x0052e2db 94896155   postgres   600        17
    39. 0x0052e2dc 94928924   postgres   600        17
    40. 0x0052e2dd 94961693   postgres   600        17
    41. 0x0052e2de 94994462   postgres   600        17
    42. 0x0052e2df 95027231   postgres   600        17
    43. 0x0052e2e0 95060000   postgres   600        17
    44. 0x0052e2e1 95092769   postgres   600        17
    45. 0x002fa327 58851362   root       666        2
    46.  
    47. ------ Очереди сообщений --------
    48. ключ   msqid      владелец права исп. байты сообщения
    Код (Text):
    1.  
    2. # iostat 1 1
    3. Linux 2.6.32-21-server (*****)      31.12.2010      _x86_64_        (8 CPU)
    4.  
    5. avg-cpu:  %user   %nice %system %iowait  %steal   %idle
    6.            0,42    0,15    0,25    0,27    0,00   98,90
    7.  
    8. Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
    9. sda               4,74       523,57       994,31  318117850  604142240
    10. sdb               7,13       692,47       881,73  420741862  535733686
    Код (Text):
    1.  
    2. PRC | sys   0.63s | user   0.85s | #proc    216 | #zombie    0 | #exit    161 |
    3. CPU | sys      5% | user      6% | irq       0% | idle    790% | wait      0% |
    4. cpu | sys      1% | user      1% | irq       0% | idle     98% | cpu000 w  0% |
    5. cpu | sys      1% | user      1% | irq       0% | idle     99% | cpu007 w  0% |
    6. cpu | sys      0% | user      1% | irq       0% | idle     99% | cpu002 w  0% |
    7. cpu | sys      1% | user      1% | irq       0% | idle     97% | cpu006 w  0% |
    8. cpu | sys      0% | user      0% | irq       0% | idle    100% | cpu003 w  0% |
    9. cpu | sys      1% | user      1% | irq       0% | idle     98% | cpu004 w  0% |
    10. cpu | sys      0% | user      0% | irq       0% | idle    100% | cpu005 w  0% |
    11. cpu | sys      0% | user      0% | irq       0% | idle    100% | cpu001 w  0% |
    12. CPL | avg1   0.66 | avg5    0.45 | avg15   0.38 | csw     7774 | intr    7914 |
    13. MEM | tot   23.6G | free  997.4M | cache  21.6G | buff   88.4M | slab  258.9M |
    14. SWP | tot    0.0M | free    0.0M |              | vmcom  16.8G | vmlim  11.8G |
    15. DSK |         sda | busy      0% | read       0 | write     16 | avio    4 ms |
    16. DSK |         sdb | busy      0% | read       0 | write      5 | avio    4 ms |
    17. NET | transport   | tcpi     351 | tcpo     344 | udpi     195 | udpo     195 |
    18. NET | network     | ipi      551 | ipo      540 | ipfrw      0 | deliv    550 |
    19. NET | eth0     0% | pcki     382 | pcko     342 | si   16 Kbps | so   17 Kbps |
    20. NET | lo     ---- | pcki     195 | pcko     195 | si   76 Kbps | so   76 Kbps |

    Локализация:

    Для работы с cp1251

    Код (Text):
    1.  
    2. #localedef -c -f /usr/share/i18n/charmaps/CP1251 -i /usr/share/i18n/locales/ru_RU /usr/lib/locale/ru_RU.CP1251
    3. #cd /usr/lib/locale
    4. #ln -s ru_RU.cp1251 ru_RU.CP1251
    PGBounucer:

    Код (Text):
    1.  
    2. #apt-get install pgbouncer

    п.с. после НГ допишу настройку.
     
  2. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.239
    Симпатии:
    0
    440Hz
    класс, а что за бд? все равно не доволен линуксом?)
     
  3. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    Padaboo

    линукс освоил. нормально. БД хорошая.
     
  4. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.239
    Симпатии:
    0
    440Hz
    31-е декабря, хватит работать, с наступающим! =)
     
  5. admyx

    admyx Активный пользователь

    С нами с:
    14 мар 2008
    Сообщения:
    2.159
    Симпатии:
    1
    440Hz
    Допиши настройку, пожалуйста, интересно, т.к. работаю сейчас в основном с постгрем.
     
  6. sir Genry

    sir Genry Активный пользователь

    С нами с:
    24 сен 2010
    Сообщения:
    61
    Симпатии:
    0
    Адрес:
    Новосибирск
    Вот сейчас пытаюсь нормально настроить pgBouncer. Так что очень интересно )
    И как авторизацию нормально сделать без указания паролей в открытом виде в файле и сколько коннекций установить. И вообще все )