본문으로 바로가기 본문 바로가기
WIKI 기술 지식 베이스

Machine 일시 중지 및 재개 (Machine Suspend and Resume)

원문 보기 위키 갱신

**Machine 일시 중지(suspend)**는 실행 중인 Fly Machine을 일시 중지하고 메모리를 포함한 전체 상태를 영구 스토리지에 저장해요. 재개하면 OS를 재부팅하거나 앱을 다시 시작하지 않고 정확히 중단했던 지점부터 이어갑니다. 그러면 시작이 여러 초가 아니라 수백 밀리초만에 끝날 수 있어요. 랩톱에서 뚜껑을 닫을 때 하는 것과 비슷하다고 생각하면 됩니다.

출처: 문서

본문

**Machine 일시 중지(suspend)**는 실행 중인 Fly Machine을 일시 중지하고 메모리를 포함한 전체 상태를 영구 스토리지에 저장하게 해 줍니다. 재개하면 머신은 OS를 재부팅하거나 앱을 다시 시작하지 않고 정확히 중단했던 지점부터 이어갑니다. 그러면 시작이 여러 초가 아니라 수백 밀리초만에 끝날 수 있어요.

일시 중지는 랩톱이 뚜껑을 닫을 때 하는 것과 같다고 생각하면 됩니다. 다만 여러분의 "랩톱"은 dfw, fra, syd 같은 곳에서 실행되는 마이크로VM이라는 점이 다르죠.

동작 방식 (How it works)

일시 중지는 Firecracker 스냅샷을 사용해 전체 VM 상태를 캡처합니다: CPU 레지스터, 메모리 내용, 열린 파일 핸들. 실행 중인 일시 중지된 머신을 시작하면 Fly는 콜드 부팅 대신 이 스냅샷에서 복원해요.

일반적인 성능:

  • 일시 중지에서 재개: 수백 ms
  • 콜드 시작: 일반적인 앱은 \~2+초
  • 원격 측이 열어 두면 TCP 연결이 유지될 수 있습니다

일시 중지 사용하기 (Using Suspend)

수동으로 (Manually)

# Suspend a machine
fly machine suspend <machine-id>

# Check status (running, suspending, suspended, etc.)
fly machine status <machine-id>

# Resume from snapshot
fly machine start <machine-id>

# Force a cold start (discard snapshot)
fly machine stop <machine-id>
fly machine start <machine-id>

Fly Proxy를 통해 자동으로

fly.toml에서 구성하세요:

[http_service]
  auto_stop_machines = "suspend"  # or "stop"
  auto_start_machines = true
  
  [[http_service.concurrency]]
    type = "requests"
    soft_limit = 25

프록시는 저트래픽 동안 머신을 자동으로 일시 중지하며, 몇 분마다 유휴 기간을 확인하고 요청이 도착하면 재개합니다.

Machines API

# Suspend
POST /v1/apps/{app_name}/machines/{machine_id}/suspend

# Wait for suspension to complete
GET /v1/apps/{app_name}/machines/{machine_id}/wait?state=suspended

# Resume (standard start endpoint)
POST /v1/apps/{app_name}/machines/{machine_id}/start

일반적으로 Machines API를 사용하려면 API 토큰이 필요합니다. 하지만 자신의 머신을 일시 중지하는 것뿐이라면 토큰을 건너뛰고 /.fly/api Unix 소켓을 직접 호출할 수 있어요:

$ curl --unix-socket /.fly/api -X POST \
  http://flaps/v1/apps/$FLY_APP_NAME/machines/$FLY_MACHINE_ID/suspend

요구 사항 (Requirements)

다음 조건을 충족하면 머신은 일시 중지를 사용할 수 있어요:

  • ≤ 2 GB 메모리 (그보다 큰 메모리 크기에서는 일시 중지 시간이 늘어나므로 권장되지 않습니다)
  • swap 미구성
  • schedule 미구성
  • 2024년 6월 20일 20:00 UTC 이후에 업데이트됨

오래된 머신이 있거나 마지막 업데이트 시점이 확실하지 않다면 다음으로 최신 상태로 만들 수 있어요:

fly machine update <machine-id> --yes 

이것은 앱 코드나 이미지를 변경하지 않고 머신을 제자리에서 일시 중지를 위한 최신 지원 구성으로 업데이트합니다.


제한 사항 및 고려 사항

  • 일시 중지는 현재 큰 머신 메모리 크기(> 2 GB)에는 권장되지 않습니다
  • 많은 머신을 한 번에 일시 중지하는 것은 권장되지 않습니다
  • 재개 후 일부 로그가 손실될 수 있습니다
  • stop과 달리 일시 중지는 머신의 rootfs를 리셋하지 않습니다
  • 재개 시 NTP가 동기화될 때까지 시계가 몇 초 정도 늦을 수 있습니다
