Размещение stats_temp_directory на виртуальном диске
Перевод.
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
Перевод.
Размещение stats_temp_directory на виртуальном диске
Этот хак является старым каштаном среди тюнеров производительности PostgreSQL, но, похоже, не так широко известен в других местах. Это позор, потому что это чистая победа, и ее нелепо легко настроить. Вам даже не нужно перезапускать PostgreSQL.
Вот ситуация: PostgreSQL записывает определенную временную статистику. Они идут в dir, заданном
Это делает их идеальными кандидатами на виртуальный диск (он же RAM-диск). RAM-диск - это фрагмент памяти, который ОС рассматривает как блочное устройство. Потому что это ОЗУ, это супер-быстро. Что касается приложения, виртуальный диск содержит файловую систему, которую он может читать и записывать, как и любую другую. Более того, PostgreSQL обычно требуется всего несколько сотен килобайт
В Linux вы устанавливаете виртуальный диск как этот:
Как
Добавьте эту строку в
Тогда как
Измените параметр stats_temp_directory в postgresql.conf:
Другие операционные системы имеют разные способы установки виртуальных дисков. Возможно, я расскажу о них в следующем посте.
[1] Каталог
=================================================================================
Опыт на виртуальной машине:
До
$ sudo -u postgres pgbench -i -s 500 example
$ sudo -u postgres pgbench -c 10 -j 10 -t 10000 example
Вот ситуация: 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)
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)
Комментариев нет:
Отправить комментарий