Create a gist now

Instantly share code, notes, and snippets.

What would you like to do?
unoffical korean translation of http://techlife.cookpad.com/2014/03/24/rrrspec/

분산 테스트 실행 시스템 RRRSpec을 출시하였습니다.

  • 2014년 3월 24일

기술부 알바 스즈키(@draftcode) 입니다.

쿡패드가 내부용으로 개발/운영해온 분산 테스트 실행 시스템 RRRSpec을 오픈 소스로 공개했습니다. RRRSpec은 시간이 걸리는 자동화 된 테스트를 분산 처리 하여 전체 테스트 시간을 단축하는 애플리케이션입니다. 현재 쿡패드에서는 17,000개가 넘는 테스트가 있어서 컴퓨터 한 대에서 테스트를 실행하면 완료하는 데 몇 시간이 걸립니다. 이 테스트를 60개의 머신에서 병렬 분산 처리 함으로써 평균 8분에서 9분 정도에 완료할 수 있게 되었습니다. 또한, Amazon EC2 스팟 인스턴스를 사용함으로써 상당한 비용 절감 효과도 동시에 달성했습니다.

https://github.com/cookpad/rrrspec

Taskset_-_RRRSpec

분산 테스트 실행이란?

애플리케이션이 커짐에 따라 자동 테스트의 숫자도 많아집니다. 쿡패드는 매우 많은 자동 테스트가 작성되어있어, 보통 방법으로는 한 번 실행에 몇 시간씩 걸립니다. 이런 비대한 테스트 스위트를 위한, parallel_tests 같은 테스트를 분산 수행하는 라이브러리가 이미 있습니다만, parallel_tests를 한 대에서 쿡패드의 테스트 스위트를 분산 실행한다 해도 한 번 테스트에 수십 분이 걸렸습니다.

parallel_tests만으로는 테스트 시간을 충분히 단축할 수 없었기 때문에, 쿡패드에서 remote_spec 는 여러 대에 parallel_tests 을 수행하는 라이브러리를 개발했습니다. 이것으로 한 번의 테스트에 걸리는 시간이 10분 이내로 단축되어, 실용적인 시간 내에서 테스트를 수행할 수 있게 되었습니다.

remote_spec으로 여러 대의 컴퓨터로 테스트의 분산 실행을 달성할 수 있었습니다만, 아직 몇 가지 문제점이 있었습니다. 예를 들어, remote_spec의 구조상 유연하게 머신 수를 바꿀 수 없고, 머신 및 테스트 실행 프로세스의 장해에 대해 잘 대응할 수 없었습니다. 이러한 문제를 해결하기 위해 RRRSpec을 처음부터 다시 설계하였습니다.

RRRSpec의 기능

RRRSpec은 RSpec을 위한 테스트에 특화된 분산 테스트 실행 시스템입니다. RRRSpec은 한대의 마스터와 여러 대의 워커로 구성됩니다. 테스트 실행을 시작하는 클라이언트는 마스터에서 테스트 실행에 필요한 소스 코드를 전송하고 테스트 실행 큐에 테스트를 큐잉합니다. 마스터는 큐에 있는 테스트를 적절히 워커에 할당하고 워커가 테스트를 실행합니다.

이런 일반적인 분산 테스트 실행 외에도 몇 가지 흥미로운 기능을 제공합니다.

  • 시스템 종료, 프로세스를 중지 자동 복귀
  • 무응답 프로세스에 대한 하드 타임아웃, 소프트 타임아웃
  • 실패한 테스트를 자동으로 다시 실행
  • 테스트 실행 순서 최적화
  • 테스트 경쟁적으로 실행

이 기능이 왜 필요한지, 어떻게 실행하는지는 RRRSpec Design Decisions에 정리되어 있습니다. RRRSpec의 실행 시퀸스 같은 정보는 RRRSpec Hacking Guide에 정리해 두었습니다.

RRRSpec 마스터와 워커를 같은 PC에서 실행해, 테스트를 실행할 환경을 local_test로 준비해 두었습니다. 설치할 때 참고로 사용해 주세요.

이론적 배경

RRRSpec의 엔지니어링에 관한 이야기는 Design Decisions에 정리되어 있지만, 다른 관점의 더 이론적인 이야기도 있습니다. 이 문단에서는 그런 이야기를 간단히 소개합니다.

워커 머신의 스케일링

