테스트 GitLab 인스턴스에서 혼돈 생성하기
Werner Vogels인 Amazon Web Services CTO는 유명하게 말했습니다. 모든 것이 실패합니다, 언제나.
개발자로서, 귀하의 소프트웨어가 일반적으로 작동하는 것만큼이나 실패 모드를 고려하는 것이 중요합니다. 그렇게 함으로써, 소수의 사용자가 경험하는 500
오류들을 유발하는 소규모 장애와 모든 사용자에게 영향을 미치는 전체 사이트 중단 사이에서의 차이를 만들 수 있습니다.
Tolstoy의 말을 변형하면, 모든 행복한 서버는 비슷하지만 모든 실패하는 서버는 고유한 방식으로 실패합니다. 다행히도 이러한 실패 모드를 시뮬레이션하는 방법이 있으며, 혼돈 엔드포인트는 이 프로세스를 지원하는 도구입니다.
현재 다음과 같은 조건을 시뮬레이션하기 위해 네 개의 엔드포인트가 있습니다:
- 느린 요청
- CPU에 바인드된 요청
- 메모리 누수
- 예기치 않은 프로세스 충돌
혼돈 엔드포인트 활성화
명백한 이유로, 이러한 엔드포인트는 production
에서는 기본적으로 활성화되지 않습니다.
이들은 기본적으로 development 환경에서 활성화됩니다.
경고: 혼돈 엔드포인트에 대한 액세스를 보안 토큰을 사용하여 보호해야 합니다. 알려진 바 없는한 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
| integer | no | 누출될 메모리(MB) 양입니다. 기본값은 100MB입니다. |
duration_s
| integer | no | 메모리를 유지할 최소 기간(초)입니다. 기본값은 30초입니다. |
async
| boolean | no | 메모리 누수를 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 spin
이 엔드포인트는 주어진 기간 동안 단일 코어를 100%로 완전히 사용하려고 합니다.
귀하의 랙 서버 설정에 따라, 요청이 일정 기간(일반적으로 60초) 후에 타임아웃될 수 있습니다.
GET /-/chaos/cpu_spin
GET /-/chaos/cpu_spin?duration_s=50
GET /-/chaos/cpu_spin?duration_s=50&async=true
속성 | 유형 | 필수 | 설명 |
---|---|---|---|
duration_s
| integer | no | 코어가 사용되는 기간(초)입니다. 기본값은 30초입니다. |
async
| boolean | no | Sidekiq 백그라운드 워커 프로세스에서 CPU를 사용하려면 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 spin
이 엔드포인트는 주어진 기간 동안 단일 코어를 완전히 사용하고 DB 요청과 교차하여 실행하려고 합니다. 이 엔드포인트는 동시에 실행될 때 다른 스레드에 실행 양보를 모델링하는 데 사용할 수 있습니다.
귀하의 랙 서버 설정에 따라, 요청이 일정 기간(일반적으로 60초) 후에 타임아웃될 수 있습니다.
GET /-/chaos/db_spin
GET /-/chaos/db_spin?duration_s=50
GET /-/chaos/db_spin?duration_s=50&async=true
속성 | 유형 | 필수 | 설명 |
---|---|---|---|
interval_s
| float | no | 각 DB 요청 간격(초)입니다. 기본값은 1초입니다. |
duration_s
| integer | no | 코어가 사용되는 기간(초)입니다. 기본값은 30초입니다. |
async
| boolean | no | 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"
Sleep
이 엔드포인트는 CPU Spin 엔드포인트와 유사하지만 네트워크를 통한 백엔드 서비스로의 활동과 같이 프로세서 외의 활동을 시뮬레이션합니다. 지정된 duration_s
동안 sleep됩니다.
CPU Spin 엔드포인트와 마찬가지로, 구성된 한도를 초과하면 요청이 타임아웃될 수 있습니다.
GET /-/chaos/sleep
GET /-/chaos/sleep?duration_s=50
GET /-/chaos/sleep?duration_s=50&async=true
속성 | 유형 | 필수 | 설명 |
---|---|---|---|
duration_s
| integer | no | 요청이 sleep하는 기간(초)입니다. 기본값은 30초입니다. |
async
| boolean | no | Sidekiq 백그라운드 워커 프로세스에서 sleep하려면 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
시그널을 사용하여 워커 프로세스의 예기치 않은 종료를 모의하는 엔드포인트입니다.
이 엔드포인트는 KILL
시그널을 사용하기 때문에 프로세스에는 정리하거나 종료할 기회가 주어지지 않습니다.
GET /-/chaos/kill
GET /-/chaos/kill?async=true
속성 | 유형 | 필수 | 설명 |
---|---|---|---|
async
| boolean | no | Sidekiq 백그라운드 워커 프로세스에 시그널을 보내려면 true로 설정합니다. |
curl "http://localhost:3000/-/chaos/kill" --header 'X-Chaos-Secret: secret'
curl "http://localhost:3000/-/chaos/kill?token=secret"
Quit
이 엔드포인트는 QUIT
시그널을 사용하여 워커 프로세스의 예기치 않은 종료를 모의하는 엔드포인트입니다.
KILL
과 달리 QUIT
시그널은 코어 덤프를 작성하려고도 시도합니다.
자세한 정보는 core(5)를 참조하세요.
GET /-/chaos/quit
GET /-/chaos/quit?async=true
속성 | 유형 | 필수 | 설명 |
---|---|---|---|
async
| boolean | no | 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
}
}