빠른 시작


Bencher가 무엇인가요?

Bencher는 지속적인 벤치마킹 도구 모음입니다. 성능 성하위가 사용자에게 영향을 미친 적이 있나요? Bencher를 사용하면 그런 현상을 막을 수 있습니다. Bencher를 사용하면 성능 성하위를 _제작환경에 도입하기 _전에 탐지하고 방지할 수 있습니다.

  • 실행: 벤치마킹 도구를 이용하여 로컬이나 CI에서 벤치마크를 실행하세요. bencher CLI는 기존의 벤치마크 하네스를 감싸고 그 결과를 저장합니다.
  • 추적: 벤치마크 결과를 시간에 따라 추적하세요. 소스 브랜치, 테스트베드, 메트릭 종류 등에 따라 Bencher 웹 콘솔을 이용하여 결과를 감시하고, 쿼리하고, 그래프로 표현하세요.
  • 탐지: CI에서 성능 성하위를 탐지하세요. Bencher는 최신, 커스터마이징 가능한 분석을 사용해 성능 성하위를 제작환경에 도입되기 전에 검출합니다.

기능 성하위를 방지하기 위해 CI에서 단위 테스트를 실행하는 이유와 마찬가지로, Bencher를 사용하여 CI에서 벤치마크를 실행하여 성능 성하위를 방지해야 합니다. 성능 버그도 버그입니다!


bencher CLI 설치

bencher CLI를 설치하려면 cargo가 설치되어 있어야 합니다. cargo가 설치되어 있는지 확인하세요.

실행: cargo --version

다음과 같은 내용이 나와야 합니다:

$ cargo --version
cargo 1.65.0 (4bc8f24d3 2022-10-20)

버전 번호가 다르더라도 괜찮습니다. 이 명령이 작동하는 것이 중요합니다. 그렇지 않을 경우, rustup을 통해 cargo를 설치하는 방법을 따르세요.

Linux나 macOS에서는 다음을 실행하세요:

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

cargo가 설치되어 있다면, 이제 bencher CLI를 설치할 수 있습니다.

실행:

cargo install --git https://github.com/bencherdev/bencher --tag v0.3.18 --locked bencher_cli

다음과 같은 내용이 나와야 합니다:

$ cargo install --git https://github.com/bencherdev/bencher --tag 0.3.18 --locked bencher_cli
  Installing bencher_cli v0.3.18 (/workspace/bencher/services/cli)
    Updating crates.io index

    Finished release [optimized] target(s) in 0.27s
  Installing /workspace/.cargo/bin/bencher
   Installed package `bencher_cli v0.3.18 (/workspace/bencher/services/cli)` (executable `bencher`)

마찬가지로 출력 결과가 다르더라도 괜찮습니다. 이 명령이 작동하는 것이 중요합니다.


마지막으로, bencher CLI가 설치되었는지 확인해봅시다.

실행: bencher --version

다음을 볼 수 있어야 합니다:

$ bencher —version
bencher 0.3.18

Bencher Cloud 계정 생성

Bencher는 오픈 소스이며 호스팅이 가능합니다. 자체 호스팅에 관심이 있다면, Bencher Docker 튜토리얼을 확인하세요. 그러나 이 튜토리얼에서는 Bencher Cloud를 사용하겠습니다.

Bencher Cloud에 가입


계정을 만든 후에는 이메일 주소를 확인해야 합니다. 확인 링크를 위해 이메일을 확인하세요. 그러면 Bencher Cloud에 로그인되어 있어야 합니다.


API 토큰 생성

Bencher API를 사용하려면 API 토큰을 만들어야 합니다. Bencher 콘솔로 이동하세요. 오른쪽 상단에 있는 이름 위로 마우스를 올립니다. 드롭다운 메뉴가 나타납니다. Tokens를 선택하세요. API 토큰 페이지에서 ➕ Add 버튼을 클릭합니다.

API 토큰 추가


새 API 토큰을 생성한 후에는 클립보드에 복사해야 합니다. 작업하려는 터미널에서 API 토큰을 환경 변수로 내보냅니다.

실행: export BENCHER_API_TOKEN=YOUR_TOKEN

그런 다음 다음을 실행하면: echo $BENCHER_API_TOKEN

