Буферный кэш 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, где будет еще больше полезной информации.