GitLab 性能工具(GPT)使用手册
后知后觉 现有 2 评论

准备环境

压测数据生成、压测 k6 等都需要 Docker 运行环境,安装 Docker 环境用于压力测试,参考官网安装手册。

下载压测材料

从官方仓库获取压测所需套件

wget https://gitlab.com/gitlab-org/quality/performance-data/-/raw/main/projects_export/gitlabhq_export_16.0.0.tar.gz
git clone https://gitlab.com/gitlab-org/quality/performance.git

将离线压缩包放入归档目录:

mkdir $HOME/performance/k6/tar/
mv gitlabhq_export_16.0.0.tar.gz $HOME/performance/k6/tar/

拉取测试镜像

如果是内网环境可以手动下载并导入:

docker image pull docker.io/gitlab/gitlab-performance-tool:latest
docker image pull docker.io/gitlab/gpt-data-generator:latest

如果网络环境受限,可以考虑使用镜像地址:

docker image pull wave.md/gitlab/gitlab-performance-tool:latest      
docker image pull wave.md/gitlab/gpt-data-generator:latest

压力测试

创建令牌

点击左侧上方管理员账号头像,选择 “Preferences” -> “Access tokens” 创建测试用令牌,注意需要勾选所有权限,测试完毕后可以手动移除。

格式类似于:glpat-5Taj1y3a6ygRkNaZVb8q

修改配置文件

修改配置文件 /root/performance/k6/config/environments/ 下 3k.json 配置文件。