다음을 볼 수 있어야 합니다:

$ echo $BENCHER_API_TOKEN
YOUR_TOKEN

🐰 노트: 다른 터미널로 이동하면 API 토큰을 다시 내보내야 합니다.


프로젝트 생성

이제 사용자 계정과 API 토큰이 있으므로 프로젝트를 생성할 수 있습니다. 먼저 새 프로젝트가 속할 조직을 알아야 합니다.

실행: bencher org ls

다음과 같은 내용이 나와야 합니다:

$ bencher org ls
[
  {
    "name": "Saul Goodman",
    "slug": "saul-goodman",
    "uuid": "4581feb0-6cac-40a9-bd8a-d7865183b01e"
    "created": "2022-07-06T11:24:36Z",
    "modified": "2022-07-06T11:24:36Z"
  }
]

당신의 출력 결과는 위의 출력 결과와 약간 다르게 나올 것입니다:

  • uuid는 의사무작위입니다
  • nameslug는 이름에 기반합니다
  • createdmodified 타임스탬프는 당신이 방금 가입했을 때부터 시작됩니다

이제 조직 내에 새 프로젝트를 생성할 수 있습니다. 아래 명령에서 조직의 slug--org 인수로 대체합니다 (예: YOUR_ORG_SLUG).

실행: bencher project create --org YOUR_ORG_SLUG --url http://www.savewalterwhite.com "Save Walter White"

다음과 같은 내용이 나와야 합니다:

$ bencher project create --org saul-goodman --url http://www.savewalterwhite.com "Save Walter White"
{
  "organization": "4581feb0-6cac-40a9-bd8a-d7865183b01e",
  "name": "Save Walter White",
  "slug": "save-walter-white-12345",
  "uuid": "c6c2a8e8-685e-4413-9a19-5b79053a71b1"
  "url": "http://www.savewalterwhite.com",
  "public": true,
  "created": "2022-07-06T11:36:24Z",
  "modified": "2022-07-06T11:36:24Z"
}

다시 한 번, 당신의 출력 결과는 위의 출력 결과와 약간 다르게 나올 것입니다. 이 명령이 작동하는 것이 중요합니다. 프로젝트의 slug 필드 (예: save-walter-white-12345)를 기억해두세요.


보고서 실행

드디어 벤치마크 정보를 수집할 준비가 되었습니다! 이 튜토리얼에서는 간단하게 하기 위해 가짜 데이터를 사용하겠습니다.

실행: bencher mock

다음과 같은 내용이 나와야 합니다:

$ bencher mock
{
  "bencher::mock_0": {
    "latency": {
      "value": 3.7865423396154463,
      "lower_value": 3.4078881056539014,
      "upper_value": 4.165196573576991
    }
  },
  "bencher::mock_1": {
    "latency": {
      "value": 16.398332128878437,
      "lower_value": 14.758498915990593,
      "upper_value": 18.03816534176628
    }
  },
  "bencher::mock_2": {
    "latency": {
      "value": 20.88091359871672,
      "lower_value": 18.792822238845048,
      "upper_value": 22.969004958588393
    }
  },
  "bencher::mock_3": {
    "latency": {
      "value": 33.88103801203782,
      "lower_value": 30.492934210834036,
      "upper_value": 37.2691418132416
    }
  },
  "bencher::mock_4": {
    "latency": {
      "value": 40.90515638867921,
      "lower_value": 36.81464074981129,
      "upper_value": 44.99567202754713
    }
  }
}

당신의 출력 결과는 위의 출력 결과와 약간 다르게 나올 것입니다, 데이터는 의사무작위입니다. 이 명령이 작동하는 것이 중요합니다.


이제 가짜 벤치마크 메트릭 데이터를 사용하여 보고서를 실행해 보겠습니다. 아래 명령에서 프로젝트의 slug--project 인수로 대체합니다 (예: YOUR_PROJECT_SLUG).

실행: bencher run --project YOUR_PROJECT_SLUG "bencher mock"

다음과 같은 내용이 나와야 합니다:

