Overview | Quick Setup | More Info | Structure | Citing | License & Contrib
For issues and ideas, email [email protected] or, better, open a GitHub issue.
Slowpoke is a system for causally profiling microservice applications, by predicting the effects of service-level optimizations on end-to-end throughput of the entire service graph. It can answer what-if questions of the form "how will the overall throughput of my entire distributed microservice graph improve if I optimize the throughput of this service by 30%?". It does so by relying on a mathematical model parameterizable by service-level information, rather than end-to-end traces or other a priori information that might not be available at the time one wants to explore optimization opportunities.
If you are interested in evaluating the Slowpoke artifact, switch to the frozen nsdi26-ae branch and jump straight into the artifact instructions.
Slowpoke is a causal profiling system for microservice applications that accurately quantifies the effect of hypothetical optimizations on end-to-end throughput, without relying on tracing or a priori knowledge of the call graph.
Microservice operators can use Slowpoke to ask what-if performance analysis questions of the form "What throughput could my retail application sustain if I optimize the shopping cart service from 10K req/s to 20K req/s?".
Given a target service and optimization, Slowpoke employs a performance model that determines how to selectively slow down non-target services to preserve the relative effect of the optimization.
It then performs service-local profiling experiments using its poker component to predict end-to-end throughput as if the candidate optimization was implemented.
Using Slowpoke requires a Kubernetes cluster.
(Optional) AWS Setup
AWS Cluster setup for different account and environment can be quite different. The following setup procedure is just for reference. We do not claim our infrastructure for AWS EC2 setup to be production-ready or reusable as is.- Create AWS access token from AWS account.
- Install
aws-clicommand line tool and set the access token appropriately with aws configure. Also set region explicitly. - Modify the
IMAGE_IDglobal variable inscripts/setup/ec2_cluster.pyto be the Ubuntu image in the region you selected (For example, it isami-0d1b5a8c13042c939for us-east-2) - Create an empty directory for storing cluster information (For example
~/mycluster) - Run cluster setup with
python3 ./scripts/setup/setup_ec2_cluster.py -d ~/mycluster/ -n 12. Replace 12 with desired worker count. - After the script finishes, run
./scripts/setup/initialize-aws.sh ~/myclusterto setup kubernetes on each node - Connect to the control node by running
ssh -i ~/test_cluster/slowpoke-expr.pem ubuntu@$(head -n 1 ~/mycluster/ec2_ips) - (Optional) If you wish to stop the cluster, but not delete them, run
python3 ./scripts/setup/stop_ec2_cluster.py -d ~/mycluster - (Optional) Similarly, to restart
python3 ./scripts/setup/start_ec2_cluster.py -d ~/mycluster - Finally, if you wish to delete the cluster, run
python3 ./scripts/setup/teardown_ec2_cluster.py -d ~/mycluster
Currently Slowpoke supports microservices written in Go. Before using Slowpoke (1) add the Slowpoke runtime to the application, (2) update the container configuration to add Slowpoke's poker controller, (3) set appropriate per-service pauses when launching a deployment. Then, to launch Slowpoke using ./slowpoke.
Using Slowpoke: In more detail, the required to use Slowpoke:
- Application: Add in Slowpoke's runtime, modify http request handler registration to use slowpoke handler wrapper, similar to
cmd/boutique/cart/main.go - Container: the application process now needs to start as a subprocess to the poker controller
slowpoke/poker/poker.c. To do this, include Poker's compilation in the container configuration file as well as the entrypoint command change, similar tobuild/PrebuiltDockerfile. - Deployment: Slowpoke's runtime inserts artificial pauses based on environment variables. Set the following variables similar to
slowpoke/boutique/yamls/cart.yamlto enable Slowpoke tuning them automatically:SLOWPOKE_DELAY_MICROS: This variable is used to pass in pause time per request computed by SlowpokeSLOWPOKE_PRERUN: This variable is used for Slowpoke to specify request distribution collectionSLOWPOKE_POKER_BATCH_THRESHOLD: This variable is used for specifying number of pauses to batch togetherSLOWPOKE_IS_TARGET_SERVICE: This variable indicates that the service is the target service
Launching Slowpoke: Eventually, launcing Slowpoke's end-to-end profiling by running ./slowpoke:
$ slowpoke --help
usage: slowpoke [-h] [-b BENCHMARK] [-t NUM_THREADS] [-c NUM_CONNS] [-x TARGET_SERVICE] [-r REQUEST_TYPE]
[--repetitions REPETITIONS] [--num_exp NUM_EXP] [--pre_run] [--range RANGE RANGE] [--num_req NUM_REQ]
[--clien_cpu_quota CLIEN_CPU_QUOTA] [--random_seed RANDOM_SEED] [--poker_batch POKER_BATCH]
[--poker_batch_req POKER_BATCH_REQ] [--poker_relative_batch POKER_RELATIVE_BATCH]
options:
-h, --help show this help message and exit
-b BENCHMARK, --benchmark BENCHMARK
the benchmark to run the experiment on
-t NUM_THREADS, --num_threads NUM_THREADS
the number of threads to run the experiment on
-c NUM_CONNS, --num_conns NUM_CONNS
the number of connections to run the experiment on
-x TARGET_SERVICE, --target_service TARGET_SERVICE
the target service to run the experiment on
-r REQUEST_TYPE, --request_type REQUEST_TYPE
the request type to run the experiment on
--repetitions REPETITIONS
the number of repetitions to run the experiment on
--num_exp NUM_EXP the number of experiments to run
--pre_run whether to run the experiment with prerun
--range RANGE RANGE
--num_req NUM_REQ
--clien_cpu_quota CLIEN_CPU_QUOTA
--random_seed RANDOM_SEED
--poker_batch POKER_BATCH
--poker_batch_req POKER_BATCH_REQ
--poker_relative_batch POKER_RELATIVE_BATCHFor example:
./slowpoke -b hotel -r mix -x profile --num_exp 10 -t 8 -c 1024 --poker_batch_req 100 --repetition 3 --num_req 50000This repository contains the core development for Slowpoke. The directory structure is organized as follows:
- app: Real-world and synthetic applications augmented with the Slowpoke user library.
- src: Control node component that orchestrates experiments, computes delays, and predicts end-to-end throughput improvement. Also includes
poker, the control process that runs alongside the application within the same container. - scripts: Helper scripts for building application images and setting up EC2 clusters.
- client: Load generator for benchmarking different applications.
- evaluation: YAML files and scripts used to evaluate Slowpoke's accuracy across four real-world and 108 synthetic applications.
If you are using Slowpoke, poker, or any of components in this repository, please cite the following research:
@inproceedings{slowpoke:nsdi:2026,
author = {Yizheng Xie and Di Jin and Oğuzhan Çölkesen and Vasiliki Kalavri and John Liagouris and Nikos Vasilakis},
title = {Slowpoke: End-to-end Throughput Optimization Modeling for Microservice Applications},
booktitle = {23rd USENIX Symposium on Networked Systems Design and Implementation (NSDI 26)},
year = {2026},
address = {Renton, WA},
publisher = {USENIX Association},
month = may
}Slowpoke is an open-source, collaborative, MIT-licensed project developed between the ATLAS group at Brown University and the CASP group at Boston University. If you'd like to contribute, please see the CONTRIBUTING.md file—we welcome contributions! And please come talk to us if you're looking to optimize microservices!
