Буферный кэш PostgreSQL: автоматизация анализа с помощью bash-скрипта
Эффективное управление буферным кэшем — важный аспект оптимизации производительности базы данных PostgreSQL. Он играет важную роль в удержании страниц данных в памяти, сокращая операции дискового ввода-вывода и улучшая время выполнения запросов. Понимание того, как буферный кэш распределяется между различными базами данных, может дать ценную информацию об оптимизации производительности и обеспечении эффективного использования ресурсов.
В этой статье рассмотрим bash-скрипт, который автоматизирует процесс проверки распределения буферного кэша для всех баз данных на экземпляре PostgreSQL. Скрипт упрощает анализ и помогает администраторам баз данных определить, какие таблицы потребляют больше всего буферного кэша. Это может быть особенно полезно для настройки производительности и оптимизации ресурсов.
Обзор сценария
Предоставленный bash-скрипт выполняет следующие задачи:
- Извлекает список баз данных: подключается к экземпляру PostgreSQL и извлекает список баз данных, используемых в данный момент.
- Собирает информацию о буферном кэше: для каждой базы данных скрипт запрашивает информацию о буферном кэше, чтобы определить, какой объем кэша выделен различным таблицам.
- Форматы и отчеты: скрипт форматирует выходные данные для удобства чтения и отображает отчет об использовании буферного кэша.
Как работает скрипт
А сейчас разберем сценарий на его ключевые компоненты:
#!/bin/bash # Скрипт для проверки выделения буферного кэша для всех баз данных на экземпляре базы данных nPort=$1 current_date_time="$(date +'%Y%m%d_%H%M%S')" fileOne="./temp_output/check_buffer_cache_${current_date_time}.tmp" fileTwo="./temp_output/check_buffer_cache_${current_date_time}_formatted.tmp" echo " " echo "Started..." echo " "
Скрипт начинается с настройки необходимых переменных, включая номер порта (nPort
) и пути к файлам для хранения временных выходных файлов. Он также фиксирует текущую дату и время для временной отметки выходных файлов.
for i in `psql -h localhost -p ${nPort} -U postgres -t -c "select datname from pg_database where datname in (select datname from pg_stat_activity) order by 1"`; do echo "Collecting buffercache info about database: $i"
Скрипт запрашивает список баз данных, которые в данный момент активны, и выполняет итерацию по каждой базе данных. Для каждой базы он собирает информацию о буферном кэше.
3. Сбор информации о буферном кэше :
psql -h localhost -p ${nPort} -U $i -d $i -qt <<SQL >> ${fileOne} \\c ${i}; SELECT '${i}' as db_name, n.nspname, c.relname, count(*) AS buffers FROM pg_buffercache b JOIN pg_class c ON b.relfilenode = pg_relation_filenode(c.oid) AND b.reldatabase IN (0, (SELECT oid FROM pg_database WHERE datname = current_database())) JOIN pg_namespace n ON n.oid = c.relnamespace and n.nspname ='public' GROUP BY n.nspname, c.relname ORDER BY 4 DESC LIMIT 10; SQL
Для каждой базы данных скрипт выполняет SQL-запрос для получения использования буферного кэша. Он объединяет несколько таблиц системного каталога PostgreSQL, чтобы получить сведения о распределении буфера для каждой таблицы, фильтруя для включения только тех, которые находятся в схеме «public».
4. Форматирование и отображение отчета :
cat ${fileOne} | awk -F"|" ' { if (NF==4) { printf("%-40s %-20s %-50s %s\n",$1, $2, $3, $4); } } ' | sort -nrk4 > ${fileTwo} echo " " echo "Report:" echo " " cat ${fileTwo} echo " " echo "Ended..." echo " "
После сбора данных скрипт форматирует их при помощи awk,
чтобы обеспечить читаемость. Он сортирует вывод по количеству буферов в порядке убывания и сохраняет результат в другом временном файле. Наконец, он отображает отформатированный отчет.
Запуск скрипта
Для выполнения этого скрипта необходимо передать номер порта экземпляра PostgreSQL в качестве аргумента:
./check_buffer_cache.sh 5432
Замените 5432
на номер порта экземпляра PostgreSQL. Скрипт сгенерирует и отобразит отчет об использовании буферного кэша для всех активных баз данных.
Заключение
Этот скрипт — удобный инструмент для администраторов PostgreSQL, желающих получить представление о распределении кэша буфера. Для достижения наилучших результатов попробуйте позапускать этот скрипт в разные периоды времени, чтобы отслеживать изменения в использовании кэша и принимать обоснованные решения о настройке базы данных.
Ниже представлен полный скрипт:
#!/bin/bash # Скрипт для проверки выделения буферного кэша для всех баз данных на экземпляре базы данных nPort=$1 current_date_time="$(date +'%Y%m%d_%H%M%S')" fileOne="./temp_output/check_buffer_cache_${current_date_time}.tmp" fileTwo="./temp_output/check_buffer_cache_${current_date_time}_formatted.tmp" echo " " echo "Started..." echo " " for i in `psql -h localhost -p ${nPort} -U postgres -t -c "select datname from pg_database where datname in (select datname from pg_stat_activity) order by 1"`; do echo "Collecting buffercache info about database: $i" #echo " " psql -h localhost -p ${nPort} -U $i -d $i -qt <<SQL >> ${fileOne} \\c ${i}; SELECT '${i}' as db_name, n.nspname, c.relname, count(*) AS buffers FROM pg_buffercache b JOIN pg_class c ON b.relfilenode = pg_relation_filenode(c.oid) AND b.reldatabase IN (0, (SELECT oid FROM pg_database WHERE datname = current_database())) JOIN pg_namespace n ON n.oid = c.relnamespace and n.nspname ='public' GROUP BY n.nspname, c.relname ORDER BY 4 DESC LIMIT 10; SQL done cat ${fileOne} | awk -F"|" ' { if (NF==4) { printf("%-40s %-20s %-50s %s\n",$1, $2, $3, $4); } } ' | sort -nrk4 > ${fileTwo} echo " " echo "Report:" echo " " cat ${fileTwo} echo " " echo "Ended..." echo " "
На этом все! Спасибо за внимание! Если статья была интересна, подпишитесь на телеграм-канал usr_bin, где будет еще больше полезной информации.