$ bencher run --project save-walter-white-12345 "bencher mock"
{
  "bencher::mock_0": {
    "latency": {
      "value": 0.15496641529475275,
      "lower_value": 0.13946977376527747,
      "upper_value": 0.17046305682422802
    }
  },
  "bencher::mock_1": {
    "latency": {
      "value": 18.648298578180437,
      "lower_value": 16.783468720362393,
      "upper_value": 20.513128435998482
    }
  },
  "bencher::mock_2": {
    "latency": {
      "value": 28.20328182167366,
      "lower_value": 25.382953639506294,
      "upper_value": 31.023610003841025
    }
  },
  "bencher::mock_3": {
    "latency": {
      "value": 34.45732560787596,
      "lower_value": 31.01159304708836,
      "upper_value": 37.903058168663556
    }
  },
  "bencher::mock_4": {
    "latency": {
      "value": 44.9237520767597,
      "lower_value": 40.43137686908373,
      "upper_value": 49.41612728443567
    }
  }
}

{
  "branch": "master",
  "end_time": "2023-07-18T14:21:27.796871Z",
  "results": [
    "{\n  \"bencher::mock_0\": {\n    \"latency\": {\n      \"value\": 0.15496641529475275,\n      \"lower_value\": 0.13946977376527747,\n      \"upper_value\": 0.17046305682422802\n    }\n  },\n  \"bencher::mock_1\": {\n    \"latency\": {\n      \"value\": 18.648298578180437,\n      \"lower_value\": 16.783468720362393,\n      \"upper_value\": 20.513128435998482\n    }\n  },\n  \"bencher::mock_2\": {\n    \"latency\": {\n      \"value\": 28.20328182167366,\n      \"lower_value\": 25.382953639506294,\n      \"upper_value\": 31.023610003841025\n    }\n  },\n  \"bencher::mock_3\": {\n    \"latency\": {\n      \"value\": 34.45732560787596,\n      \"lower_value\": 31.01159304708836,\n      \"upper_value\": 37.903058168663556\n    }\n  },\n  \"bencher::mock_4\": {\n    \"latency\": {\n      \"value\": 44.9237520767597,\n      \"lower_value\": 40.43137686908373,\n      \"upper_value\": 49.41612728443567\n    }\n  }\n}\n"
  ],
  "settings": {},
  "start_time": "2023-07-18T14:21:27.773930Z",
  "testbed": "base"
}
{
  "uuid": "5554a92c-6f5c-481d-bd47-990f0a9bac6d",
  "user": { ... },
  "project": { ... },
  "branch": { ... },
  "testbed": { ...},
  "start_time": "2023-07-18T14:21:27Z",
  "end_time": "2023-07-18T14:21:27Z",
  "adapter": "magic",
  "results": [
    [
      {
        "metric_kind": { ... },
        "threshold": null,
        "benchmarks": [ ... ]
      }
    ]
  ],
  "alerts": [],
  "created": "2023-07-18T14:21:27Z"
}

View results:
- bencher::mock_0: https://bencher.dev/console/projects/save-walter-white-12345/perf?metric_kinds=4358146b-b647-4869-9d24-bd22bb0c49b5&branches=95521eff-09fa-4c02-abe1-dd824108869d&testbeds=5b4a6f3e-a27d-4cc3-a2ce-851dc6421e6e&benchmarks=88375e7c-f1e0-4cbb-bde1-bdb7773022ae
- bencher::mock_1: https://bencher.dev/console/projects/save-walter-white-12345/perf?metric_kinds=4358146b-b647-4869-9d24-bd22bb0c49b5&branches=95521eff-09fa-4c02-abe1-dd824108869d&testbeds=5b4a6f3e-a27d-4cc3-a2ce-851dc6421e6e&benchmarks=e81c7863-cc4b-4e22-b507-c1e238871137
- bencher::mock_2: https://bencher.dev/console/projects/save-walter-white-12345/perf?metric_kinds=4358146b-b647-4869-9d24-bd22bb0c49b5&branches=95521eff-09fa-4c02-abe1-dd824108869d&testbeds=5b4a6f3e-a27d-4cc3-a2ce-851dc6421e6e&benchmarks=31dede44-d23a-4baf-b639-63f2ac742e42
- bencher::mock_3: https://bencher.dev/console/projects/save-walter-white-12345/perf?metric_kinds=4358146b-b647-4869-9d24-bd22bb0c49b5&branches=95521eff-09fa-4c02-abe1-dd824108869d&testbeds=5b4a6f3e-a27d-4cc3-a2ce-851dc6421e6e&benchmarks=c7e32369-f3dd-473d-99a3-6289ae32b38e
- bencher::mock_4: https://bencher.dev/console/projects/save-walter-white-12345/perf?metric_kinds=4358146b-b647-4869-9d24-bd22bb0c49b5&branches=95521eff-09fa-4c02-abe1-dd824108869d&testbeds=5b4a6f3e-a27d-4cc3-a2ce-851dc6421e6e&benchmarks=779bc477-4964-4bae-aa8c-4da3e388822c