쿡패드에서는 RRRSpec의 도입으로 Amazon EC2 스팟 인스턴스를 사용할 수 있게 되었습니다. 스팟 인스턴스는 Amazon에서 남는 인스턴스를 경매로 낙찰해 싸게 빌릴 수 있는 인스턴스입니다. 싼 대신 예고 없이 머신이 죽을 수 있습니다.

RRRSpec는 머신의 정지에 대한 내성이 있기 때문에 스팟 인스턴스 운영하다 갑자기 머신이 떨어져도 문제없게 만들어져 있습니다. 스팟 인스턴스를 잘 낙찰 하여 시스템을 확장 시킬 수 있다면, 효율적으로 테스트를 수행할 수 있게 됩니다. 이렇게 하려고, 쿡패드 에서는 다음과 같은 일을 했습니다.

  • 스팟 인스턴스 경매의 구조를 추정하여, 게임 이론, 경매 이론을 참고하여 효용 함수를 결정. 선형 계획 문제로 만들어, 입찰 가격 결정 문제를 풉니다.
  • 머신의 스케일 스케쥴을 결정하기 위해 머신의 사용상태를 과거의 데이터에서 예측하여, 세그먼트기를 사용하여 효율적으로 자원 배분 전략을 계산합니다.
  • 대기 행렬 이론을 응용하여, 시간당 실행되는 테스트의 평균 실행 시간이 규정치 이하로 만들기 위한 필요한 기계 대수를 결정합니다.

보시는 것처럼, 쓰는 것은 대학 학부에서 배우는 초보적인 컴퓨터 과학 및 교양에서 나오는 이론이지만, 잘 문제를 변형하여, 현실에 발생하는 문제에 응용하여 사용하고 있습니다.

모델 검사와 폴트 인젝션

RRRSpec는 일종의 분산 시스템입니다. 분산 시스템에서는 여러 머신이 함께 작동하기 때문에, 머신 및 네트워크 장애로 인한 영향이 큽니다. 머신 한대의 고장 확률이 매우 적다해도 머신 수가 증가함에 따라 고장 발생 확률은 오르게 됩니다.

앞서 언급했듯이 스팟 인스턴스는 갑자기 머신이 종료될 수 있다는 제약이 있습니다. 이 스팟 인스턴스 제약은 RRRSpec에서 보면 머신의 고장으로 인식할 수도 있습니다. 스팟 인스턴스를 이용한 시스템 및 분산 시스템에서 고장이 발생하기 쉬우므로, 시스템 안에서 오류가 발생했을 때, 전체적으로 올바르게 작동하는지 파악하기 위해, 시스템 정지에 대한 내성이 중요해집니다. 이것을 확인하는 방법으로는 모델 검사와 폴트 인젝션이 있습니다.

모델 검사는 시스템의 모든 상태를 탐색하여, 비정상 상태인지를 검사하는 방법입니다. 하지만 시스템 자체의 모든 상태를 탐색하려고 하면 하나의 시스템 메모리 공간만 해도 2의 2의 64 제곱의 크기가 되어, 전혀 현실적이지 않습니다. 그래서 모델 검사는 시스템 모형을 만드는 것으로, 모든 상태의 검색할 수 있게 합니다. 유명한 모델 검사기로는 Spin, NuSMV 등이 있습니다.

폴트 인젝션은 시스템에 일부러 고장을 일으켜 고장 난 때의 동작을 확인하는 방법입니다. 예를 들어 CPU와 같은 반도체에 일부러 방사선을 노출하여 비트 플립을 유발하기도 합니다.

모델 검사와 폴트 인젝션을 결합하여, 시스템 고장 시의 동작을 전부 탐지할 수 있으며, 이를 통해 시스템이 정지에 내성이 있는지를 검사 할 수 있습니다.

RRRSpec은 RRRSpec Hacking Guide에서 설명하듯 시스템의 모델링을 염두에 두며, 몇 가지 고장 시나리오와 복귀 방법을 제시하고, 실행 순서까지도 분석하고 있습니다.

정리

분산 테스트 실행 시스템 RRRSpec을 개발하고 오픈 소스로 공개했습니다. 왜 이러한 도구가 필요한지 설명하고 개발할 때 마주한 엔지니어링 적인 이야기와 그 뒤에 있는 이론적인 이야기에 대해 설명했습니다.

비슷한 문제에 고민하는 분이 RRRSpec을 그대로 쓸 수 있으면 기쁘겠습니다. 그렇지 않다고 해도 RRRSpec에서 나온 문제와 그 해결 방법이 다른 유사한 시스템이나 다른 문제에 참고됐으면 합니다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment