PgFincore
Набор функций для низкоуровневого управления отношениями с использованием mincore для исследования кэш-памяти.
В PostgreSQL каждая таблица или индекс разбивается на сегменты размером обычно 1 ГБ, а каждый сегмент разбивается на страницы в памяти, а затем на блоки для файловой системы.
Эти функции позволяют узнать, какие и сколько блоков диска из отношения находятся в кэше страниц операционной системы. Результат может быть представлен в виде VarBit и сохранён в таблице. Затем, используя эту таблицу, можно восстановить состояние кэша страниц для каждого блока отношения даже на другом сервере благодаря потоковой репликации.
Другие функции используются для установки флага POSIX_FADVISE для всего отношения (каждого сегмента). Вероятно, более полезными являются WILLNEED и DONTNEED, которые выталкивают и извлекают блоки каждого сегмента отношения из кэша страниц соответственно.
Каждая функция вызывается как минимум с именем таблицы или индексом (или oid) в качестве параметра и проходит по каждому сегменту отношения.
Вы можете получить последний код с помощью git:
git clone git://git.postgresql.org/git/pgfincore.git
или
git://github.com/klando/pgfincore.git
Проект также доступен на pgfoundry: http://pgfoundry.org/projects/pgfincore
Из исходного кода:
make clean
make
su
make install
Для PostgreSQL >= 9.1 войдите в свою базу данных и:
mydb=# CREATE EXTENSION pgfincore;
Для других версий создайте функции из скрипта SQL (он должен находиться в вашем каталоге contrib):
psql mydb -f pgfincore.sql
PgFincore также поставляется с Debian-скриптами для создания собственного пакета:
aptitude install debhelper postgresql-server-dev-all postgresql-server-dev-9.1
# или postgresql-server-dev-8.4|postgresql-server-dev-9.0
make deb
dpkg -i ../postgresql-9.1-pgfincore_1.1.1-1_amd64.deb
PgFincore упакован для RPM по адресу http://yum.postgresql.org/, а также для debian по адресу http://pgapt.debian.net/.
Вот несколько примеров использования. Если вам нужны дополнительные сведения, обратитесь к документации.
Может быть полезно:
cedric=# select * from pgfincore('pgbench_accounts');
relpath | segment | os_page_size | rel_os_pages | pages_mem | group_mem | os_pages_free | databit | pages_dirty | group_dirty
--------------------+---------+--------------+--------------+-----------+-----------+---------------+---------+-------------+-------------
base/11874/16447 | 0 | 4096 | 262144 | 262144 | 1 | 81016 | | 0 | 0
base/11874/16447.1 | 1 | 4096 | 65726 | 65726 | 1 | 81016 | | 0 | 0
(2 rows)
Time: 31.563 ms
Возможно, вы захотите сохранить таблицу или индекс в буфере страниц ОС или предварительно загрузить таблицу перед выполнением хорошо известного большого запроса (сокращая время запроса).
Чтобы сделать это, просто выполните следующий запрос:
cedric=# select * from pgfadvise_willneed('pgbench_accounts');
relpath | os_page_size | rel_os_pages | os_pages_free
--------------------+--------------+--------------+---------------
base/11874/16447 | 4096 | 262144 | 169138
base/11874/16447.1 | 4096 | 65726 | 103352
(2 строки)
Время: 4462,936 мс
Вы... pgfincore
Функция возвращает набор записей.
pgfincore(IN relname regclass,
OUT relpath text, OUT segment int, OUT os_page_size bigint,
OUT rel_os_pages bigint, OUT pages_mem bigint,
OUT group_mem bigint, OUT os_pages_free bigint,
OUT databit varbit, OUT pages_dirty bigint,
OUT group_dirty bigint)
RETURNS setof record
Документация
Эта функция выводит размер блоков ОС и количество свободных страниц в буфере страниц ОС.
cedric=# select * from pgsysconf();
os_page_size | os_pages_free | os_total_pages
--------------+---------------+----------------
4096 | 80431 | 4094174
То же самое, но с более красивым выводом.
cedric=# select * from pgsysconf_pretty();
os_page_size | os_pages_free | os_total_pages
--------------+---------------+----------------
4096 bytes | 314 MB | 16 GB
Эта функция устанавливает флаг WILLNEED для текущего отношения. Это означает, что операционная система попытается загрузить как можно больше страниц этого отношения. Основная идея заключается в предварительной загрузке файлов при запуске сервера, возможно, используя соотношение попаданий/промахов кэша или наиболее необходимые отношения/индексы.
cedric=# select * from pgfadvise_willneed('pgbench_accounts');
relpath | os_page_size | rel_os_pages | os_pages_free
--------------------+--------------+--------------+---------------
base/11874/16447 | 4096 | 262144 | 80650
base/11874/16447.1 | 4096 | 65726 | 80650
Эта функция устанавливает флаг DONTNEED для текущего отношения. Это означает, что операционная система сначала выгрузит страницы файла, если ей нужно освободить некоторую память. Основная идея состоит в том, чтобы выгрузить файлы, когда они больше не нужны (вместо, возможно, более интересных страниц).
cedric=# select * from pgfadvise_dontneed('pgbench_accounts');
relpath | os_page_size | rel_os_pages | os_pages_free
--------------------+--------------+--------------+---------------
base/11874/16447 | 4096 | 262144 | 342071
base/11874/16447.1 | 4096 | 65726 | 408103
Эта функция устанавливает для текущего отношения флаг NORMAL.
Эта функция устанавливает для текущего отношения флаг SEQUENTIAL.
Эта функция устанавливает для текущего отношения флаг RANDOM.
Эта функция позволяет напрямую взаимодействовать с кешем страниц. Её можно использовать для загрузки и/или выгрузки страниц из памяти на основе varbit, представляющего карту страниц для загрузки/выгрузки соответственно.
Работа с отношением pgbench_accounts, сегмент 0, произвольная карта varbit:
— Загрузка и выгрузка
cedric=# select * from pgfadvise_loader('pgbench_accounts', 0, true, true, B'111000');
relpath | os_page_size | os_pages_free | pages_loaded | pages_unloaded
------------------+--------------+---------------+--------------+----------------
base/11874/16447 | 4096 | 408376 | 3 | 3
— Загрузка
cedric=# select * from pgfadvise_loader('pgbench_accounts', 0, true, false, B'111000');
relpath | os_page_size | os_pages_free | pages_loaded | pages_unloaded
------------------+--------------+---------------+--------------+----------------
base/11874/16447 | 4096 | 408370 | 3 | 0
— Выгрузка
cedric=# select * from pgfadvise_loader('pgbench_accounts', 0, false, true, B'111000');
relpath | os_page_size | os_pages_free | pages_loaded | pages_unloaded
------------------+--------------+---------------+--------------+---------------- ### pgfincore
Эта функция предоставляет информацию о кэше файловой системы (кэше страниц).
cedric=# select * from pgfincore('pgbench_accounts');
relpath | segment | os_page_size | rel_os_pages | pages_mem | group_mem | os_pages_free | databit | pages_dirty | group_dirty
--------------------+---------+--------------+--------------+-----------+-----------+---------------+---------+-------------+-------------
base/11874/16447 | 0 | 4096 | 262144 | 3 | 1 | 408444 | | 0 | 0
base/11874/16447.1 | 1 | 4096 | 65726 | 0 | 0 | 408444 | | 0 | 0
Для указанного отношения возвращается:
Вы можете отладить PgFincore с помощью следующих уровней ошибок: DEBUG1 и DEBUG5.
Например:
set client_min_messages TO debug1; -- debug5 полезен только для отслеживания каждого блока
У PgFincore есть ограниченный режим, когда POSIX_FADVISE не предоставляется платформой.
Для PgFincore требуется PostgreSQL >= 8.3.
PgFincore не работает в Windows.
Экспертиза PostgreSQL, техническая поддержка и помощь, тренинги:
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )