воскресенье, 21 июля 2013 г.

Тестирование производительности БД PostgreSQL с использованием pgbench

Ниже представляю скрипт нагрузочного тестирования с использованием pgbench. Методология тестирования хорошо описана на странице http://wiki.postgresql.org/wiki/Pgbenchtesting, ниже я представил скрипт которым можно инициализировать базы с нужным скейл фактором с последующим выполнением нагрузочного тестирования на них.

Вот например диаграмма построенная на основе полученных данных для сервера (MEM 32Gb, 24 CORE, Intel(R) Xeon(R) CPU E5-2620 0 @ 2.00GHz (9.2.3 + perl)) с файловой системой ext4 без тюнинга, CentOS 6.4

По оси Y количество транзакций в секунду. По X скейл фактов в зависимости от размера оперативной памяти (1 - 0.1 памяти, 20 - 2 x MEM)



#!/bin/bash -x
# Andrew G. Saushkin

AVAIL_MEMORY=32
AVAIL_CORES=24

PG_HOST=127.0.0.1
PG_USER=ags

function initdb {
    # Префикс баз данных, которые будут использованы при тестировании. Внимание, существующие базы 
    # данных с этим префиксом будут удалены
    DB_PREFIX=pgbench_$PG_USER

    DBNAME=$DB_PREFIX$1
    SCALE=$2
    CLIENTS=$3
    THREADS=$4
    EXEC_TIME=$5

    LIBPQ_OPTIONS=" -U $PG_USER -h $PG_HOST -p 5433 "
    #LIBPQ_OPTIONS=
    PSQL="psql $LIBPQ_OPTIONS postgres"

    $PSQL <<SQL
\c postgres
\set AUTOCOMMIT on
\set ON_ERROR_STOP off

drop database $DBNAME;

\set AUTOCOMMIT off
\set ON_ERROR_STOP on

CREATE DATABASE $DBNAME
  WITH ENCODING = 'UTF8'
       TABLESPACE = pg_default
       LC_COLLATE = 'ru_RU.UTF-8'
       LC_CTYPE = 'ru_RU.UTF-8'
       CONNECTION LIMIT = -1
       TEMPLATE = template0;

SQL

    pgbench $LIBPQ_OPTIONS -i -s$SCALE $DBNAME
    pgbench $LIBPQ_OPTIONS -c $CLIENTS -j $THREADS -T $EXEC_TIME $DBNAME
}

#      dbname   scale                                                                   clients                 threads                     exec_time
initdb  1        $(python -c "print round($AVAIL_MEMORY * 75 * 0.1) " | sed 's/\..*//')  $(($AVAIL_CORES * 2))   $(($AVAIL_CORES * 1))       600
initdb  2        $(python -c "print round($AVAIL_MEMORY * 75 * 0.2) " | sed 's/\..*//')  $(($AVAIL_CORES * 2))   $(($AVAIL_CORES * 1))       600
initdb  3        $(python -c "print round($AVAIL_MEMORY * 75 * 0.3) " | sed 's/\..*//')  $(($AVAIL_CORES * 2))   $(($AVAIL_CORES * 1))       600
initdb  4        $(python -c "print round($AVAIL_MEMORY * 75 * 0.4) " | sed 's/\..*//')  $(($AVAIL_CORES * 2))   $(($AVAIL_CORES * 1))       600
initdb  5        $(python -c "print round($AVAIL_MEMORY * 75 * 0.5) " | sed 's/\..*//')  $(($AVAIL_CORES * 2))   $(($AVAIL_CORES * 1))       600
initdb  6        $(python -c "print round($AVAIL_MEMORY * 75 * 0.6) " | sed 's/\..*//')  $(($AVAIL_CORES * 2))   $(($AVAIL_CORES * 1))       600
initdb  7        $(python -c "print round($AVAIL_MEMORY * 75 * 0.7) " | sed 's/\..*//')  $(($AVAIL_CORES * 2))   $(($AVAIL_CORES * 1))       600
initdb  8        $(python -c "print round($AVAIL_MEMORY * 75 * 0.8) " | sed 's/\..*//')  $(($AVAIL_CORES * 2))   $(($AVAIL_CORES * 1))       600
initdb  9        $(python -c "print round($AVAIL_MEMORY * 75 * 0.9) " | sed 's/\..*//')  $(($AVAIL_CORES * 2))   $(($AVAIL_CORES * 1))       600
initdb 10        $(python -c "print round($AVAIL_MEMORY * 75 * 1.0) " | sed 's/\..*//')  $(($AVAIL_CORES * 2))   $(($AVAIL_CORES * 1))       600
initdb 11        $(python -c "print round($AVAIL_MEMORY * 75 * 1.1) " | sed 's/\..*//')  $(($AVAIL_CORES * 2))   $(($AVAIL_CORES * 1))       600
initdb 12        $(python -c "print round($AVAIL_MEMORY * 75 * 1.2) " | sed 's/\..*//')  $(($AVAIL_CORES * 2))   $(($AVAIL_CORES * 1))       600
initdb 13        $(python -c "print round($AVAIL_MEMORY * 75 * 1.3) " | sed 's/\..*//')  $(($AVAIL_CORES * 2))   $(($AVAIL_CORES * 1))       600
initdb 14        $(python -c "print round($AVAIL_MEMORY * 75 * 1.4) " | sed 's/\..*//')  $(($AVAIL_CORES * 2))   $(($AVAIL_CORES * 1))       600
initdb 15        $(python -c "print round($AVAIL_MEMORY * 75 * 1.5) " | sed 's/\..*//')  $(($AVAIL_CORES * 2))   $(($AVAIL_CORES * 1))       600
initdb 16        $(python -c "print round($AVAIL_MEMORY * 75 * 1.6) " | sed 's/\..*//')  $(($AVAIL_CORES * 2))   $(($AVAIL_CORES * 1))       600
initdb 17        $(python -c "print round($AVAIL_MEMORY * 75 * 1.7) " | sed 's/\..*//')  $(($AVAIL_CORES * 2))   $(($AVAIL_CORES * 1))       600
initdb 18        $(python -c "print round($AVAIL_MEMORY * 75 * 1.8) " | sed 's/\..*//')  $(($AVAIL_CORES * 2))   $(($AVAIL_CORES * 1))       600
initdb 19        $(python -c "print round($AVAIL_MEMORY * 75 * 1.9) " | sed 's/\..*//')  $(($AVAIL_CORES * 2))   $(($AVAIL_CORES * 1))       600
initdb 20        $(python -c "print round($AVAIL_MEMORY * 75 * 2.0) " | sed 's/\..*//')  $(($AVAIL_CORES * 2))   $(($AVAIL_CORES * 1))       600

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

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