테스트 GitLab 인스턴스에서 혼돈 생성
Werner Vogels는 아마존 웹 서비스의 CTO로 유명한 것으로 알려진 대로 모든 것은 항상 실패합니다.
개발자로서, 소프트웨어가 일반적으로 동작하는 것만큼이나 소프트웨어가 동작하지 않는 상황을 고려하는 것이 중요합니다. 이렇게 함으로써 약간의 문제로 일부 사용자에게 경험되는 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
| integer | 아니요 | 누출될 메모리 양(MB). 기본값은 100MB입니다. |
duration_s
| integer | 아니요 | 메모리 유지할 최소 기간(초). 기본값은 30초입니다. |
async
| boolean | 아니요 | 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
| integer | 아니요 | 코어를 사용할 기간(초). 기본값은 30초입니다. |
async
| boolean | 아니요 | 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 소모
이 엔드포인트는 주어진 기간 동안 단일 코어를 완전히 사용하고 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 | 아니요 | 각 DB 요청 간격(초). 기본값은 1초입니다. |
duration_s
| integer | 아니요 | 코어를 사용할 기간(초). 기본값은 30초입니다. |
async
| boolean | 아니요 | 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 엔드포인트와 마찬가지로 duration_s
가 구성된 제한을 초과하면 요청 시간이 초과될 수 있습니다.
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 | 백그라운드 워커 프로세스에서 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 | 백그라운드 워커 프로세스에 신호를 보내려면 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 | 백그라운드 워커 프로세스에 신호를 보내려면 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
}
}