Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

test(qe-wasm): WASM query engine benchmarks isolated from DB #4567

Merged
merged 42 commits into from
Dec 19, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
c3e0f78
Build wasm query engine within nix environement
SevInf Dec 14, 2023
0e496d9
Record Replay decorator and benches
miguelff Dec 14, 2023
844f485
Move bench
miguelff Dec 14, 2023
ac0526b
Rename index.ts -> testd.ts
miguelff Dec 14, 2023
2bb028a
Don't require to run seed on every run, instead load from DB
miguelff Dec 14, 2023
4f8e1f8
Queries being recorded
miguelff Dec 14, 2023
20b3436
change recording
miguelff Dec 14, 2023
2326523
Remove TX recorders, YAGNI
miguelff Dec 15, 2023
cced23c
Run benches
miguelff Dec 15, 2023
8ab9def
Compare different engines
miguelff Dec 15, 2023
20139b3
Run in GH action
miguelff Dec 15, 2023
3f45fd4
Use direct stdout
miguelff Dec 15, 2023
24dc78d
Fix bench.sh
miguelff Dec 15, 2023
d0d8027
Remove path ignores
miguelff Dec 15, 2023
692bfa3
Output WASM_BUILD_PROFILE
miguelff Dec 15, 2023
7dcbcef
There is a problem with NAPI, pending to be solved on monday
miguelff Dec 15, 2023
a4e77b1
Tweak comment
miguelff Dec 18, 2023
81344f5
Fix NAPI
miguelff Dec 18, 2023
5df58cb
User binder like in any other prisma client
miguelff Dec 18, 2023
8a1c0e9
Compile query-engine-node-api in release mode in CI
miguelff Dec 18, 2023
bfa935b
Reuse comment
miguelff Dec 18, 2023
e97ae83
Workflow text
miguelff Dec 18, 2023
1fda530
Fix target for nodejs
miguelff Dec 18, 2023
6ae00ab
Fail fast and output to file
miguelff Dec 18, 2023
5d1fdca
Renames
miguelff Dec 18, 2023
30b31ce
Profile
miguelff Dec 18, 2023
0fb610c
Install cargo wasm using recommended install
miguelff Dec 18, 2023
20acc74
Use nix for building
miguelff Dec 18, 2023
b6400d7
Build with profile
miguelff Dec 18, 2023
14ce198
Fix tee
miguelff Dec 18, 2023
e40d8b5
multiline output
miguelff Dec 18, 2023
8245651
Summarize results
miguelff Dec 18, 2023
8dee3aa
Reformat json queries
miguelff Dec 19, 2023
3966a43
Nit in message
miguelff Dec 19, 2023
a098e19
Tmp: make benchmarks fail.
miguelff Dec 19, 2023
663e204
Merge branch 'main' into da-benchmarks
jkomyno Dec 19, 2023
716d886
Allow only 1% deviation in benchmarks to account for noise
miguelff Dec 19, 2023
cecea04
First round of feedback
miguelff Dec 19, 2023
20bfd45
Remove bench.ts and read schema from fs
miguelff Dec 19, 2023
41ff566
Rename adapter -> engine and use path.resolve
miguelff Dec 19, 2023
f03cef3
Take back paths ignore
miguelff Dec 19, 2023
ee4fc7a
Change indentation of queries.json
miguelff Dec 19, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
107 changes: 107 additions & 0 deletions .github/workflows/wasm-benhmarks.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
name: Wasm perf
on:
pull_request:
miguelff marked this conversation as resolved.
Show resolved Hide resolved
paths-ignore:
- ".github/**"
- "!.github/workflows/wasm-benchmarks.yml"
- ".buildkite/**"
- "*.md"
- "LICENSE"
- "CODEOWNERS"
- "renovate.json"

jobs:
benchmarks:
runs-on: ubuntu-latest
env: # Set environment variables for the whole job
PROFILE: release
steps:
- name: Checkout PR branch
uses: actions/checkout@v4

- name: "Setup Node.js"
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node_version }}

- name: "Setup pnpm"
uses: pnpm/action-setup@v2
with:
version: 8

- name: "Login to Docker Hub"
uses: docker/login-action@v3
continue-on-error: true
env:
DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }}
DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }}
if: "${{ env.DOCKERHUB_USERNAME != '' && env.DOCKERHUB_TOKEN != '' }}"
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}

- uses: cachix/install-nix-action@v24

- name: Setup benchmark
run: make setup-pg-bench

- name: Run benchmarks
id: bench
run: make run-bench | tee out.txt