이제 각 벤치마크의 결과를 브라우저에서 볼 수 있습니다. View results 링크를 클릭하거나 복사해서 붙여넣기하세요. 각 벤치마크에 대해서는 단일 데이터 점만 있으므로, 데이터를 더 추가합시다!


먼저 프로젝트 슬러그를 환경 변수로 설정하여, 모든 실행에서 --project를 제공하지 않아도 되도록 합시다.

실행: export BENCHER_PROJECT=save-walter-white-12345

그런 다음 다음을 실행하면: echo $BENCHER_PROJECT

다음을 볼 수 있어야 합니다:

$ echo $BENCHER_PROJECT
save-walter-white-12345

다시 한번 --project 없이 동일한 명령을 실행하여 더 많은 데이터를 생성하겠습니다.

실행: bencher run "bencher mock"


이번에는 결과를 bencher run으로 파이프하여 더 많은 데이터를 생성해 보겠습니다.

실행: bencher mock | bencher run


가끔 결과를 파일에 저장하고 bencher run이 결과를 가져오게 하고 싶을 수도 있습니다.

실행: bencher run "bencher mock > results.json" --file results.json


또한 다른 프로세스가 벤치마크를 실행하고 결과를 파일에 저장하도록 하고, bencher run이 그 결과를 가져오도록 만들 수도 있습니다.

실행: bencher mock > results.json && bencher run --file results.json


마지막으로, bencher run--iter 인수를 사용하여 많은 데이터를 생성합시다.

실행: bencher run --iter 16 "bencher mock"


🐰 팁: bencher run CLI 서브커맨드 문서에서 bencher run이 할 수 있는 모든 것에 대한 전체 개요를 확인하세요!


알림 생성

이제 벤치마크에 대한 히스토리 데이터가 있으니, 알림을 생성해 봅시다! 알림은 벤치마크 결과가 성능 성하위로 판단되었을 때 생성됩니다. 그럼 성능 성하위를 시뮬레이션해봅시다!

실행: bencher run "bencher mock --pow 8"


출력 결과의 끝 부분에 새로운 섹션인 View alerts가 있어야 합니다:

View alerts:
- bencher::mock_0: https://bencher.dev/console/projects/save-walter-white-12345/alerts/b2329d5a-4471-48ab-bfbd-959d46ba1aa6
- bencher::mock_1: https://bencher.dev/console/projects/save-walter-white-12345/alerts/181b1cf5-d984-402a-b0f1-68f6f119fa66
- bencher::mock_2: https://bencher.dev/console/projects/save-walter-white-12345/alerts/b9b6c904-c657-4908-97db-dbeca40f8782
- bencher::mock_3: https://bencher.dev/console/projects/save-walter-white-12345/alerts/5567ff32-2829-4b6a-969a-af33ce3828db
- bencher::mock_4: https://bencher.dev/console/projects/save-walter-white-12345/alerts/49f2768f-ccda-4933-8e1d-08948f57a74d

이제 각 벤치마크의 알림을 브라우저에서 볼 수 있습니다. View alerts 링크를 클릭하거나 복사해서 붙여넣기하세요.


🐰 팁: 성능 성하위가 어떻게 검출되는지에 대한 전체 개요를 보려면 임계값 & 알림 문서를 확인하세요!



🐰 축하합니다! 첫 번째 성능 성하위를 잡았습니다! 🎉


계속 진행: 벤치마킹 개요 ➡

🤖 이 문서는 OpenAI GPT-4에 의해 자동으로 생성되었습니다. 정확하지 않을 수도 있고 오류가 있을 수도 있습니다. 오류를 발견하면 GitHub에서 문제를 열어주세요.