mirror of
https://github.com/neondatabase/neon.git
synced 2026-01-14 17:02:56 +00:00
Commit 43a4f7173e fixed the case that there are extra options in the
connection string, but broke it in the case when there are not. Fix
that. But on second thoughts, it's more straightforward set the
options with ALTER DATABASE, so change the workflow yaml file to do
that instead.
277 lines
11 KiB
YAML
277 lines
11 KiB
YAML
name: Benchmarking
|
|
|
|
on:
|
|
# uncomment to run on push for debugging your PR
|
|
# push:
|
|
# branches: [ your branch ]
|
|
schedule:
|
|
# * is a special character in YAML so you have to quote this string
|
|
# ┌───────────── minute (0 - 59)
|
|
# │ ┌───────────── hour (0 - 23)
|
|
# │ │ ┌───────────── day of the month (1 - 31)
|
|
# │ │ │ ┌───────────── month (1 - 12 or JAN-DEC)
|
|
# │ │ │ │ ┌───────────── day of the week (0 - 6 or SUN-SAT)
|
|
- cron: '0 3 * * *' # run once a day, timezone is utc
|
|
|
|
workflow_dispatch: # adds ability to run this manually
|
|
inputs:
|
|
environment:
|
|
description: 'Environment to run remote tests on (dev or staging)'
|
|
required: false
|
|
region_id:
|
|
description: 'Use a particular region. If not set the default region will be used'
|
|
required: false
|
|
save_perf_report:
|
|
type: boolean
|
|
description: 'Publish perf report or not. If not set, the report is published only for the main branch'
|
|
required: false
|
|
|
|
defaults:
|
|
run:
|
|
shell: bash -euxo pipefail {0}
|
|
|
|
concurrency:
|
|
# Allow only one workflow per any non-`main` branch.
|
|
group: ${{ github.workflow }}-${{ github.ref }}-${{ github.ref == 'refs/heads/main' && github.sha || 'anysha' }}
|
|
cancel-in-progress: true
|
|
|
|
jobs:
|
|
bench:
|
|
# this workflow runs on self hosteed runner
|
|
# it's environment is quite different from usual guthub runner
|
|
# probably the most important difference is that it doesn't start from clean workspace each time
|
|
# e g if you install system packages they are not cleaned up since you install them directly in host machine
|
|
# not a container or something
|
|
# See documentation for more info: https://docs.github.com/en/actions/hosting-your-own-runners/about-self-hosted-runners
|
|
runs-on: [self-hosted, zenith-benchmarker]
|
|
|
|
env:
|
|
POSTGRES_DISTRIB_DIR: "/usr/pgsql-14"
|
|
|
|
steps:
|
|
- name: Checkout zenith repo
|
|
uses: actions/checkout@v3
|
|
|
|
# actions/setup-python@v2 is not working correctly on self-hosted runners
|
|
# see https://github.com/actions/setup-python/issues/162
|
|
# and probably https://github.com/actions/setup-python/issues/162#issuecomment-865387976 in particular
|
|
# so the simplest solution to me is to use already installed system python and spin virtualenvs for job runs.
|
|
# there is Python 3.7.10 already installed on the machine so use it to install poetry and then use poetry's virtuealenvs
|
|
- name: Install poetry & deps
|
|
run: |
|
|
python3 -m pip install --upgrade poetry wheel
|
|
# since pip/poetry caches are reused there shouldn't be any troubles with install every time
|
|
./scripts/pysync
|
|
|
|
- name: Show versions
|
|
run: |
|
|
echo Python
|
|
python3 --version
|
|
poetry run python3 --version
|
|
echo Poetry
|
|
poetry --version
|
|
echo Pgbench
|
|
$POSTGRES_DISTRIB_DIR/bin/pgbench --version
|
|
|
|
- name: Create Neon Project
|
|
id: create-neon-project
|
|
uses: ./.github/actions/neon-project-create
|
|
with:
|
|
environment: ${{ github.event.inputs.environment || 'staging' }}
|
|
api_key: ${{ ( github.event.inputs.environment || 'staging' ) == 'staging' && secrets.NEON_STAGING_API_KEY || secrets.NEON_CAPTEST_API_KEY }}
|
|
|
|
- name: Run benchmark
|
|
# pgbench is installed system wide from official repo
|
|
# https://download.postgresql.org/pub/repos/yum/13/redhat/rhel-7-x86_64/
|
|
# via
|
|
# sudo tee /etc/yum.repos.d/pgdg.repo<<EOF
|
|
# [pgdg13]
|
|
# name=PostgreSQL 13 for RHEL/CentOS 7 - x86_64
|
|
# baseurl=https://download.postgresql.org/pub/repos/yum/13/redhat/rhel-7-x86_64/
|
|
# enabled=1
|
|
# gpgcheck=0
|
|
# EOF
|
|
# sudo yum makecache
|
|
# sudo yum install postgresql13-contrib
|
|
# actual binaries are located in /usr/pgsql-13/bin/
|
|
env:
|
|
# The pgbench test runs two tests of given duration against each scale.
|
|
# So the total runtime with these parameters is 2 * 2 * 300 = 1200, or 20 minutes.
|
|
# Plus time needed to initialize the test databases.
|
|
TEST_PG_BENCH_DURATIONS_MATRIX: "300"
|
|
TEST_PG_BENCH_SCALES_MATRIX: "10,100"
|
|
PLATFORM: "neon-staging"
|
|
BENCHMARK_CONNSTR: ${{ steps.create-neon-project.outputs.dsn }}
|
|
REMOTE_ENV: "1" # indicate to test harness that we do not have zenith binaries locally
|
|
run: |
|
|
# just to be sure that no data was cached on self hosted runner
|
|
# since it might generate duplicates when calling ingest_perf_test_result.py
|
|
rm -rf perf-report-staging
|
|
mkdir -p perf-report-staging
|
|
# Set --sparse-ordering option of pytest-order plugin to ensure tests are running in order of appears in the file,
|
|
# it's important for test_perf_pgbench.py::test_pgbench_remote_* tests
|
|
./scripts/pytest test_runner/performance/ -v -m "remote_cluster" --sparse-ordering --out-dir perf-report-staging --timeout 5400
|
|
|
|
- name: Submit result
|
|
env:
|
|
VIP_VAP_ACCESS_TOKEN: "${{ secrets.VIP_VAP_ACCESS_TOKEN }}"
|
|
PERF_TEST_RESULT_CONNSTR: "${{ secrets.PERF_TEST_RESULT_CONNSTR }}"
|
|
run: |
|
|
REPORT_FROM=$(realpath perf-report-staging) REPORT_TO=staging scripts/generate_and_push_perf_report.sh
|
|
|
|
- name: Delete Neon Project
|
|
if: ${{ always() }}
|
|
uses: ./.github/actions/neon-project-delete
|
|
with:
|
|
environment: staging
|
|
project_id: ${{ steps.create-neon-project.outputs.project_id }}
|
|
api_key: ${{ secrets.NEON_STAGING_API_KEY }}
|
|
|
|
- name: Post to a Slack channel
|
|
if: ${{ github.event.schedule && failure() }}
|
|
uses: slackapi/slack-github-action@v1
|
|
with:
|
|
channel-id: "C033QLM5P7D" # dev-staging-stream
|
|
slack-message: "Periodic perf testing: ${{ job.status }}\n${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}"
|
|
env:
|
|
SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }}
|
|
|
|
pgbench-compare:
|
|
env:
|
|
TEST_PG_BENCH_DURATIONS_MATRIX: "60m"
|
|
TEST_PG_BENCH_SCALES_MATRIX: "10gb"
|
|
POSTGRES_DISTRIB_DIR: /usr
|
|
TEST_OUTPUT: /tmp/test_output
|
|
BUILD_TYPE: remote
|
|
SAVE_PERF_REPORT: ${{ github.event.inputs.save_perf_report || ( github.ref == 'refs/heads/main' ) }}
|
|
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
# neon-captest-new: Run pgbench in a freshly created project
|
|
# neon-captest-reuse: Same, but reusing existing project
|
|
# neon-captest-prefetch: Same, with prefetching enabled (new project)
|
|
platform: [ neon-captest-new, neon-captest-reuse, neon-captest-prefetch, rds-aurora ]
|
|
|
|
runs-on: dev
|
|
container:
|
|
image: 369495373322.dkr.ecr.eu-central-1.amazonaws.com/rustlegacy:pinned
|
|
options: --init
|
|
|
|
timeout-minutes: 360 # 6h
|
|
|
|
steps:
|
|
- uses: actions/checkout@v3
|
|
|
|
- name: Install Deps
|
|
run: |
|
|
sudo apt -y update
|
|
sudo apt install -y postgresql-14
|
|
|
|
- name: Create Neon Project
|
|
if: matrix.platform != 'neon-captest-reuse'
|
|
id: create-neon-project
|
|
uses: ./.github/actions/neon-project-create
|
|
with:
|
|
environment: ${{ github.event.inputs.environment || 'dev' }}
|
|
api_key: ${{ ( github.event.inputs.environment || 'dev' ) == 'staging' && secrets.NEON_STAGING_API_KEY || secrets.NEON_CAPTEST_API_KEY }}
|
|
|
|
- name: Set up Connection String
|
|
id: set-up-connstr
|
|
run: |
|
|
case "${PLATFORM}" in
|
|
neon-captest-reuse)
|
|
CONNSTR=${{ secrets.BENCHMARK_CAPTEST_CONNSTR }}
|
|
;;
|
|
neon-captest-new | neon-captest-prefetch)
|
|
CONNSTR=${{ steps.create-neon-project.outputs.dsn }}
|
|
;;
|
|
rds-aurora)
|
|
CONNSTR=${{ secrets.BENCHMARK_RDS_CONNSTR }}
|
|
;;
|
|
*)
|
|
echo 2>&1 "Unknown PLATFORM=${PLATFORM}. Allowed only 'neon-captest-reuse', 'neon-captest-new', 'neon-captest-prefetch' or 'rds-aurora'"
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
echo "::set-output name=connstr::${CONNSTR}"
|
|
|
|
psql ${CONNSTR} -c "SELECT version();"
|
|
env:
|
|
PLATFORM: ${{ matrix.platform }}
|
|
|
|
- name: Set database options
|
|
if: matrix.platform == 'neon-captest-prefetch'
|
|
run: |
|
|
psql ${BENCHMARK_CONNSTR} -c "ALTER DATABASE main SET enable_seqscan_prefetch=on"
|
|
psql ${BENCHMARK_CONNSTR} -c "ALTER DATABASE main SET seqscan_prefetch_buffers=10"
|
|
env:
|
|
BENCHMARK_CONNSTR: ${{ steps.set-up-connstr.outputs.connstr }}
|
|
|
|
- name: Benchmark init
|
|
uses: ./.github/actions/run-python-test-set
|
|
with:
|
|
build_type: ${{ env.BUILD_TYPE }}
|
|
test_selection: performance
|
|
run_in_parallel: false
|
|
save_perf_report: ${{ env.SAVE_PERF_REPORT }}
|
|
extra_params: -m remote_cluster --timeout 21600 -k test_pgbench_remote_init
|
|
env:
|
|
PLATFORM: ${{ matrix.platform }}
|
|
BENCHMARK_CONNSTR: ${{ steps.set-up-connstr.outputs.connstr }}
|
|
VIP_VAP_ACCESS_TOKEN: "${{ secrets.VIP_VAP_ACCESS_TOKEN }}"
|
|
PERF_TEST_RESULT_CONNSTR: "${{ secrets.PERF_TEST_RESULT_CONNSTR }}"
|
|
|
|
- name: Benchmark simple-update
|
|
uses: ./.github/actions/run-python-test-set
|
|
with:
|
|
build_type: ${{ env.BUILD_TYPE }}
|
|
test_selection: performance
|
|
run_in_parallel: false
|
|
save_perf_report: ${{ env.SAVE_PERF_REPORT }}
|
|
extra_params: -m remote_cluster --timeout 21600 -k test_pgbench_remote_simple_update
|
|
env:
|
|
PLATFORM: ${{ matrix.platform }}
|
|
BENCHMARK_CONNSTR: ${{ steps.set-up-connstr.outputs.connstr }}
|
|
VIP_VAP_ACCESS_TOKEN: "${{ secrets.VIP_VAP_ACCESS_TOKEN }}"
|
|
PERF_TEST_RESULT_CONNSTR: "${{ secrets.PERF_TEST_RESULT_CONNSTR }}"
|
|
|
|
- name: Benchmark select-only
|
|
uses: ./.github/actions/run-python-test-set
|
|
with:
|
|
build_type: ${{ env.BUILD_TYPE }}
|
|
test_selection: performance
|
|
run_in_parallel: false
|
|
save_perf_report: ${{ env.SAVE_PERF_REPORT }}
|
|
extra_params: -m remote_cluster --timeout 21600 -k test_pgbench_remote_select_only
|
|
env:
|
|
PLATFORM: ${{ matrix.platform }}
|
|
BENCHMARK_CONNSTR: ${{ steps.set-up-connstr.outputs.connstr }}
|
|
VIP_VAP_ACCESS_TOKEN: "${{ secrets.VIP_VAP_ACCESS_TOKEN }}"
|
|
PERF_TEST_RESULT_CONNSTR: "${{ secrets.PERF_TEST_RESULT_CONNSTR }}"
|
|
|
|
- name: Create Allure report
|
|
if: always()
|
|
uses: ./.github/actions/allure-report
|
|
with:
|
|
action: generate
|
|
build_type: ${{ env.BUILD_TYPE }}
|
|
|
|
- name: Delete Neon Project
|
|
if: ${{ matrix.platform != 'neon-captest-reuse' && always() }}
|
|
uses: ./.github/actions/neon-project-delete
|
|
with:
|
|
environment: dev
|
|
project_id: ${{ steps.create-neon-project.outputs.project_id }}
|
|
api_key: ${{ secrets.NEON_CAPTEST_API_KEY }}
|
|
|
|
- name: Post to a Slack channel
|
|
if: ${{ github.event.schedule && failure() }}
|
|
uses: slackapi/slack-github-action@v1
|
|
with:
|
|
channel-id: "C033QLM5P7D" # dev-staging-stream
|
|
slack-message: "Periodic perf testing ${{ matrix.platform }}: ${{ job.status }}\n${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}"
|
|
env:
|
|
SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }}
|