{
  ...
  "environment": {
    "name": "3k",
    "url": "https://gitlab.example.com",   ## 修改为集群域名
    "user": "root",                        ## 修改为管理员用户
    "config": {
      "latency": "0"
    },
    ...
}

生产测试数据

使用 gpt-data-generator 生成压力测试所需的测试数据。

导入测试项目

创建容器并生成数据(平台标准性能一般需要55分钟左右):

docker run --rm -it \
    -e ACCESS_TOKEN="$ACCESS_TOKEN" \
    -v "$HOME/performance/k6/config:/config" \
    -v "$HOME/performance/results:/results" \
    -v "$HOME/performance/hosts:/etc/hosts" \   # 如果尚未解析 DNS
    -v "$HOME/performance/tar:/tar" \
    gitlab/gpt-data-generator:latest \
    --unattended \
    --environment 3k.json \
    --large-project-tarball /tar/gitlabhq_export_16.0.0.tar.gz

docker run --rm -it \

-e ACCESS_TOKEN="$ACCESS_TOKEN" \
-v "$HOME/performance/k6/config:/config" \
-v "$HOME/performance/results:/results" \
-v "$HOME/performance/hosts:/etc/hosts" \
-v "$HOME/performance/tar:/tar" \
gitlab/gpt-data-generator:latest \
--unattended \
--no-horizontal \
--environment 3k.json \
--large-project-tarball /tar/gitlabhq_export_17.7.0.tar.gz

导出包的版本,需要按下表进行修改,根据 gpt_test_data.rb:613 的版本判断逻辑。

GitLab 版本范围下载的导出包
< 13.0.0gitlabhq_export_12.5.0.tar.gz
>= 13.0.0 且 < 14.0.0gitlabhq_export_13.0.0.tar.gz
>= 14.0.0 且 < 15.0.0gitlabhq_export_14.0.0.tar.gz
>= 15.0.0 且 < 16.0.0gitlabhq_export_15.0.0.tar.gz
>= 16.0.0 且 < 17.7.0gitlabhq_export_16.0.0.tar.gz
>= 17.7.0 且 < 18.0.0gitlabhq_export_17.7.0.tar.gz
>= 18.0.0 且 < 19.2.0gitlabhq_export_18.0.0.tar.gz
>= 19.2.0gitlabhq_export_19.2.0.tar.gz

例如:GitLab 17.7.7 会使用 gitlabhq_export_17.7.0.tar.gz。版本范围按下限匹配,补丁版本不会单独对应一个导出包。

压力测试

官方推荐的集群规模测试参数对照表(RPS为每秒请求数)

规模参考配套测试参数
1k60s_20rps.json
2k60s_40rps.json
3k60s_60rps.json
5k60s_100rps.json
10k60s_200rps.json
25k60s_500rps.json
50k60s_1000rps.json

创建测试容器并进行 3k 规模压力测试,版本建议使用固定标签:

docker run --rm -it \
    -e ACCESS_TOKEN="$ACCESS_TOKEN" \
    -v "$HOME/performance/k6/config:/config" \
    -v "$HOME/performance/k6/tests/:/tests" \
    -v "$HOME/performance/results:/results" \
    gitlab/gitlab-performance-tool:latest \
    --environment 3k.json --options 60s_60rps.json

测试结果

█ Results summary

* Environment:                3k
* Environment Version:        17.1.8-ee `40b2e111bb8`
* Option:                     60s_60rps
* Date:                       2025-10-10
* Run Time:                   1h 7m 42.78s (Start: 09:35:43 UTC, End: 10:43:26 UTC)
* GPT Version:                v2.15.1

❯ Overall Results Score: 97.14%

NAME                                                     | RPS  | RPS RESULT         | TTFB AVG  | TTFB P90             | REQ STATUS     | RESULT           
---------------------------------------------------------|------|--------------------|-----------|----------------------|----------------|------------------
api_v4_groups_group_subgroups                            | 60/s | 58.2/s (>28.80/s)  | 339.28ms  | 380.58ms (<2000ms)   | 100.00% (>99%) | Passed¹ 
api_v4_groups_issues                                     | 60/s | 58.03/s (>9.60/s)  | 359.30ms  | 406.79ms (<8500ms)   | 100.00% (>99%) | Passed¹ 
api_v4_groups_merge_requests                             | 60/s | 58.61/s (>4.80/s)  | 244.71ms  | 273.98ms (<17500ms)  | 100.00% (>99%) | Passed¹ 
api_v4_projects_deploy_keys                              | 60/s | 59.69/s (>48.00/s) | 67.78ms   | 79.82ms (<200ms)     | 100.00% (>99%) | Passed  
api_v4_projects_issues                                   | 60/s | 58.66/s (>48.00/s) | 238.43ms  | 268.88ms (<1300ms)   | 100.00% (>99%) | Passed¹ 
api_v4_projects_issues_issue                             | 60/s | 58.35/s (>38.40/s) | 237.47ms  | 281.01ms (<2800ms)   | 100.00% (>99%) | Passed¹ 
api_v4_projects_languages                                | 60/s | 59.66/s (>48.00/s) | 75.24ms   | 87.56ms (<200ms)     | 100.00% (>99%) | Passed  
api_v4_projects_merge_requests                           | 60/s | 59.17/s (>48.00/s) | 154.53ms  | 171.33ms (<300ms)    | 100.00% (>99%) | Passed¹ 
api_v4_projects_merge_requests_merge_request             | 60/s | 58.36/s (>24.00/s) | 271.68ms  | 316.39ms (<3500ms)   | 100.00% (>99%) | Passed¹ 
api_v4_projects_merge_requests_merge_request_commits     | 60/s | 59.31/s (>48.00/s) | 141.39ms  | 156.15ms (<200ms)    | 100.00% (>99%) | Passed  
api_v4_projects_merge_requests_merge_request_diffs       | 60/s | 59.5/s (>48.00/s)  | 112.50ms  | 130.29ms (<200ms)    | 87.90% (>99%)  | FAILED² 
api_v4_projects_merge_requests_merge_request_discussions | 60/s | 58.74/s (>48.00/s) | 235.47ms  | 259.75ms (<1500ms)   | 100.00% (>99%) | Passed¹ 
api_v4_projects_project_pipelines                        | 60/s | 59.52/s (>48.00/s) | 85.68ms   | 98.08ms (<200ms)     | 100.00% (>99%) | Passed  
api_v4_projects_project_pipelines_pipeline               | 60/s | 59.15/s (>48.00/s) | 102.29ms  | 113.00ms (<200ms)    | 100.00% (>99%) | Passed  
api_v4_projects_project_pipelines_pipeline_jobs          | 60/s | 57.98/s (>9.60/s)  | 368.66ms  | 416.48ms (<2500ms)   | 99.82% (>99%)  | Passed¹ 
api_v4_projects_project_services                         | 60/s | 59.64/s (>48.00/s) | 71.53ms   | 81.92ms (<200ms)     | 100.00% (>99%) | Passed  
api_v4_projects_releases                                 | 60/s | 58.97/s (>48.00/s) | 125.97ms  | 141.20ms (<200ms)    | 99.97% (>99%)  | Passed  
api_v4_projects_repository_branches                      | 60/s | 59.27/s (>48.00/s) | 71.82ms   | 80.72ms (<200ms)     | 100.00% (>99%) | Passed  
api_v4_projects_repository_branches_branch               | 60/s | 59.34/s (>48.00/s) | 117.91ms  | 134.62ms (<200ms)    | 100.00% (>99%) | Passed  
api_v4_projects_repository_branches_search               | 60/s | 59.3/s (>48.00/s)  | 70.97ms   | 80.86ms (<200ms)     | 100.00% (>99%) | Passed¹ 
api_v4_projects_repository_commits                       | 60/s | 59.45/s (>48.00/s) | 110.86ms  | 129.90ms (<200ms)    | 85.58% (>99%)  | FAILED² 
api_v4_projects_repository_commits_all                   | 60/s | 55.19/s (>48.00/s) | 164.69ms  | 179.11ms (<250ms)    | 99.54% (>99%)  | Passed¹ 
api_v4_projects_repository_commits_commit                | 60/s | 59.27/s (>48.00/s) | 107.47ms  | 121.16ms (<200ms)    | 100.00% (>99%) | Passed  
api_v4_projects_repository_commits_commit_diff           | 60/s | 58.88/s (>38.40/s) | 200.89ms  | 226.62ms (<1500ms)   | 100.00% (>99%) | Passed¹ 
api_v4_projects_repository_compare                       | 60/s | 58.75/s (>48.00/s) | 110.96ms  | 124.56ms (<200ms)    | 100.00% (>99%) | Passed¹ 
api_v4_projects_repository_files_file_blame              | 60/s | 25.05/s (>0.48/s)  | 2161.15ms | 3025.11ms (<35000ms) | 100.00% (>15%) | Passed¹ 
api_v4_projects_repository_files_file_metadata           | 60/s | 59.32/s (>48.00/s) | 113.96ms  | 126.72ms (<200ms)    | 100.00% (>99%) | Passed  
api_v4_projects_repository_tags                          | 60/s | 59.28/s (>48.00/s) | 126.71ms  | 141.28ms (<200ms)    | 99.91% (>99%)  | Passed¹ 
api_v4_projects_repository_tree                          | 60/s | 59.25/s (>48.00/s) | 125.12ms  | 141.19ms (<200ms)    | 99.46% (>99%)  | Passed  
git_clone                                                | 3/s  | 0.14/s (>0.08/s)   | 836.53ms  | 2215.71ms (<4000ms)  | 100.00% (>99%) | Passed¹ 
git_ls_remote                                            | 6/s  | 5.49/s (>4.80/s)   | 103.71ms  | 165.22ms (<200ms)    | 100.00% (>99%) | Passed  
git_pull                                                 | 6/s  | 5.88/s (>4.80/s)   | 129.81ms  | 175.64ms (<400ms)    | 92.79% (>99%)  | FAILED¹²
web_group_merge_requests                                 | 6/s  | 5.86/s (>4.80/s)   | 364.45ms  | 421.06ms (<800ms)    | 100.00% (>99%) | Passed¹ 
web_project_branches                                     | 6/s  | 5.67/s (>4.80/s)   | 596.87ms  | 641.51ms (<900ms)    | 100.00% (>99%) | Passed¹ 
web_project_branches_search                              | 6/s  | 5.15/s (>4.80/s)   | 979.51ms  | 1071.35ms (<1600ms)  | 100.00% (>99%) | Passed¹ 
web_project_commit                                       | 6/s  | 5.7/s (>1.92/s)    | 792.50ms  | 2211.84ms (<3500ms)  | 100.00% (>99%) | Passed¹ 
web_project_commits                                      | 6/s  | 5.54/s (>4.80/s)   | 710.24ms  | 807.81ms (<1000ms)   | 100.00% (>99%) | Passed¹ 
web_project_file_blame                                   | 6/s  | 2.21/s (>0.96/s)   | 2377.51ms | 2582.47ms (<3300ms)  | 100.00% (>99%) | Passed¹ 
web_project_file_rendered                                | 6/s  | 5.29/s (>3.84/s)   | 727.29ms  | 808.33ms (<1700ms)   | 99.05% (>99%)  | Passed¹ 
web_project_file_source                                  | 6/s  | 5.8/s (>2.88/s)    | 610.75ms  | 794.10ms (<2700ms)   | 95.45% (>99%)  | FAILED¹²
web_project_files                                        | 60/s | 5.94/s (>4.80/s)   | 224.55ms  | 360.91ms (<1200ms)   | 92.06% (>99%)  | FAILED¹²
web_project_issue                                        | 6/s  | 6.01/s (>4.80/s)   | 43.77ms   | 62.68ms (<2000ms)    | 0.00% (>99%)   | FAILED¹²
web_project_issues                                       | 6/s  | 5.83/s (>4.80/s)   | 287.35ms  | 356.14ms (<700ms)    | 100.00% (>99%) | Passed¹ 
web_project_issues_search                                | 6/s  | 5.88/s (>4.80/s)   | 263.39ms  | 311.27ms (<700ms)    | 100.00% (>99%) | Passed¹ 
web_project_merge_request                                | 6/s  | 4.92/s (>4.80/s)   | 928.35ms  | 2064.44ms (<2800ms)  | 100.00% (>99%) | Passed¹ 
web_project_merge_request_changes                        | 6/s  | 5.58/s (>4.80/s)   | 648.48ms  | 836.11ms (<1500ms)   | 100.00% (>99%) | Passed¹ 
web_project_merge_request_commits                        | 6/s  | 4.48/s (>2.88/s)   | 1168.14ms | 1288.11ms (<1950ms)  | 100.00% (>99%) | Passed¹ 
web_project_merge_requests                               | 6/s  | 5.74/s (>4.80/s)   | 442.79ms  | 667.60ms (<900ms)    | 100.00% (>99%) | Passed¹ 
web_project_merge_requests_search                        | 6/s  | 5.81/s (>4.80/s)   | 441.58ms  | 502.92ms (<700ms)    | 100.00% (>99%) | Passed¹ 
web_project_pipelines                                    | 6/s  | 5.87/s (>3.84/s)   | 473.82ms  | 698.52ms (<800ms)    | 100.00% (>99%) | Passed¹ 
web_project_pipelines_pipeline                           | 6/s  | 5.68/s (>4.80/s)   | 654.31ms  | 1577.83ms (<2500ms)  | 100.00% (>99%) | Passed¹ 
web_project_repository_compare                           | 6/s  | 1.43/s (>0.24/s)   | 3881.65ms | 4354.87ms (<7500ms)  | 100.00% (>99%) | Passed¹ 
web_project_tags                                         | 6/s  | 5.32/s (>3.84/s)   | 871.33ms  | 1074.03ms (<1500ms)  | 100.00% (>99%) | Passed¹ 

¹ Result covers endpoint(s) that have known issue(s). Threshold(s) have been adjusted to compensate.
² Failure may not be clear from summary alone. Refer to the individual test's full output for further debugging.

失败的项目需要手动核查一下通过率是否接近目标值,一般而言,只要差异不大都可以视为通过。


清理压测数据

创建清理容器:

docker run -it --rm -e ACCESS_TOKEN=glpat-5Taj1y3a6ygRkNaZVb8q \
    -v /root/performance/hosts:/etc/hosts \
    -v /root/performance/k6/config:/config \
    -v /root/performance/k6/tests/:/tests \
    -v /root/performance/results:/results \
    gitlab/gpt-data-generator:latest --environment 3k.json --clean-up

也可以进入管理员控制台,删除压测组,清理管理员令牌。


附录

参考链接

如果遇到问题或者对文章内容存疑,请在下方留言,博主看到后将及时回复,谢谢!
禁用 / 当前已拒绝评论,仅可查看「历史评论」。
  1. avatarImg lieu

    测试一下评论的样本

    Edge 145.0 macOS
    隐藏
  2. avatarImg lieu

    这是真的吗?应该怎么处理

    Firefox 141.0 Linux
    隐藏