테스트 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
}
}