четверг, 23 мая 2019 г.

Размещение stats_temp_directory на виртуальном диске

Размещение stats_temp_directory на виртуальном диске

Перевод.

Размещение stats_temp_directory на виртуальном диске

Этот хак является старым каштаном среди тюнеров производительности PostgreSQL, но, похоже, не так широко известен в других местах. Это позор, потому что это чистая победа, и ее нелепо легко настроить. Вам даже не нужно перезапускать PostgreSQL.
Вот ситуация: PostgreSQL записывает определенную временную статистику. Они идут в dir, заданном stats_temp_directoryнастройкой. По умолчанию это pg_stat_tmpв каталоге данных. Временные файлы много пишутся, но их не нужно сохранять.
Это делает их идеальными кандидатами на виртуальный диск (он же RAM-диск). RAM-диск - это фрагмент памяти, который ОС рассматривает как блочное устройство. Потому что это ОЗУ, это супер-быстро. Что касается приложения, виртуальный диск содержит файловую систему, которую он может читать и записывать, как и любую другую. Более того, PostgreSQL обычно требуется всего несколько сотен килобайт stats_temp_directoryлюбой современный сервер может разместить это в оперативной памяти.
В Linux вы устанавливаете виртуальный диск как этот:
Как root:
'mkdir /var/lib/pgsql_stats_tmp' [1]
'chmod 777 /var/lib/pgsql_stats_tmp'
'chmod +t /var/lib/pgsql_stats_tmp'
Добавьте эту строку в /etc/fstabЭто 2G является верхним пределом; система будет использовать столько, сколько ей нужно.
tmpfs /var/lib/pgsql_stats_tmp tmpfs size=2G,uid=postgres,gid=postgres 0 0
'mount /var/lib/pgsql_stats_tmp'
Тогда как postgres:
Измените параметр stats_temp_directory в postgresql.conf:
stats_temp_directory = '/var/lib/pgsql_stats_tmp'
Скажите PostgreSQL перечитать его конфигурацию:
'pg_ctl -D YOUR_DATA_DIR reload'
И это все!
Другие операционные системы имеют разные способы установки виртуальных дисков. Возможно, я расскажу о них в следующем посте.
[1] Каталог /var/lib/pgsql_stats_tmpявляется произвольным выбором, но он хорошо работает для разметки файловой системы Debian.

=================================================================================

Опыт на виртуальной машине:

До

Тест  pgbench

$ sudo -u postgres psql -c "CREATE DATABASE example;"
$ sudo -u postgres pgbench -i -s 500 example
$ sudo -u postgres pgbench -c 10 -j 10 -t 10000 example

2 измерения.

$ sudo -u postgres pgbench -c 10 -j 10 -t 10000 example
starting vacuum...end.
transaction type: <builtin: TPC-B (sort of)>
scaling factor: 500
query mode: simple
number of clients: 10
number of threads: 10
number of transactions per client: 10000
number of transactions actually processed: 100000/100000
latency average = 3.880 ms
tps = 2577.602763 (including connections establishing)
tps = 2578.929607 (excluding connections establishing)

$ sudo -u postgres pgbench -c 10 -j 10 -t 10000 example
starting vacuum...end.
transaction type: <builtin: TPC-B (sort of)>
scaling factor: 500
query mode: simple
number of clients: 10
number of threads: 10
number of transactions per client: 10000
number of transactions actually processed: 100000/100000
latency average = 4.640 ms
tps = 2155.091523 (including connections establishing)
tps = 2155.908282 (excluding connections establishing)

Перенос  stats_temp_directory на виртуальный диске

$ sudo mkdir /var/lib/pgsql_stats_tmp
$ sudo chmod 777 /var/lib/pgsql_stats_tmp
$ sudo chmod +t /var/lib/pgsql_stats_tmp
$ sudo nano /etc/fstab
tmpfs /var/lib/pgsql_stats_tmp tmpfs size=2G,uid=postgres,gid=postgres 0 0
Сохранить.
$ sudo mount /var/lib/pgsql_stats_tmp
$ df -h
Файл.система   Размер Использовано  Дост Использовано% Cмонтировано в
udev             7,9G            0  7,9G            0% /dev
tmpfs            1,6G         1,1M  1,6G            1% /run
/dev/sda1        985G          17G  918G            2% /
tmpfs            7,9G          52K  7,9G            1% /dev/shm
tmpfs            5,0M            0  5,0M            0% /run/lock
tmpfs            7,9G            0  7,9G            0% /sys/fs/cgroup
tmpfs            1,6G            0  1,6G            0% /run/user/999
tmpfs            1,6G            0  1,6G            0% /run/user/1000
tmpfs            2,0G            0  2,0G            0% /var/lib/pgsql_stats_tmp

 
$ sudo nano /etc/postgresql/10/main/postgresql.conf

Добавить строку:

stats_temp_directory = '/var/lib/pgsql_stats_tmp'

Сохранить. 
 
$ sudo systemctl restart postgresql.service

 
После:
user@u1604:~$ sudo -u postgres pgbench -c 10 -j 10 -t 10000 example
starting vacuum...end.
transaction type: <builtin: TPC-B (sort of)>
scaling factor: 500
query mode: simple
number of clients: 10
number of threads: 10
number of transactions per client: 10000
number of transactions actually processed: 100000/100000
latency average = 3.666 ms
tps = 2727.513649 (including connections establishing)
tps = 2728.516695 (excluding connections establishing)
 


user@u1604:~$ sudo -u postgres pgbench -c 10 -j 10 -t 10000 example
starting vacuum...end.
transaction type: <builtin: TPC-B (sort of)>
scaling factor: 500
query mode: simple
number of clients: 10
number of threads: 10
number of transactions per client: 10000
number of transactions actually processed: 100000/100000
latency average = 3.830 ms
tps = 2611.254894 (including connections establishing)
tps = 2613.189750 (excluding connections establishing)






 

Комментариев нет:

Отправить комментарий