테스트 GitLab 인스턴스에서 혼란 생성하기

Amazon Web Services의 CTO인 Werner Vogels가 유명하게 말했듯이, 모든 것은 항상 실패한다.

개발자로서 소프트웨어가 작동할 수 있는 실패 모드를 고려하는 것은 일반적인 운영만큼 중요합니다. 이렇게 하는 것은 사용자 중 소수만 경험하는 사소한 문제로 인해 500 오류가 발생하는 것과 모든 사용자가 오랜 시간 동안 영향을 받는 사이트 전체 중단 사이의 차이를 의미할 수 있습니다.

Tolstoy를 바꿔 말하자면, _모든 행복한 서버는 비슷하지만, 모든 실패하는 서버는 각자만의 방식으로 실패한다_는 것입니다. 다행히도 이 실패 모드를 시뮬레이션할 수 있는 방법이 있으며, 혼란 엔드포인트는 이 과정을 지원하는 도구입니다.

현재 다음과 같은 조건을 시뮬레이션하기 위한 네 가지 엔드포인트가 있습니다:

  • 느린 요청.
  • CPU 제약 요청.
  • 메모리 누수.
  • 예기치 않은 프로세스 충돌.

혼란 엔드포인트 활성화하기

명백한 이유로 인해, 이러한 엔드포인트는 production에서 기본적으로 활성화되어 있지 않습니다.

개발 환경에서는 기본적으로 활성화되어 있습니다.

경고:

혼란 엔드포인트에 대한 접근을 비밀 토큰으로 보호해야 합니다.

핵심적으로 무엇을 하고 있는지 확실히 모르는 한, 프로덕션에서 이들을 활성화하지 않아야 합니다.

비밀 토큰은 GITLAB_CHAOS_SECRET 환경 변수를 통해 설정할 수 있습니다.

예를 들어, GDK를 사용할 때는 다음 명령어로 할 수 있습니다:

GITLAB_CHAOS_SECRET=secret gdk start

secret를 자신의 비밀 토큰으로 교체하세요.

혼란 호출하기

혼란 엔드포인트를 활성화하고 애플리케이션을 재시작한 후, 엔드포인트를 사용하여 테스트를 시작할 수 있습니다.

기본적으로, 혼란 엔드포인트를 호출할 때 요청을 수신하는 웹 워커 프로세스가 이를 처리합니다. 예를 들어, Kill 작업이 호출되면 요청을 처리하는 Puma 워커 프로세스가 종료됩니다. Sidekiq에서 이러한 작업을 테스트하려면 각 엔드포인트에서 async 매개변수를 true로 설정할 수 있습니다. 이렇게 하면 혼란 프로세스가 Sidekiq 워커에서 실행됩니다.

메모리 누수

애플리케이션에서 메모리 누수를 시뮬레이션하려면 /-/chaos/leakmem 엔드포인트를 사용하세요.

요청이 완료된 후 메모리는 보존되지 않습니다. 요청이 완료된 후 Ruby 가비지 컬렉터가 메모리를 회수하려고 시도합니다.

GET /-/chaos/leakmem
GET /-/chaos/leakmem?memory_mb=1024
GET /-/chaos/leakmem?memory_mb=1024&duration_s=50
GET /-/chaos/leakmem?memory_mb=1024&duration_s=50&async=true
속성 유형 필수 설명
memory_mb 정수 아니오 누수될 메모리 양(MB)을 설정합니다. 기본값은 100MB입니다.
duration_s 정수 아니오 메모리가 보존되어야 하는 최소 시간(초)을 설정합니다. 기본값은 30초입니다.
async 부울 아니오 메모리를 Sidekiq 백그라운드 워커 프로세스에서 누수시키려면 true로 설정합니다.
curl "http://localhost:3000/-/chaos/leakmem?memory_mb=1024&duration_s=10" \
     --header 'X-Chaos-Secret: secret'
curl "http://localhost:3000/-/chaos/leakmem?memory_mb=1024&duration_s=10&token=secret"

CPU 스핀

이 엔드포인트는 주어진 시간 동안 단일 코어를 100% 완전히 사용하려고 시도합니다.

랙 서버 설정에 따라 요청은 미리 정해진 시간(전형적으로 60초) 후에 타임아웃될 수 있습니다.

GET /-/chaos/cpu_spin
GET /-/chaos/cpu_spin?duration_s=50
GET /-/chaos/cpu_spin?duration_s=50&async=true
속성 유형 필수 설명
duration_s 정수 아니오 코어가 사용되는 기간(초 단위). 기본값은 30초
async 불리언 아니오 CPU를 Sidekiq 백그라운드 작업 프로세스에서 사용하도록 true로 설정
curl "http://localhost:3000/-/chaos/cpu_spin?duration_s=60" \
     --header 'X-Chaos-Secret: secret'
curl "http://localhost:3000/-/chaos/cpu_spin?duration_s=60&token=secret"

DB 스핀

이 엔드포인트는 단일 코어를 완전히 사용하려고 시도하고, 주어진 기간 동안 DB 요청과 번갈아 실행합니다.

이 엔드포인트는 동시에 실행될 때 다른 스레드에게 실행을 양보하는 모델링에 사용할 수 있습니다.