- name: Read benchmark results
id: read_results
run: |
{
echo 'bench_output<<EOF'
cat out.txt
echo EOF
} >> "$GITHUB_OUTPUT"

- name: Summarize results
id: summarize_results
run: |
input="${{ steps.read_results.outputs.bench_output }}"
regressed=$(echo "$input" | grep "slower than Web Assembly: Latest" | cut -f1 -d'x' | awk '$1 > 1.01' | wc -l )
if [ "$regressed" -gt 0 ]; then
message="🚨 WASM query-engine: $regressed benchmark(s) have regressed at least 1%"
status=failed
else
message="✅ WASM query-engine: no benchmarks have regressed"
status=passed
fi
echo "summary=$message" >> $GITHUB_OUTPUT
echo "status=$status" >> $GITHUB_OUTPUT

- name: Find past report comment
uses: peter-evans/find-comment@v2
id: findReportComment
with:
issue-number: ${{ github.event.pull_request.number }}
body-includes: "<!-- wasm-engine-perf -->"

- name: Create or update report
uses: peter-evans/create-or-update-comment@v3
with:
comment-id: ${{ steps.findReportComment.outputs.comment-id }}
issue-number: ${{ github.event.pull_request.number }}
body: |
<!-- wasm-engine-perf -->
#### ${{ steps.summarize_results.outputs.summary }}

<details>
<summary>Full benchmark report</summary>

```
${{ steps.read_results.outputs.bench_output }}
```
</details>

After changes in ${{ github.event.pull_request.head.sha }}
edit-mode: replace

- name: Fail workflow if regression detected
if: steps.summarize_results.outputs.status == 'failed'
run: |
echo "Workflow failed due to benchmark regression."
exit 1
35 changes: 24 additions & 11 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ LIBRARY_EXT := $(shell \
(*) echo "so" ;; \
esac)

PROFILE ?= dev

default: build

###################
Expand Down Expand Up @@ -88,14 +90,14 @@ start-sqlite:
dev-sqlite:
cp $(CONFIG_PATH)/sqlite $(CONFIG_FILE)

dev-libsql-js: build-qe-napi build-connector-kit-js
dev-libsql-js: build-qe-napi build-driver-adapters-kit
cp $(CONFIG_PATH)/libsql-js $(CONFIG_FILE)

test-libsql-js: dev-libsql-js test-qe-st

test-driver-adapter-libsql: test-libsql-js

dev-libsql-wasm: build-qe-wasm build-connector-kit-js
dev-libsql-wasm: build-qe-wasm build-driver-adapters-kit
cp $(CONFIG_PATH)/libsql-wasm $(CONFIG_FILE)

test-libsql-wasm: dev-libsql-wasm test-qe-st
Expand Down Expand Up @@ -133,28 +135,39 @@ dev-postgres13: start-postgres13

start-pg-js: start-postgres13

dev-pg-js: start-pg-js build-qe-napi build-connector-kit-js
dev-pg-js: start-pg-js build-qe-napi build-driver-adapters-kit
cp $(CONFIG_PATH)/pg-js $(CONFIG_FILE)

test-pg-js: dev-pg-js test-qe-st

dev-pg-wasm: start-pg-js build-qe-wasm build-connector-kit-js
dev-pg-wasm: start-pg-js build-qe-wasm build-driver-adapters-kit
cp $(CONFIG_PATH)/pg-wasm $(CONFIG_FILE)

test-pg-wasm: dev-pg-wasm test-qe-st

test-driver-adapter-pg: test-pg-js
test-driver-adapter-pg-wasm: test-pg-wasm

start-pg-bench:
docker compose -f query-engine/driver-adapters/executor/bench/docker-compose.yml up --wait -d --remove-orphans postgres
Comment on lines +151 to +152
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.


setup-pg-bench: start-pg-bench build-qe-napi build-qe-wasm build-driver-adapters-kit

run-bench:
DATABASE_URL="postgresql://postgres:postgres@localhost:5432/bench?schema=imdb_bench&sslmode=disable" \
node --experimental-wasm-modules query-engine/driver-adapters/executor/dist/bench.mjs

bench-pg-js: setup-pg-bench run-bench

start-neon-js:
docker compose -f docker-compose.yml up --wait -d --remove-orphans neon-proxy

dev-neon-js: start-neon-js build-qe-napi build-connector-kit-js
dev-neon-js: start-neon-js build-qe-napi build-driver-adapters-kit
cp $(CONFIG_PATH)/neon-js $(CONFIG_FILE)

test-neon-js: dev-neon-js test-qe-st

dev-neon-wasm: start-neon-js build-qe-wasm build-connector-kit-js
dev-neon-wasm: start-neon-js build-qe-wasm build-driver-adapters-kit
cp $(CONFIG_PATH)/neon-wasm $(CONFIG_FILE)

test-neon-wasm: dev-neon-wasm test-qe-st
Expand Down Expand Up @@ -293,12 +306,12 @@ dev-vitess_8_0: start-vitess_8_0
start-planetscale-js:
docker compose -f docker-compose.yml up -d --remove-orphans planetscale-proxy

dev-planetscale-js: start-planetscale-js build-qe-napi build-connector-kit-js
dev-planetscale-js: start-planetscale-js build-qe-napi build-driver-adapters-kit
cp $(CONFIG_PATH)/planetscale-js $(CONFIG_FILE)

test-planetscale-js: dev-planetscale-js test-qe-st

dev-planetscale-wasm: start-planetscale-js build-qe-wasm build-connector-kit-js
dev-planetscale-wasm: start-planetscale-js build-qe-wasm build-driver-adapters-kit
cp $(CONFIG_PATH)/planetscale-wasm $(CONFIG_FILE)

test-planetscale-wasm: dev-planetscale-wasm test-qe-st
Expand All @@ -311,7 +324,7 @@ test-driver-adapter-planetscale-wasm: test-planetscale-wasm
######################

build-qe-napi:
cargo build --package query-engine-node-api
cargo build --package query-engine-node-api --profile $(PROFILE)

build-qe-wasm:
ifndef $(NIX)
Expand All @@ -322,7 +335,7 @@ else
cd query-engine/query-engine-wasm && ./build.sh
endif

build-connector-kit-js: build-driver-adapters
build-driver-adapters-kit: build-driver-adapters
cd query-engine/driver-adapters && pnpm i && pnpm build

build-driver-adapters: ensure-prisma-present
Expand Down Expand Up @@ -384,7 +397,7 @@ otel:

# Build the debug version of Query Engine Node-API library ready to be consumed by Node.js
.PHONY: qe-node-api
qe-node-api: build target/debug/libquery_engine.node
qe-node-api: build target/debug/libquery_engine.node --profile=$(PROFILE)

%.node: %.$(LIBRARY_EXT)
# Remove the file first to work around a macOS bug: https://openradar.appspot.com/FB8914243
Expand Down
2 changes: 2 additions & 0 deletions nix/all-engines.nix
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,8 @@ in
})
{ profile = "release"; };



packages.query-engine-wasm = lib.makeOverridable
({ profile }: stdenv.mkDerivation {
name = "query-engine-wasm";
Expand Down
2 changes: 1 addition & 1 deletion query-engine/connector-test-kit-rs/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ To run tests through a driver adapters, you should also configure the following
Example:

```shell
export EXTERNAL_TEST_EXECUTOR="$WORKSPACE_ROOT/query-engine/driver-adapters/connector-test-kit-executor/script/start_node.sh"
export EXTERNAL_TEST_EXECUTOR="$WORKSPACE_ROOT/query-engine/driver-adapters/executor/script/testd.sh"
export DRIVER_ADAPTER=neon
export ENGINE=wasm
export DRIVER_ADAPTER_CONFIG ='{ "proxyUrl": "127.0.0.1:5488/v1" }'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -183,8 +183,7 @@ impl TestConfig {
}

pub fn external_test_executor_path(&self) -> Option<String> {
const DEFAULT_TEST_EXECUTOR: &str =
"query-engine/driver-adapters/connector-test-kit-executor/script/start_node.sh";
const DEFAULT_TEST_EXECUTOR: &str = "query-engine/driver-adapters/executor/script/testd.sh";
self.external_test_executor
.as_ref()
.and_then(|_| {
Expand Down

This file was deleted.

This file was deleted.

4 changes: 4 additions & 0 deletions query-engine/driver-adapters/executor/bench/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
FROM postgres:15
COPY seed.sql.gz .
RUN gunzip seed.sql.gz && \
mv seed.sql /docker-entrypoint-initdb.d/seed.sql
25 changes: 25 additions & 0 deletions query-engine/driver-adapters/executor/bench/docker-compose.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
version: '3.8'

name: bench

services:
postgres:
build:
context: .
dockerfile: Dockerfile
shm_size: 1g
restart: unless-stopped
# Uncomment the following line to enable query logging
# Then restart the container.
# command: ['postgres', '-c', 'log_statement=all']
environment:
- POSTGRES_DB=bench
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
ports:
- '5432:5432'
healthcheck:
test: ['CMD', 'pg_isready']
interval: 5s
timeout: 2s
retries: 20