PostgreSQL повільно виконує продуктивність


9

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

Я провів дуже простий тест, використовуючи наступну таблицю:

CREATE TABLE test (
    id serial primary key,
    foo varchar(16),
);

Після ввімкнення журналу всіх операторів я виконав наступний запит 10000 разів:

BEGIN;
INSERT INTO test (a) VALUES ('bar');
COMMIT;

BEGIN і INSERT займають <1 мс для завершення, але КОМІТ займає в середньому 22 мс для завершення.

Запуск того самого еталону на моєму ПК, який набагато повільніше, дає однакові показники для операторів BEGIN та INSERT, але середній показник COMMIT становить приблизно 0,4 мс (більше ніж у 20 разів швидше).

Після деякого читання я спробував pg_test_fsyncінструмент, щоб спробувати усунути проблему. На сервері я отримую такі результати:

$ ./pg_test_fsync -o 1024
1024 operations per test
O_DIRECT supported on this platform for open_datasync and open_sync.

Compare file sync methods using one 8kB write:
(in wal_sync_method preference order, except fdatasync
is Linux's default)
        open_datasync                      14.875 ops/sec
        fdatasync                          11.920 ops/sec
        fsync                              30.524 ops/sec
        fsync_writethrough                            n/a
        open_sync                          30.425 ops/sec

Compare file sync methods using two 8kB writes:
(in wal_sync_method preference order, except fdatasync
is Linux's default)
        open_datasync                      19.956 ops/sec
        fdatasync                          23.299 ops/sec
        fsync                              21.955 ops/sec
        fsync_writethrough                            n/a
        open_sync                           3.619 ops/sec

Compare open_sync with different write sizes:
(This is designed to compare the cost of writing 16kB
in different write open_sync sizes.)
        16kB open_sync write                5.923 ops/sec
         8kB open_sync writes               3.120 ops/sec
         4kB open_sync writes              10.246 ops/sec
         2kB open_sync writes               1.787 ops/sec
         1kB open_sync writes               0.830 ops/sec

Test if fsync on non-write file descriptor is honored:
(If the times are similar, fsync() can sync data written
on a different descriptor.)
        write, fsync, close                34.371 ops/sec
        write, close, fsync                36.527 ops/sec

Non-Sync'ed 8kB writes:
        write                           248302.619 ops/sec

На власному ПК я отримую:

$ ./pg_test_fsync -o 1024
1024 operations per test
O_DIRECT supported on this platform for open_datasync and open_sync.

Compare file sync methods using one 8kB write:
(in wal_sync_method preference order, except fdatasync
is Linux's default)
        open_datasync                      69.862 ops/sec
        fdatasync                          68.871 ops/sec
        fsync                              34.593 ops/sec
        fsync_writethrough                            n/a
        open_sync                          26.595 ops/sec

Compare file sync methods using two 8kB writes:
(in wal_sync_method preference order, except fdatasync
is Linux's default)
        open_datasync                      26.872 ops/sec
        fdatasync                          59.056 ops/sec
        fsync                              34.031 ops/sec
        fsync_writethrough                            n/a
        open_sync                          17.284 ops/sec

Compare open_sync with different write sizes:
(This is designed to compare the cost of writing 16kB
in different write open_sync sizes.)
        16kB open_sync write                7.412 ops/sec
         8kB open_sync writes               3.942 ops/sec
         4kB open_sync writes               8.700 ops/sec
         2kB open_sync writes               4.161 ops/sec
         1kB open_sync writes               1.492 ops/sec

Test if fsync on non-write file descriptor is honored:
(If the times are similar, fsync() can sync data written
on a different descriptor.)
        write, fsync, close                35.086 ops/sec
        write, close, fsync                34.043 ops/sec

Non-Sync'ed 8kB writes:
        write                           240544.985 ops/sec

Конфігурація сервера:

CPU: Intel(R) Core(TM) i7-3770 CPU @ 3.40GHz
RAM: 32GB
Disk: 2x 2TB SATA disk in Software RAID 1

Машина, яка використовується для порівняння, - це i5 із 16 ГБ оперативної пам’яті та звичайними дисками SATA (без нальоту).

Більше інформації:

  • ОС: сервер Ubuntu 12.10
  • Ядро: Linux ... 3.5.0-22-generic # 34-Ubuntu SMP Вт 8 січня 21:47:00 UTC 2013 x86_64 x86_64 x86_64 GNU / Linux
  • Програмне забезпечення RAID 1
  • Файлова система ext4
  • Інші параметри кріплення не вказані.
  • Постгрес версії 9.1
  • Linux mdadm рейд

Вихід dump2efs:

dumpe2fs 1.42.5 (29-Jul-2012)
Filesystem volume name:   <none>
Last mounted on:          /
Filesystem UUID:          16e30b20-0531-4bcc-877a-818e1f5d5fb2
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      has_journal ext_attr resize_inode dir_index filetype needs_recovery extent flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize
Filesystem flags:         signed_directory_hash 
Default mount options:    (none)
Filesystem state:         clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              182329344
Block count:              729289039
Reserved block count:     36464451
Free blocks:              609235080
Free inodes:              182228152
First block:              0
Block size:               4096
Fragment size:            4096
Reserved GDT blocks:      850
Blocks per group:         32768
Fragments per group:      32768
Inodes per group:         8192
Inode blocks per group:   256
RAID stride:              1
Flex block group size:    16
Filesystem created:       Sat Jan 19 12:42:19 2013
Last mount time:          Wed Jan 23 16:23:11 2013
Last write time:          Sat Jan 19 12:46:13 2013
Mount count:              8
Maximum mount count:      30
Last checked:             Sat Jan 19 12:42:19 2013
Check interval:           15552000 (6 months)
Next check after:         Thu Jul 18 13:42:19 2013
Lifetime writes:          257 GB
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
First inode:              11
Inode size:           128
Journal inode:            8
First orphan inode:       17304375
Default directory hash:   half_md4
Directory Hash Seed:      a71fa518-7696-4a28-bd89-b21c10d4265b
Journal backup:           inode blocks
Journal features:         journal_incompat_revoke
Journal size:             128M
Journal length:           32768
Journal sequence:         0x000df5a4
Journal start:            31733

Mdadm - роздрібний вихід:

/dev/md2:
        Version : 1.2
  Creation Time : Sat Jan 19 12:42:05 2013
     Raid Level : raid1
     Array Size : 2917156159 (2782.02 GiB 2987.17 GB)
  Used Dev Size : 2917156159 (2782.02 GiB 2987.17 GB)
   Raid Devices : 2
  Total Devices : 2
    Persistence : Superblock is persistent

    Update Time : Fri Mar 22 11:16:45 2013
          State : clean 
 Active Devices : 2
Working Devices : 2
 Failed Devices : 0
  Spare Devices : 0

           Name : rescue:2
           UUID : d87b98e7:d584a4ed:5dac7907:ae5639b0
         Events : 38

    Number   Major   Minor   RaidDevice State
       0       8        3        0      active sync   /dev/sda3
       1       8       19        1      active sync   /dev/sdb3

Оновлення 2013-03-25 : Я провів довгий інтелектуальний тест на обох дисках, який не виявив жодних проблем. Обидва диски - від Seagate, модель: ST3000DM001-9YN166.

Оновлення 2013-03-27 : я запустив pg_test_fsync останньої версії (9.2.3) на повністю простою машину:

$ ./pg_test_fsync -s 3
3 seconds per test
O_DIRECT supported on this platform for open_datasync and open_sync.

Compare file sync methods using one 8kB write:
(in wal_sync_method preference order, except fdatasync
is Linux's default)
        open_datasync                      39.650 ops/sec
        fdatasync                          34.283 ops/sec
        fsync                              19.309 ops/sec
        fsync_writethrough                            n/a
        open_sync                          55.271 ops/sec

Це трохи краще, ніж раніше, але все ще плачевно. Розділи на обох дисках вирівняні:

$ sudo parted /dev/sdb unit s print
Model: ATA ST3000DM001-9YN1 (scsi)
Disk /dev/sdb: 5860533168s
Sector size (logical/physical): 512B/4096B
Partition Table: gpt

Number  Start      End          Size         File system  Name  Flags
 4      2048s      4095s        2048s                           bios_grub
 1      4096s      25169919s    25165824s                       raid
 2      25169920s  26218495s    1048576s                        raid
 3      26218496s  5860533134s  5834314639s                     raid

Вихід -V:

$ mount -v | grep ^/dev/
/dev/md2 on / type ext4 (rw,noatime)
/dev/md1 on /boot type ext3 (rw)

Для випробувань використовується пристрій md2. Збираємося знищити розділ swap та запустити pg_test_fsync на окремих дисках.

Якщо я запускаю pg_test_fsync на обох дисках окремо, я отримую приблизно однакову продуктивність, розділ був змонтований у режимі часу:

$ pg_test_fsync/pg_test_fsync -s 3

3 seconds per test
O_DIRECT supported on this platform for open_datasync and open_sync.

Compare file sync methods using one 8kB write:
(in wal_sync_method preference order, except fdatasync
is Linux's default)
        open_datasync                      75.111 ops/sec
        fdatasync                          71.925 ops/sec
        fsync                              37.352 ops/sec
        fsync_writethrough                            n/a
        open_sync                          33.746 ops/sec

Compare file sync methods using two 8kB writes:
(in wal_sync_method preference order, except fdatasync
is Linux's default)
        open_datasync                      38.204 ops/sec
        fdatasync                          49.907 ops/sec
        fsync                              32.126 ops/sec
        fsync_writethrough                            n/a
        open_sync                          13.642 ops/sec

Compare open_sync with different write sizes:
(This is designed to compare the cost of writing 16kB
in different write open_sync sizes.)
         1 * 16kB open_sync write          25.325 ops/sec
         2 *  8kB open_sync writes         12.539 ops/sec
         4 *  4kB open_sync writes          6.207 ops/sec
         8 *  2kB open_sync writes          3.098 ops/sec
        16 *  1kB open_sync writes          1.208 ops/sec

Test if fsync on non-write file descriptor is honored:
(If the times are similar, fsync() can sync data written
on a different descriptor.)
        write, fsync, close                27.275 ops/sec
        write, close, fsync                20.561 ops/sec

Non-Sync'ed 8kB writes:
        write                           562902.020 ops/sec

Після запуску тесту кілька разів, як на масиві, так і на одному диску, цифри, здається, різко змінюються. Найгірший показник - це приблизно 50% від того, що я розмістив тут (десь 30 оп / с для першого тесту). Це нормально? Машина весь час простоює.

Також, відповідно до висновку dmesg, контролер знаходиться в режимі AHCI.


Чи можете ви надати детальну інформацію про цей програмний RAID? Яке програмне забезпечення? Linux mdadmабо dmraid? Щось специфічне для продавця? Щось ще? Ваша версія PostgreSQL та версія хост-ОС також допоможуть.
Крейг Рінгер

Відповіді:


6

Сервер має неймовірно, невимовно, дивовижно повільну fsyncпродуктивність. У вашому налаштуванні програмного забезпечення RAID 1 щось дуже не так. Страшна fsyncвистава майже напевно є причиною ваших проблем із виконанням.

Робочий стіл просто дуже повільний fsync.

Ви можете вирішити проблеми з продуктивністю ціною втрати деяких даних після аварії, встановивши synchronous_commit = offта встановивши a commit_delay. Вам дійсно потрібно розібратися в продуктивності диска на сервері, однак це дуже повільно.

Для порівняння, ось що я отримую від свого ноутбука (i7, 8 Гб оперативної пам’яті, середній діапазон 128G SSD, pg_test_fsync від 9.2):

Compare file sync methods using one 8kB write:

        open_datasync                    4445.744 ops/sec
        fdatasync                        4225.793 ops/sec
        fsync                            2742.679 ops/sec
        fsync_writethrough                            n/a
        open_sync                        2907.265 ops/sec

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


1
Так, але що є причиною поганої продуктивності синхронізації?
Блуд

Я спробував запустити pg_test_fsync на власному SSD, і я отримав порівнянні показники продуктивності. Я знаю, що я міг би відключити синхронізацію, але залишається питання, в чому причина цієї проблеми?
Блуд

@Blubber Яке програмне забезпечення RAID ви використовуєте? Яка файлова система? Яка хост ОС та версія? Які параметри кріплення файлової системи? Це все важлива інформація, якщо ви шукаєте першопричину; будь ласка, оновіть своє запитання. Ви також повинні зробити SMART перевірку стану здоров’я на жорстких дисках ( smartctl -d ata -a /dev/sdx|lessа smartctl -d ata -t long /dev/sdxза ними - sleep 90mабо те, що smartctlпідкаже вам, інший - -d ata -aщоб отримати результати).
Крейг Рінгер

@Blubber Навіть якщо ви вирішите проблеми з RAID, ваша продуктивність все одно буде поганою, не так вже й поганою. Прості старі диски 7200RPM (або, що ще гірше, 5400RPM) - це поганий вибір для продуктивності бази даних, особливо без належного апаратного RAID-контролера з кешованим кешем, який дозволяє групі контролерів збиратися та записувати буфер.
Крейг Рінгер

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

1

Це pg_test_fsyncвиведення на мій сервер, з дуже схожою конфігурацією - програмне забезпечення Linux RAID1 на 2 дисках споживчого рівня ( WD10EZEX-00RKKA0):

# ./pg_test_fsync -s 3
Compare file sync methods using one 8kB write:
(in wal_sync_method preference order, except fdatasync
is Linux's default)
        open_datasync                     115.375 ops/sec
        fdatasync                         109.369 ops/sec
        fsync                              27.081 ops/sec
        fsync_writethrough                            n/a
        open_sync                         112.042 ops/sec
...

Ви тестували це на абсолютно непрацюючому сервері, чи не так?


Можливо, у вас нерівні перегородки. Перевірка:

parted /dev/sda unit s print

Це вихід мого сервера:

Model: ATA WDC WD10EZEX-00R (scsi)
Disk /dev/sda: 1953525168s
Sector size (logical/physical): 512B/4096B
Partition Table: msdos

Number  Start       End          Size         Type     File system     Flags
 1      2048s       67110911s    67108864s    primary  ext4            boot, raid
 2      67110912s   603981823s   536870912s   primary                  raid
 3      603981824s  608176127s   4194304s     primary  linux-swap(v1)
 4      608176128s  1953523711s  1345347584s  primary                  raid

Переконайтесь, що кожне число Startстовпця ділиться на 2048 (що означає 1 Мбіт). Для хорошого вирівнювання 4096B, розділеного на 4, буде достатньо, але утиліти, які знають вирівнювання, запускають розділи на межах 1MiB.


Можливо, ви також використовуєте параметри кріплення за замовчуванням, наприклад data=journal, які мають великий вплив на продуктивність. Покажіть своїм: mount -v | grep ^/dev/. Це моє:

/dev/md0 on / type ext4 (rw,barrier,usrjquota=aquota.user,grpjquota=aquota.group,jqfmt=vfsv0)
/dev/md2 on /home type ext4 (rw,barrier,usrjquota=aquota.user,grpjquota=aquota.group,jqfmt=vfsv0)
/dev/md1 on /var type ext4 (rw,barrier,usrjquota=aquota.user,grpjquota=aquota.group,jqfmt=vfsv0)

Можливо, один із ваших дисків зламаний. Створіть один розділ на кожному диску без RAID (можливо, ви зарезервували деякі підкачки розділів на обох дисках - використовуйте ці - жодного разу не використовуйте для RAID під час заміни). Створіть там файлові системи та працюйте pg_test_fsyncна кожному диску - якщо у вас є проблеми, то хорошій людині доведеться чекати, коли вони відображаються в дзеркальному відображенні.


Перевірте, чи налаштовано ваш BIOS використовувати режим AHCI замість режиму IDE. Сервер отримав би перевагу від Native Command Queuing , яка недоступна в режимі IDE.


Ігноруйте порівняння з SSD. Смішно порівнювати.


Я запустив Bonnie ++, що демонструє хороші показники (настільки ж хороші, як ви і очікували від звичайних дисков sata). Також перегородки вирівнюються. Коли я запустив pg_test_fsync вперше, це було на VM. Потім я запустив його на фактичне обладнання, після вимкнення всіх інших процесів (включаючи VM). Продуктивність була трохи краща, близько 40 оп / сек, що все ще плачевно. Я збираюся запустити ще кілька тестів, на окремих розділах, якщо я отримав час сьогодні. Дякую за всі пропозиції.
Буріння

Я змінив своє первісне запитання додатковою інформацією про параметри кріплення та вирівнювання розділів.
Буріння

1

Я знаю, що я можу занадто пізно відповісти на це. Під час використання O_DIRECT я бачив подібні проблеми з продуктивністю з PostgreSQL та MySQL. Я мікро-орієнтирував систему, використовуючи іозон із записом синхронізації (- + r варіант) та з та без O_DIRECT (опція -I). Нижче наведені дві команди, які я використав:

iozone -s 2g -r 512k -+r -I -f /mnt/local/iozone_test_file -i 0

і

iozone -s 2g -r 512k -+r    -f /mnt/local/iozone_test_file -i 0

Перший - O_SYNC + O_DIRECT, а другий - лише O_SYNC. З першим я отримував приблизно 30 Мб / сек, а з другим я отримував приблизно 220 Мб / сек (SSD диск). Я дізнався, що проблема has_journal на швах ext4 викликає проблему. Не знаю насправді чому ...

Filesystem features:      has_journal 

Як тільки я скористався цією можливістю, все почало працювати нормально, і тести досягали і підтримували 220 Мб / сек. Щоб вийняти варіант, ви можете використовувати щось на кшталт:

tune2fs -O ^has_journal /dev/sdX

Ви можете випробувати тест і побачити, чи вирішує він проблеми з ефективністю.


1
Вимкнення журналу на ext3 / 4 - це не те, що можна зробити без ретельного розгляду та дуже хорошого розуміння впливу.
ThatGraemeGuy

2
Я не погоджуюсь. СУБД проводить власну реєстрацію та відновлення, щоб забезпечити довговічність та атомність транзакцій. Журнал FS в цьому плані абсолютно марний. Поки fsync працює належним чином, наслідки вчинених транзакцій завжди можна відновити.
Caetano Sauer
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.