Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion scripts/infra.sh
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
#!/bin/bash
set -euo pipefail

thisdir="$(realpath $(dirname "$0"))"

help() {
Expand Down
194 changes: 194 additions & 0 deletions scripts/perf-lab/README.md

Large diffs are not rendered by default.

56 changes: 56 additions & 0 deletions scripts/perf-lab/helpers/async-profiler.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
name: async-profiler #https://github.com/apangin/async-profiler.git
scripts:
async-profiler-configure:
- read-state: ${{os}}
then:
- regex: linux
then:
- script: sudo
with:
command: sh -c "echo 1 > /proc/sys/kernel/perf_event_paranoid"
- script: sudo
with:
command: sh -c "echo 0 > /proc/sys/kernel/kptr_restrict"

# downloads the latest async-profiler release to ${{BASE_DIR}}/${{ASYNC_PROFILER}}
download-unpack-async-profiler:
- read-state: ${{os}}
then:
- regex: linux
then:
- set-state: platform linux-x64
- set-state: filesuffix .tar.gz
- set-state: unpack_command tar xvf
else:
- set-state: platform macos
- set-state: filesuffix .zip
- set-state: unpack_command unzip
- sh: curl -L -o ${{ASYNC_PROFILER}}${{filesuffix}} $(curl -s -L https://api.github.com/repos/${{ASYNC_PROFILER}}/${{ASYNC_PROFILER}}/releases/latest | jq -r '.assets[] | select(.name | contains ("${{platform}}${{filesuffix}}")) | .browser_download_url') 2>/dev/null
- sh: ${{unpack_command}} ${{ASYNC_PROFILER}}${{filesuffix}}
then:
- regex: (?<subDir>^[^/]+)/
then:
- sh: mv ${{subDir}}/ ${{ASYNC_PROFILER}}

async-profiler-install:
- sh: if test -d ${{ASYNC_PROFILER_DIR}} ; then rm -rf ${{ASYNC_PROFILER_DIR}}; fi
- sh: cd ${{BASE_DIR}}
- script: download-unpack-async-profiler

#waits for ${{WAIT_START}} then ${{DELAY}}, creates a profile using the configured parameters then downloads it immediately
#works with 3.x, not 2.x
async-profiler-run:
- sh: cd ${{ASYNC_PROFILER_DIR}}
- wait-for: ${{wait_start:}} # don't wait by default
- sleep: ${{delay:0}}
- sh: >
bin/asprof
-d ${{duration__10}}
-f /tmp/flamegraph.${{suffix__html}}
-o ${{format__flamegraph}}
-e ${{events__cpu}}
${{="${{enableTotal __ }}".toLowerCase() == "true" ? "--total" : ""}}
--title ${{title__async-profiler}}
${{pid}}
separator: __
- download: /tmp/flamegraph.${{suffix:html}}
41 changes: 41 additions & 0 deletions scripts/perf-lab/helpers/cgroups.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
name: cgroups related scripts
scripts:
join-cgroup:
- set-signal: CGROUP_${{CGROUP_NAME:perf-cgroup}}_SET 1
- wait-for: CGROUP_${{CGROUP_NAME:perf-cgroup}}_SET
- read-state: ${{os}}
then:
- regex: linux
then:
- sh: echo ${{SHELL_PID}} >> /sys/fs/cgroup/${{CGROUP_NAME:perf-cgroup}}/tasks/cgroup.procs
else:
- log: "Non-Linux OS doesn't support cgroups"
- signal: CGROUP_${{CGROUP_NAME:perf-cgroup}}_DONE

create-cgroup:
- read-state: ${{os}}
then:
- regex: linux
then:
- sh: mkdir /sys/fs/cgroup/${{CGROUP_NAME:perf-cgroup}}/
- sh: echo "+cpu" >> /sys/fs/cgroup/${{CGROUP_NAME:perf-cgroup}}/cgroup.subtree_control
- sh: echo "+cpuset" >> /sys/fs/cgroup/${{CGROUP_NAME:perf-cgroup}}/cgroup.subtree_control
- sh: echo "+memory" >> /sys/fs/cgroup/${{CGROUP_NAME:perf-cgroup}}/cgroup.subtree_control
- sh: mkdir /sys/fs/cgroup/${{CGROUP_NAME:perf-cgroup}}/tasks/
- sh: echo ${{CGROUP_CPUSET}} > /sys/fs/cgroup/${{CGROUP_NAME:perf-cgroup}}/tasks/cpuset.cpus
- sh: echo ${{CGROUP_MAX_MEM}} > /sys/fs/cgroup/${{CGROUP_NAME:perf-cgroup}}/tasks/memory.max
else:
- log: "Non-Linux OS doesn't support cgroups"

delete-cgroup:
- read-state: ${{os}}
then:
- regex: linux
then:
- sh: echo "-cpu" >> /sys/fs/cgroup/${{CGROUP_NAME:perf-cgroup}}/cgroup.subtree_control
- sh: echo "-cpuset" >> /sys/fs/cgroup/${{CGROUP_NAME:perf-cgroup}}/cgroup.subtree_control
- sh: echo "-memory" >> /sys/fs/cgroup/${{CGROUP_NAME:perf-cgroup}}/cgroup.subtree_control
- sh: rmdir /sys/fs/cgroup/${{CGROUP_NAME:perf-cgroup}}/tasks/
- sh: rmdir /sys/fs/cgroup/${{CGROUP_NAME:perf-cgroup}}/
else:
- log: "Non-Linux OS doesn't support cgroups"
16 changes: 16 additions & 0 deletions scripts/perf-lab/helpers/homebrew.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
name: Homebrew scripts
scripts:
ensure-homebrew:
- sh:
command: brew help
ignore-exit-code: true
- regex: ".*command not found"
then:
- script: install-homebrew

install-homebrew:
- sh: curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh

install-brew-package:
- script: ensure-homebrew
- sh: brew install -q ${{package}}
20 changes: 20 additions & 0 deletions scripts/perf-lab/helpers/java.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
name: Java related scripts
scripts:
ensure-graalvm:
- script: sdk-select-java
with:
java_version: ${{config.jvm.graalvm.version}}
install_if_missing: true
- log: Setting GRAALVM_HOME
- sh: export GRAALVM_HOME=$(sdk home java ${{config.jvm.graalvm.version}})
- log: Showing GraalVM version
- sh: $GRAALVM_HOME/bin/java -version

ensure-java:
- script: sdk-select-java
with:
java_version: ${{config.jvm.version}}
set_as_default: Y
install_if_missing: true
- log: Showing Java version
- sh: java -version
16 changes: 16 additions & 0 deletions scripts/perf-lab/helpers/jbang.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
name: JBang scripts
scripts:
ensure-jbang-mac:
- script: check-and-install-package
with:
command: jbang
package: jbangdev/tap/jbang

ensure-jbang-linux:
- sh: which jbang
- regex: ".*no jbang in.*"
then:
- sh: "curl -Ls https://sh.jbang.dev | bash -s - app setup"

ensure-jbang:
- script: ensure-jbang-${{os}}
11 changes: 11 additions & 0 deletions scripts/perf-lab/helpers/maven.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
name: Maven scripts
scripts:
check-dependency-exists:
- sh: cd ${{DIR}}
- sh: ./mvnw dependency:get -Dartifact=${{groupId}}:${{artifactId}}:${{version}} -Dpackaging=pom
then:
- regex: BUILD FAILURE
then:
- abort: Unable to find ${{groupId}}:${{artifactId}}:${{version}} in maven central
else:
- log: Artifact ${{groupId}}:${{artifactId}}:${{version}} is available in maven central
76 changes: 76 additions & 0 deletions scripts/perf-lab/helpers/os.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
name: OS-specific/detection scripts
Comment thread
edeandrea marked this conversation as resolved.
scripts:
detect-os:
- sh: uname -a
then:
- regex: ".*Darwin.*"
then:
- set-state: RUN.os macos
- regex: ".*Linux.*"
then:
- set-state: RUN.os linux

capture-os-info:
- sh: uname -m
- set-state: RUN.env.host.ARCH
- sh: uname -r
- set-state: RUN.env.host.RELEASE_LEVEL
- sh: uname -s
- set-state: RUN.env.host.OS
- sh: uname -v
- set-state: RUN.env.host.VERSION_LEVEL

sudo-linux:
- sh: sudo ${{command}}

sudo-macos:
- sh: ${{command}}

sudo:
- script: sudo-${{os}}
with:
command: ${{command}}

check-and-install-package:
- sh: which ${{command}}
- regex: ".*no ${{command}} in.*"
then:
- script: install-package
with:
package: ${{package}}

install-package-linux:
- script: sudo
with:
command: dnf install -y ${{package}}
- regex: "Error: Unable to find a match: ${{package}}"
then:
- abort: "Unable to install package: ${{package}}"
- set-state:
key: RUN.INSTALLED_PACKAGES
value: ${{= [...${{RUN.INSTALLED_PACKAGES:[]}}, '${{package}}'] }}

install-package-macos:
- script: install-brew-package ${{package}}
- regex: "Error: No formulae or casks found for ${{package}}"
then:
- abort: "Unable to install package: ${{package}}"

install-package:
- script: install-package-${{os}}

sync-drop-fs-cache-linux:
- script: sudo
with:
command: sh -c "echo 3 > /proc/sys/vm/drop_caches"

sync-drop-fs-cache-macos:
- sh: sudo purge

sync-drop-fs-cache:
- sh: sync
- read-state: ${{DROP_OS_FILESYSTEM_CACHES:false}}
then:
- regex: true
then:
- script: sync-drop-fs-cache-${{os}}
64 changes: 64 additions & 0 deletions scripts/perf-lab/helpers/requirements.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
name: Requirements needed to run benchmarks
scripts:
ensure-requirements:
- script: ensure-graalvm
- script: ensure-java
- script: ensure-git
- script: ensure-gcc
- script: ensure-nvm
- script: ensure-jbang
- script: ensure-jvm-opts

ensure-jvm-opts:
- read-state: config.profiler.name
then:
- regex: jfr|flamegraph
then:
- set-state: PROFILER_JVM_ARGS -XX:+UnlockDiagnosticVMOptions -XX:+DebugNonSafepoints

ensure-gcc-linux:
- script: check-and-install-package
with:
command: gcc
package: gcc.x86_64 zlib-devel.x86_64

ensure-gcc-macos:
- script: check-and-install-package
with:
command: gcc
package: gcc

ensure-gcc:
- script: ensure-gcc-${{os}}

install-nvm-linux:
- sh: curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash

install-nvm-macos:
- script: check-and-install-package
with:
command: nvm
package: nvm

ensure-nvm:
- sh: which nvm
- regex: ".*no nvm in.*"
then:
- script: install-nvm-${{os}}
- sh: nvm install --lts
- sh: nvm use --lts

ensure-git-linux:
- script: check-and-install-package
with:
command: git
package: git-all

ensure-git-macos:
- script: check-and-install-package
with:
command: git
package: git

ensure-git:
- script: ensure-git-${{os}}
54 changes: 54 additions & 0 deletions scripts/perf-lab/helpers/sdkman.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
name: sdkman helper scripts
scripts:
sdkman-uninstall: #https://sdkman.io/install
- sh: which sdk
- regex: "no sdk in"
else:
- sh: whoami
- regex: (?<me>.*)
- sh: "[[ -d /home/${{me}}/.sdkman ]] && rm -rf /home/${{me}}/.sdkman"
- sh: sed -i 's/#THIS MUST BE AT THE END OF THE FILE FOR SDKMAN TO WORK!!!.*//g' /home/${{me}}/.bashrc
- sh: sed -i 's/export SDKMAN_DIR=.*//g' /home/${{me}}/.bashrc
- sh: sed -i 's/.*.sdkman.*//g' /home/${{me}}/.bashrc

sdkman-install: #https://sdkman.io/install
- sh:
command: sdk help
ignore-exit-code: true
prompt:
"Would you like to upgrade now? (Y/n): ": "Y"
- regex: ".*command not found"
then:
- log: Installing SDKMAN
- sh: curl -s "https://get.sdkman.io" | bash
then:
- regex: "Enjoy"
else:
- abort: failed to install SDKMAN
- sh: source "$HOME/.sdkman/bin/sdkman-init.sh"
else:
- log: Updating SDKMAN
- sh: sdk flush
- sh: sdk selfupdate force
then:
- regex: "Successfully upgraded SDKMAN"
else:
- abort: failed to upgrade SDKMAN
- sh:
command: sdk version
prompt:
"Would you like to upgrade now? (Y/n): ": "Y"
then:
- regex: "SDKMAN (?<RUN.sdk_version>[\\d\\.\\+]+)"

sdk-select-java:
- sh: echo ${{install_if_missing:false}}
then:
- regex: true
then:
- script: sdkman-install
- sh:
command: sdk flush && sdk install java ${{java_version}}
prompt:
"set as default? (Y/n): ": "${{set_as_default:N}}"
- sh: sdk use java ${{java_version}}
17 changes: 17 additions & 0 deletions scripts/perf-lab/helpers/state-array.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
name: state-array functions
scripts:
state-array-push:
- set-state:
key: ${{array}}
value: ${{=[...${{${{array}}¬[]}}, ${{value}}]}}
separator: ¬

state-array-calc-avg:
- set-state:
key: ${{var-name}}
value: ${{= (${{${{array}}}}.reduce((a, b) => a + b, 0) / ${{${{array}}}}.length) || 0 }}

state-array-calc-max:
- set-state:
key: ${{var-name}}
value: ${{= Math.max(...${{${{array}}}}) }}
Loading