항상 재개와 콜드 시작 경로 모두를 위해 설계하세요.

일시 중지와 스냅샷 동작

스냅샷은 그것이 촬영된 머신의 정확한 코드와 상태에 묶여 있습니다. 새 코드를 배포하면 이전 스냅샷은 안전하게 재개될 수 없으며 폐기됩니다.

스냅샷은 유지된다는 보장이 없습니다. 다음과 같은 경우 콜드 시작이 발생할 수 있어요:

  • 앱의 새 버전을 배포합니다 — 배포가 머신 이미지를 재구축하므로 이전 스냅샷이 무효화됩니다. 스냅샷은 이전 프로세스의 말 그대로의 메모리 덤프이므로, 새 코드나 의존성을 교체한 후 이를 재개하는 것은 안전하지 않고 예측할 수 없습니다.
  • 머신이 다른 호스트로 마이그레이션됨
  • 스냅샷 파일이 손실되거나 손상됨 — 하드웨어 오류, 공간 회수 또는 손상으로 삭제될 수 있습니다
  • 저희가 시스템 유지 보수나 업데이트를 수행함

일시 중지와 볼륨 동작

일시 중지는 머신의 메모리 상태를 영구 스토리지에 자동으로 저장합니다. 일시 중지가 동작하기 위해 볼륨을 연결할 필요는 없고, 스냅샷은 볼륨에 저장되지 않아요.

머신에 연결된 볼륨이 있다면, 볼륨과 그 데이터는 일시 중지와 재개에 영향을 받지 않습니다. 머신 스냅샷과 볼륨을 별개의 것으로 생각하는 것이 도움이 돼요:

  • 스냅샷은 저장된 CPU와 메모리 상태로, Fly가 관리합니다. 예를 들어 배포 중에 폐기될 수 있으며, 이는 콜드 시작을 강제합니다.
  • 볼륨은 여러분의 영구 스토리지입니다. 그 데이터는 정상적인 stop과 start를 거치는 것과 마찬가지로 일시 중지, 재개, 콜드 시작에도 생존합니다.

스냅샷이 폐기되고 머신이 콜드 시작해도 볼륨의 데이터는 여전히 그대로 있습니다.


재개 후 네트워크 연결 처리

재개 시 머신은 자기 네트워크 연결이 여전히 살아 있다고 생각합니다. 외부 시스템(데이터베이스, API)은 동의하지 않을 수 있어요.

일반적인 증상:

  • ECONNRESET
  • "Connection closed"
  • 첫 요청에서 타임아웃
  • 데이터베이스 풀 오류

해결책: 실패 시 재연결하세요.

예제 (Python + DB):

try:
    result = db.execute(query)
except (ConnectionError, OperationalError):
    db.reconnect()
    result = db.execute(query)

팁:

  • 연결 해제 처리가 있는 연결 풀을 사용하세요(이 훌륭한 SQLAlchemy 가이드 참고)
  • 빠르게 실패하도록 연결 타임아웃을 단축하세요
  • HTTP 클라이언트에는 재시도/백오프를 사용하세요
  • 긴 일시 중지 후 테스트하세요

요금 (Billing)

일시 중지된 머신은 중지된 머신과 같은 비용입니다. 스토리지만요. CPU/RAM 요금은 없습니다.

일시 중지된 머신에 볼륨이 있다면, 볼륨이 존재하는 동안 계속 그 비용을 지불합니다. 볼륨 스토리지는 머신이 실행 중이든, 중지되었든, 일시 중지되었든 관계없이 청구됩니다.

머신을 일시 중지하면 비용은 낮아지지만 리전의 용량을 확보하지는 않습니다. 일시 중지된 머신은 여전히 리소스를 예약하므로, 용량이 제한된 리전에 더 많은 머신을 채워 넣는 방법으로 일시 중지를 사용할 수는 없습니다.

모니터링 및 디버깅 (Monitoring & Debugging)

fly machine status <machine-id>

상태:

  • running
  • suspending
  • suspended
  • starting (재개 또는 콜드 시작)
  • stopped

머신이 예기치 않게 콜드 시작되면:

  • 요구 사항을 확인하세요
  • 마이그레이션이나 배포가 발생하지 않았는지 확인하세요
  • 일시 중지/재개 이벤트에 대한 로그를 확인하세요

콜드 시작 테스트:

fly machine stop <machine-id>
fly machine start <machine-id>

가용성 (Availability)

일시 중지는 2024년 7월 기준으로 모든 Fly.io 리전에서 동작합니다.


관련 자료 (Related reading):

더 알아보기 (Learn more)