Dapr 性能测试运行实战本地环境、CI 流程与 Grafana 指标可视化【免费下载链接】daprDapr is a portable runtime for building distributed applications across cloud and edge, combining event-driven architecture with workflow orchestration.项目地址: https://gitcode.com/GitHub_Trending/da/dapr本文以 Dapr 仓库中的 tests/docs/running-perf-tests.md 为主线系统讲解如何在本地开发环境中构建并部署自定义 Dapr 运行时、在 KubernetesKind / Minikube集群上运行 Fortio 与 k6 两类负载测试、通过 GitHub Actions 触发 CI 性能测试以及借助 Prometheus Grafana 将延迟、吞吐、CPU 与内存指标可视化。读完本文你将掌握由make目标驱动的整套性能测试工作流包括环境准备、测试应用镜像构建、测试筛选、报告图表生成与测试数据清理并了解每一条命令背后的源码实现与默认参数。一、性能测试概览测什么、怎么测Dapr 的性能测试performance tests目标是在给定硬件环境下评估 Dapr 的延迟latency、资源占用resource usage与处理时间processing time。测试由 Go 测试框架驱动通过-tagsperf构建标记与普通单元测试、E2E 测试隔离负载生成由两类工具承担Fortio用于基于 Fortio 的 HTTP/gRPC 压测场景对应的测试应用是testerk6用于脚本化负载场景如工作流、订阅类测试对应的测试应用是k6-custom需要额外安装 k6-operator。从 tests/dapr_tests.mk 可以看到当前仓库定义的完整性能测试套件PERF_TESTSactor_activation actor_double_activation actor_id_scale actor_reminder actor_timer actor_type_scale configuration pubsub_bulk_publish_grpc pubsub_bulk_publish_http pubsub_publish_grpc pubsub_publish_http pubsub_subscribe_http scheduler service_invocation_grpc service_invocation_http state_get_grpc state_get_http workflows这些测试目录均位于 tests/perf 下例如actor_activation/、service_invocation_http/、workflows/等每个目录是一个独立的 Go 测试包。二、在本地开发环境运行性能测试2.1 前置条件运行性能测试前需要准备Kubernetes 集群Minikube 或 Kind 均可。使用 Kind 时可直接运行make setup-kind创建集群与本地 registry。该命令定义于 tests/dapr_tests.mk 的setup-kind目标会执行kind create cluster --config ./tests/config/kind.yaml --name $(DAPR_TEST_KIND_CLUSTER_NAME)其中DAPR_TEST_KIND_CLUSTER_NAME默认值为kind因此默认集群上下文名为kind-kind启动本地 registry 容器docker run -d --restartalways -p $(DAPR_TEST_REGISTRY_PORT):$(DAPR_TEST_REGISTRY_PORT) --name kind-registry registry:2并将它接入kind网络安装 metrics-server--kubelet-insecure-tls供资源指标采集使用。注意make setup-kind创建的默认集群名kind-kind会被自动用于判断测试是否运行在本地 Kind 集群中。如需改名先执行export DAPR_TEST_KIND_CLUSTER_NAMEmycluster对应上下文kind-mycluster再运行make setup-kind。注意macOS Ventura 及以上本地 registry 默认端口5000可能被 AirPlay Receiver 服务占用可用export DAPR_TEST_REGISTRY_PORT5001换端口后执行make setup-kind。Kind 环境下运行make describe-kind-env可打印出所需的 export 命令包括MINIKUBE_NODE_IP、DAPR_REGISTRYlocalhost:port/dapr、DAPR_TAGdev、DAPR_NAMESPACEdapr-tests等直接复制粘贴到终端即可。使用 Minikube 时对应有make setup-minikube启动 4 核 4GB 集群并启用 metrics-serverApple Silicon 下使用 qemu 驱动与make describe-minikube-env两个目标。Dapr 开发环境按 docs/development/setup-dapr-development-env.md 完成搭建并安装最新版 Helm v3。DockerHub 账号用于存放 Dapr 运行时镜像与测试应用镜像。创建测试命名空间kubectl create namespace dapr-tests2.2 设置环境变量export DAPR_REGISTRYdocker.io/your_dockerhub_id export DAPR_TAGdev export DAPR_NAMESPACEdapr-tests # 不使用 minikube 时不要设置 DAPR_TEST_ENV export DAPR_TEST_ENVminikube # 若测试应用希望使用不同的 registry 与 tag取消下面注释 # export DAPR_TEST_REGISTRYdocker.io/your_dockerhub_id # export DARP_TEST_TAGdev # export DAPR_TEST_REGISTRY_SECRETyourself_private_image_secret其中DAPR_TEST_REGISTRY、DAPR_TEST_TAG未显式设置时会分别回落到DAPR_REGISTRY与DAPR_TAG-$(TARGET_OS)-$(TARGET_ARCH)见 tests/dapr_tests.mk 中的ifeq逻辑DAPR_TEST_NAMESPACE默认等于DAPR_NAMESPACE。Fortio 测试专用参数下面的环境变量用于配置基于 Fortio 的测试make test-perf-all等目标会以gotestsum的进程环境将它们传给测试程序。这些变量最终通过 tests/perf/test_params.go 中的useEnvVar机制覆盖代码内选项——即环境变量优先级高于代码默认值与手动设置的选项环境变量作用文档注释中的默认值源码实际默认值DAPR_PERF_QPS每秒请求数1defaultQPS 1DAPR_PERF_CONNECTIONS发送请求到 Dapr 的客户端连接数1defaultClientConnections 1DAPR_TEST_DURATION测试时长1mdefaultTestDuration 1mDAPR_PAYLOAD_SIZE测试载荷大小字节/千字节0defaultPayloadSizeKB 0DAPR_SIDECAR_CPU_LIMITDapr sidecar CPU limit4.0defaultSidecarCPULimit 1.0DAPR_SIDECAR_MEMORY_LIMITDapr sidecar 内存 limit512MidefaultSidecarMemoryLimit 256MiDAPR_SIDECAR_CPU_REQUESTDapr sidecar CPU request0.5defaultSidecarCPURequest 0.1DAPR_SIDECAR_MEMORY_REQUESTDapr sidecar 内存 request250MidefaultSidecarMemoryRequest 100Mi一致性提醒文档注释给出的 sidecar 资源默认值与当前仓库源码tests/runner/kube_testplatform.go 中的defaultSidecar*常量不一致实际生效值以源码为准。这些 sidecar 资源参数会在测试部署应用时写入 Pod 的 requests/limits 中用于观察不同资源配置下的性能表现。对应导出命令为export DAPR_PERF_QPS export DAPR_PERF_CONNECTIONS export DAPR_TEST_DURATION export DAPR_PAYLOAD_SIZE export DAPR_SIDECAR_CPU_LIMIT export DAPR_SIDECAR_MEMORY_LIMIT export DAPR_SIDECAR_CPU_REQUEST export DAPR_SIDECAR_MEMORY_REQUEST此外tests/perf/test_params.go还支持DAPR_PAYLOAD直接指定载荷内容且toStrParam会在字符串转 int 失败时静默降级为 no-op不会中断测试。2.3 部署你的 Dapr 运行时变更性能测试的意义在于评估你本地改动的 Dapr 代码的表现因此需要先把本地源码构建为镜像并部署到集群# 构建 Linux 二进制 make build-linux # 用 Linux 二进制构建 Docker 镜像 make docker-build # 推送镜像到你的 DockerHub registry make docker-push # 将 Dapr 运行时部署到当前 Kubernetes 集群 make docker-deploy-k8s # 安装第三方软件Redis、Kafka、Zipkin、PostgreSQL 等 make setup-3rd-partyApple SiliconM 芯片注意构建前需设置目标架构export TARGET_ARCHarm64从源码看make build-linuxMakefile 中build-linux目标会为daprd、injector、operator、placement、scheduler、sentry等二进制逐一执行CGO_ENABLED$(CGO) GOOSlinux GOARCH$(GOARCH) go build而docker-deploy-k8s实际通过helm upgrade --install将 charts/dapr 部署到DAPR_NAMESPACE并读取DAPR_MTLS_ENABLED默认true、DAPR_TEST_REGISTRY_SECRET、HA_MODE等变量global.mtls.enabled会随之变化——这解释了后文“禁用 mTLS”步骤的由来。make setup-3rd-party则串联安装 Redis、Kafka、Zipkin、PostgreSQL见 tests/dapr_tests.mk 的setup-3rd-party与setup-test-env-*系列目标。2.4 注册应用配置make setup-app-configurations该目标实际执行kubectl apply -f ./tests/config/dapr_observability_test_config.yaml见 tests/dapr_tests.mk用于在DAPR_TEST_NAMESPACE中注册测试用的 Dapr 配置。2.5 可选关闭追踪与 mTLS禁用追踪telemetry性能测试默认开启追踪会影响延迟数据可通过环境变量关闭export DAPR_DISABLE_TELEMETRYtrue该变量在 tests/runner/kube_testplatform.go 的disableTelemetry()中解析只有解析为布尔true时才生效。禁用 mTLS默认开启make setup-disable-mtls该目标应用 tests/config/dapr_mtls_off_config.yaml关闭后可在非加密链路上测得更接近应用层的延迟数据。2.6 注册测试组件配置make setup-test-components该目标tests/dapr_tests.mk 的setup-test-components会依次kubectl apply大量组件与配置清单覆盖状态存储dapr_$(DAPR_TEST_STATE_STORE)_state.yaml等DAPR_TEST_STATE_STORE默认postgres、Actor 状态存储、查询状态、pubsubdapr_$(DAPR_TEST_PUBSUB)_pubsub.yaml默认redis、配置存储默认redis、加密组件默认jwks、Kafka 绑定与自定义路由、订阅路由、allowlists、工作流访问控制、resiliency、内存态组件等并在最后打印kubectl get components与kubectl get configurations以确认安装结果。测试框架还支持通过DAPR_TEST_QUERY_STATE_STORE、DAPR_TEST_CONFIG_STORE、DAPR_TEST_CRYPTO等变量切换被测后端。2.7 构建并推送测试应用镜像测试应用源码位于tests/apps/性能测试应用位于tests/apps/perf/。全量构建与推送# 构建 tests/apps 下的性能测试应用镜像 make build-perf-app-all # 推送性能测试应用镜像到 DockerHub make push-perf-app-all也可以按应用单独构建、推送make build-perf-app-app-name make push-perf-app-app-nameapp-name取自 tests/dapr_tests.mk 中的PERF_TEST_APPSactorfeatures actorjava tester service_invocation_http service_invocation_grpc actor-activation-locker k6-custom pubsub_subscribe_http configuration workflowsapp jobs重要单独构建测试应用时还必须构建并推送对应的压测驱动应用testerbuild-perf-app-tester/push-perf-app-tester供 Fortio 类测试使用k6-custombuild-perf-app-k6-custom/push-perf-app-k6-custom供 k6 类测试使用。这些目标build-perf-app-*/push-perf-app-*由 tests/dapr_tests.mk 中的genPerfTestAppImageBuild/genPerfAppImagePush模板批量生成底层调用$(RUN_BUILD_TOOLS) perf build/push并前置检查DAPR_TEST_REGISTRY与DAPR_TEST_TAG是否已设置。2.8 k6 测试安装 k6-operator若运行 k6 类测试需要先安装 k6-operatormake setup-test-env-k6该目标见 tests/dapr_tests.mk会应用 tests/config/k6_sa.yaml、k6_rolebinding.yaml、k6_sa_secret.yaml并 clone grafana/k6-operator 仓库执行make deploy。对应的清理目标为delete-test-env-k6。2.9 运行性能测试全量运行make test-perf-all只运行选中的测试通过DAPR_PERF_TEST环境变量指定空格分隔多个测试名export DAPR_PERF_TESTapp-name-1 app-name-2 make test-perf-allapp-name对应 tests/dapr_tests.mk 中的PERF_TESTS。例如只运行actor_id_scale与workflowsexport DAPR_PERF_TESTactor_id_scale workflows make test-perf-all从 tests/dapr_tests.mk 的test-perf-all目标可以看到底层执行逻辑check-e2e-env test-deps先校验环境变量并安装gotestsumv1.13.0随后以-timeout 2.5h -p 1 -count1 -v -tagsperf ./tests/perf/...运行测试同时设置NO_API_LOGGINGtrue、DAPR_TEST_NAMESPACE、DAPR_TEST_TAG、DAPR_TEST_REGISTRY、DAPR_TEST_MINIKUBE_IP等变量产出 JSON 报告$(TEST_OUTPUT_FILE_PREFIX)_perf.json与 JUnit 报告并通过jq -r .Output ... | strings提取测试输出当DAPR_PERF_TEST非空时则对每个测试名循环执行./tests/perf/app/...。每个单项测试也有独立目标test-perf-name如make test-perf-service-invocation-http同样由模板批量生成。性能测试依赖上述所有前置步骤运行时镜像、测试应用镜像、组件配置、第三方软件也可用 tests/dapr_tests.mk 中的perf-build-deploy-run一键串起“初始化 构建部署 测试”。2.10 生成性能图表任何一次性能测试的gotestsumJSON 报告都可以离线渲染成图表——本地运行的test_report_perf*.json或 CI 产出的test_perf.json均可cd tests/perf/report go run . -input path-to-report.json[.gz] -version output-folder报告生成器位于 tests/perf/report核心实现为 charts.go。它支持以下命令行参数参数说明-inputgotestsum JSON 报告路径.gz文件会自动解压默认./test_report_perf.json-version图表输出子目录名默认master按 Dapr 版本归类-infra运行环境的硬件描述会写入生成的 README 顶部便于跨环境对比CI 传入 tests/test-infra/perf-infra-description.txt 中的 AKS 节点池描述-manifest同时输出 docs 站点渲染用的 manifest JSON图表生成逻辑详见 tests/perf/report/charts/README.md会把多次运行的同一逻辑测试如TestWorkflowWithConstantVUs/[T_30_300]:_#01按名称归一化聚合多次运行会生成带_avg后缀的平均图表与跨运行延迟对比图*_duration_comparison.png单次运行则直接生成单套图表图表类型包括时长分解duration breakdown含 min/med/avg/p90/p95/max 分位、性能摘要成功率与 VU 数、吞吐量收发 KB/s、数据量自动按 KB/MB/GB 缩放单位、跨运行延迟对比p50 与 p95每个 API 的 README 顶部会生成“Throughput per resource”表各场景的 iterations/sec 与 app/sidecar 的 CPU/内存消耗以及每 CPU 核、每 GB 内存的派生吞吐——这是同一基础设施下横向对比场景与版本的效率核心指标仓库中的历史压缩报告存放在tests/perf/report/data/version/test_report_perf.json.gz如data/v1.18.0/。Fortio 类测试的结果结构可参考 tests/perf/test_result.go 中的TestResult包含请求 QPSRequestedQPS/ActualQPS、时长直方图DurationHistogram含各分位、返回码分布RetCodes、报文大小Sizes等字段是图表渲染与指标汇总的数据基础。2.11 清理测试数据测试完成后建议清理旧的测试数据以便区分新一轮结果make test-clean从 tests/dapr_tests.mk 的test-clean目标看它会删除tests/e2e/*/dist、tests/perf/*/dist、tests/perf/*/test_report_summary_table_*.json以及仓库根目录下的test_report_*.json/test_report_*.xml。如需拆除 Kind 集群与本地 registry可使用make delete-kind删除 Minikube 用make delete-minikube。三、通过 CIGitHub Actions运行性能测试为了保持构建基础设施简单Dapr 使用dapr-testGitHub Actions 工作流在 AKS 集群上运行 e2e 测试另有独立工作流在 Kind 集群中运行 E2E贡献者创建 Pull Request 后Kind 集群上的 E2E 测试会自动执行以获得更快的反馈若要在AKS 集群上运行 E2E及性能测试需要由 maintainer 或 approver 在 PR 中回复评论/ok-to-perf来触发。即性能测试perf属于按需触发的高成本 CI 任务不会随每个 PR 自动运行。四、可选可视化性能测试指标性能测试过程中产生的指标可以通过 Prometheus Pushgateway 收集再由 Grafana 展示为仪表盘。4.1 启用指标推送测试程序默认在未配置 Pushgateway 地址时跳过指标推送见 tests/perf/utils/prometheus_metrics.go 中PushPrometheusMetrics的判空逻辑。设置以下环境变量即可开启export DAPR_PERF_METRICS_PROMETHEUS_PUSHGATEWAY_URLhttp://localhost:9091如果 Pushgateway 启用了基本认证还可设置export DAPR_PERF_METRICS_PROMETHEUS_PUSHGATEWAY_USERNAMEuser export DAPR_PERF_METRICS_PROMETHEUS_PUSHGATEWAY_PASSWORDpassword该工具会为每次性能测试推送以下指标以 Gauge 形式按perf_test分组、可按component进一步分组指标名含义BASELINE_RESPONSE_TIME基线测试平均响应时间无 Dapr 参与DAPR_RESPONSE_TIMEDapr 参与下的平均响应时间LATENCY_BY_DAPRDapr sidecar 带来的附加延迟APP_CPU_USAGE应用 CPU 使用DAPR_SIDECAR_CPU_USAGEDapr sidecar CPU 使用APP_MEMORY_USAGE应用内存使用DAPR_SIDECAR_MEMORY_USAGEDapr sidecar 内存使用APPLICATION_THROUGHPUT实际吞吐QPS4.2 在 Kubernetes 集群中安装监控组件需要安装Prometheus、Pushgateway、Grafana。创建命名空间DAPR_PERF_METRICS_NAMESPACEdapr-perf-metrics kubectl create namespace $DAPR_PERF_METRICS_NAMESPACE安装 Prometheus Serverhelm repo add prometheus-community https://prometheus-community.github.io/helm-charts helm repo update helm install --namespace $DAPR_PERF_METRICS_NAMESPACE prometheus prometheus-community/prometheusPushgateway上述 Prometheus 安装自带 pushgateway。将本地 9091 端口转发到prometheus-pushgatewayPodkubectl port-forward --namespace $DAPR_PERF_METRICS_NAMESPACE deployment/prometheus-prometheus-pushgateway 9091之后即可在http://localhost:9091访问。Grafana创建grafana.yaml文件内容如下Deployment Service端口 80 → 3000apiVersion: apps/v1 kind: Deployment metadata: name: grafana namespace: dapr-perf-metrics spec: replicas: 1 selector: matchLabels: app: grafana template: metadata: labels: app: grafana spec: containers: - name: grafana image: grafana/grafana:latest ports: - containerPort: 3000 --- apiVersion: v1 kind: Service metadata: name: grafana namespace: dapr-perf-metrics spec: type: LoadBalancer ports: - port: 80 targetPort: 3000 protocol: TCP selector: app: grafana应用并转发端口kubectl apply -f grafana.yaml kubectl port-forward --namespace $DAPR_PERF_METRICS_NAMESPACE deployment/grafana 30004.3 配置 Grafana 数据源与仪表盘浏览器访问http://localhost:3000使用默认账号admin/admin登录进入Data Sources添加 Prometheus 数据源HTTP URL 填写 Prometheus Server Pod 的 ClusterIP可通过以下命令获取kubectl get svc --namespace $DAPR_PERF_METRICS_NAMESPACE导入 Dapr 提供的性能测试仪表盘模板tests/grafana/grafana-perf-test-dashboard.json。之后运行性能测试时指标会由测试程序推送到 PushgatewayPrometheus 抓取后即可在仪表盘中实时可视化。4.4 仪表盘效果示例下图为 Dapr 性能测试仪表盘的一个示例视图按Application与Dapr Sidecar两组分别展示延迟Latency、吞吐Throughput、CPU 与内存使用趋势方便直观对比应用自身与 Dapr sidecar 的资源消耗与性能表现五、小结至此一条完整的 Dapr 性能测试链路已经打通准备make setup-kind创建 Kind 集群与本地 registrykubectl create namespace dapr-tests设置 registry/tag 与 Fortio 参数环境变量部署被测运行时make build-linux docker-build docker-push docker-deploy-k8s setup-3rd-party按需setup-app-configurations、setup-disable-mtls、DAPR_DISABLE_TELEMETRYtrue准备测试环境make setup-test-components、make build-perf-app-all push-perf-app-allk6 测试额外执行make setup-test-env-k6执行与产出make test-perf-all可用DAPR_PERF_TEST挑选测试用 tests/perf/report 的生成器从gotestsumJSON 报告渲染图表最后make test-clean清理可视化配置DAPR_PERF_METRICS_PROMETHEUS_PUSHGATEWAY_URL部署 Prometheus/Pushgateway/Grafana导入 tests/grafana/grafana-perf-test-dashboard.json 仪表盘。本地流程与 CI 流程互为补充CI 通过 GitHub Actions 在 Kind自动与 AKS/ok-to-perf触发上运行而本地流程让开发者能在提交前针对自己的运行时改动快速获得延迟、吞吐与资源占用数据是 Dapr 性能回归验证的关键手段。所有相关make目标与默认参数均可在 Makefile 与 tests/dapr_tests.mk 中溯源核对。【免费下载链接】daprDapr is a portable runtime for building distributed applications across cloud and edge, combining event-driven architecture with workflow orchestration.项目地址: https://gitcode.com/GitHub_Trending/da/dapr创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考