랙 서버 설정에 따라 요청은 미리 정해진 시간(전형적으로 60초) 후에 타임아웃될 수 있습니다.

GET /-/chaos/db_spin
GET /-/chaos/db_spin?duration_s=50
GET /-/chaos/db_spin?duration_s=50&async=true
속성 유형 필수 설명
interval_s 실수 아니오 모든 DB 요청에 대한 간격(초 단위). 기본값은 1초
duration_s 정수 아니오 코어가 사용되는 기간(초 단위). 기본값은 30초
async 불리언 아니오 작업을 Sidekiq 백그라운드 작업 프로세스에서 수행하도록 true로 설정
curl "http://localhost:3000/-/chaos/db_spin?interval_s=1&duration_s=60" \
     --header 'X-Chaos-Secret: secret'
curl "http://localhost:3000/-/chaos/db_spin?interval_s=1&duration_s=60&token=secret"

슬립

이 엔드포인트는 CPU 스핀 엔드포인트와 유사하지만, 백엔드 서비스에 대한 네트워크 호출과 같은 프로세서 외 활동을 시뮬레이션합니다. 주어진 duration_s 동안 잠을 잡니다.

CPU 스핀 엔드포인트와 마찬가지로, duration_s가 설정된 한계를 초과하면 요청 타임아웃이 발생할 수 있습니다.

GET /-/chaos/sleep
GET /-/chaos/sleep?duration_s=50
GET /-/chaos/sleep?duration_s=50&async=true
속성 유형 필수 설명
duration_s 정수 아니오 요청이 잠을 자는 기간(초 단위). 기본값은 30초
async 불리언 아니오 Sidekiq 백그라운드 작업 프로세스에서 잠을 자도록 true로 설정
curl "http://localhost:3000/-/chaos/sleep?duration_s=60" \
     --header 'X-Chaos-Secret: secret'
curl "http://localhost:3000/-/chaos/sleep?duration_s=60&token=secret"

종료

이 엔드포인트는 KILL 신호를 사용하여 작업 프로세스의 예기치 않은 종료를 시뮬레이션합니다.

KILL 신호를 사용하기 때문에 프로세스는 정리 작업이나 종료 작업을 수행할 기회를 얻지 못합니다.

GET /-/chaos/kill
GET /-/chaos/kill?async=true
속성 타입 필수 설명
async boolean 아니오 Sidekiq 백그라운드 작업 프로세스에 신호를 보내려면 true로 설정하세요.
curl "http://localhost:3000/-/chaos/kill" --header 'X-Chaos-Secret: secret'
curl "http://localhost:3000/-/chaos/kill?token=secret"

종료

이 엔드포인트는 QUIT 신호를 사용하여 작업 프로세스의 예기치 않은 종료를 시뮬레이션합니다.

KILL과 달리, QUIT 신호는 코어 덤프를 작성하려고 시도합니다.

자세한 정보는 core(5)을 참조하세요.

GET /-/chaos/quit
GET /-/chaos/quit?async=true
속성 타입 필수 설명
async boolean 아니오 Sidekiq 백그라운드 작업 프로세스에 신호를 보내려면 true로 설정하세요.
curl "http://localhost:3000/-/chaos/quit" --header 'X-Chaos-Secret: secret'
curl "http://localhost:3000/-/chaos/quit?token=secret"

가비지 컬렉터 실행

이 엔드포인트는 요청을 처리하는 작업에서 GC 실행을 트리거하고, 작업 ID와 GC 통계를 JSON 형태로 반환합니다.

이는 주로 Puma를 독립 실행 모드에서 실행할 때 유용합니다.

그렇지 않으면 요청을 처리하는 작업을 미리 알 수 없습니다.

엔드포인트:

POST /-/chaos/gc

예제 요청:

curl --request POST "http://localhost:3000/-/chaos/gc" \
     --header 'X-Chaos-Secret: secret'
curl --request POST "http://localhost:3000/-/chaos/gc?token=secret"

예제 응답:

{
  "worker_id": "puma_1",
  "gc_stat": {
    "count": 94,
    "heap_allocated_pages": 9077,
    "heap_sorted_length": 9077,
    "heap_allocatable_pages": 0,
    "heap_available_slots": 3699720,
    "heap_live_slots": 2827510,
    "heap_free_slots": 872210,
    "heap_final_slots": 0,
    "heap_marked_slots": 2827509,
    "heap_eden_pages": 9077,
    "heap_tomb_pages": 0,
    "total_allocated_pages": 9077,
    "total_freed_pages": 0,
    "total_allocated_objects": 14229357,
    "total_freed_objects": 11401847,
    "malloc_increase_bytes": 8192,
    "malloc_increase_bytes_limit": 30949538,
    "minor_gc_count": 71,
    "major_gc_count": 23,
    "compact_count": 0,
    "remembered_wb_unprotected_objects": 41685,
    "remembered_wb_unprotected_objects_limit": 83370,
    "old_objects": 2617806,
    "old_objects_limit": 5235612,
    "oldmalloc_increase_bytes": 8192,
    "oldmalloc_increase_bytes_limit": 122713697
  }
}