d8a80f6272
이름만 다른(표기 변형) [[위키링크]]를 대상 문서의 canonical 제목으로 치환해 끊겼던 1,200개 링크를 연결. 제목/파일명 정규화 일치만 적용하고 별칭 매칭은 과병합 위험으로 제외(애매성 가드). 원본은 _link_reconcile_backup/ 에 백업. 도구: Datacollect/scripts/link_reconcile_apply.mjs Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
158 lines
4.8 KiB
Markdown
158 lines
4.8 KiB
Markdown
---
|
|
id: wiki-2026-0508-snapshots
|
|
title: Snapshots
|
|
category: 10_Wiki/Topics
|
|
status: verified
|
|
canonical_id: self
|
|
aliases: [State Snapshot, V8 Snapshot, GC Snapshot, Heap Snapshot]
|
|
duplicate_of: none
|
|
source_trust_level: A
|
|
confidence_score: 0.9
|
|
verification_status: applied
|
|
tags: [runtime, performance, debugging, memory, state]
|
|
raw_sources: []
|
|
last_reinforced: 2026-05-10
|
|
github_commit: pending
|
|
tech_stack:
|
|
language: javascript
|
|
framework: v8
|
|
---
|
|
|
|
# Snapshots
|
|
|
|
## 매 한 줄
|
|
> **"매 point-in-time 의 state freeze — 매 startup 의 accelerate, 매 leak 의 hunt, 매 recovery 의 enable."**. 매 V8 startup snapshot, heap snapshot, filesystem snapshot (ZFS/Btrfs), DB snapshot, state snapshot (Redux time-travel) — 매 same primitive 의 different domain. 매 modern runtime 의 cold-start optimization 의 default tool.
|
|
|
|
## 매 핵심
|
|
|
|
### 매 종류
|
|
- **V8 startup snapshot**: serialize heap → fast Node.js cold start.
|
|
- **Heap snapshot** (`.heapsnapshot`): debug memory leak, retainer graph.
|
|
- **GC snapshot**: generational scan checkpoint.
|
|
- **Filesystem snapshot**: ZFS/Btrfs/LVM copy-on-write point-in-time.
|
|
- **DB snapshot**: PITR base, transactional checkpoint.
|
|
- **State snapshot**: Redux DevTools time-travel, game save.
|
|
|
|
### 매 properties
|
|
- Copy-on-write (efficient diff storage).
|
|
- Atomic (consistent point-in-time).
|
|
- Restorable (full state reconstruction).
|
|
- Immutable (snapshot itself never mutated).
|
|
|
|
### 매 응용
|
|
1. Node.js bootup `--snapshot-blob` (200ms → 30ms startup).
|
|
2. Chrome DevTools heap profiler — leak hunt.
|
|
3. ZFS rollback before risky deploy.
|
|
4. Postgres PITR base + WAL replay.
|
|
5. Redux DevTools — time-travel debug.
|
|
6. AWS EBS snapshot — disaster recovery.
|
|
7. Container checkpoint/restore (CRIU).
|
|
|
|
## 💻 패턴
|
|
|
|
### Node.js startup snapshot
|
|
```bash
|
|
node --snapshot-blob snapshot.blob --build-snapshot snapshot-init.js
|
|
node --snapshot-blob snapshot.blob app.js
|
|
# Cold start: 200ms → ~30ms
|
|
```
|
|
|
|
### Chrome heap snapshot programmatic
|
|
```javascript
|
|
const v8 = require('v8');
|
|
const fs = require('fs');
|
|
const stream = v8.getHeapSnapshot();
|
|
stream.pipe(fs.createWriteStream('heap.heapsnapshot'));
|
|
// Open in Chrome DevTools → Memory tab
|
|
```
|
|
|
|
### ZFS snapshot + rollback
|
|
```bash
|
|
zfs snapshot tank/data@before-deploy
|
|
# ... risky operation ...
|
|
zfs rollback tank/data@before-deploy # if failure
|
|
zfs destroy tank/data@before-deploy # if success
|
|
```
|
|
|
|
### Postgres base backup + PITR
|
|
```bash
|
|
pg_basebackup -D /backup/base -F tar -X stream -P
|
|
# Recover to point-in-time
|
|
restore_command = 'cp /archive/%f %p'
|
|
recovery_target_time = '2026-05-10 14:30:00'
|
|
```
|
|
|
|
### Redux state snapshot
|
|
```typescript
|
|
import { createStore } from 'redux';
|
|
const store = createStore(reducer);
|
|
|
|
const snapshot = store.getState(); // freeze
|
|
// ... actions ...
|
|
store.replaceReducer((state = snapshot) => state); // restore
|
|
```
|
|
|
|
### CRIU container checkpoint
|
|
```bash
|
|
criu dump --tree $PID --images-dir /checkpoints/svc-1 --leave-running
|
|
# Later, possibly on different host:
|
|
criu restore --images-dir /checkpoints/svc-1
|
|
```
|
|
|
|
### EBS snapshot via AWS SDK
|
|
```typescript
|
|
import { EC2Client, CreateSnapshotCommand } from '@aws-sdk/client-ec2';
|
|
|
|
await client.send(new CreateSnapshotCommand({
|
|
VolumeId: 'vol-0abc',
|
|
Description: 'pre-migration-2026-05-10',
|
|
TagSpecifications: [{ ResourceType: 'snapshot', Tags: [{ Key: 'env', Value: 'prod' }] }],
|
|
}));
|
|
```
|
|
|
|
### Heap diff analysis
|
|
```javascript
|
|
// Take 2 snapshots, diff in DevTools to find leak
|
|
v8.writeHeapSnapshot('/tmp/before.heapsnapshot');
|
|
runSuspectCode();
|
|
v8.writeHeapSnapshot('/tmp/after.heapsnapshot');
|
|
// Load both → "Comparison" view → growing retainer chains
|
|
```
|
|
|
|
## 매 결정 기준
|
|
| 상황 | Approach |
|
|
|---|---|
|
|
| Node.js cold start slow | startup snapshot |
|
|
| Memory leak hunt | heap snapshot diff |
|
|
| Pre-deploy rollback safety | ZFS/EBS snapshot |
|
|
| DB recovery to time T | PITR base + WAL |
|
|
| Container live migration | CRIU checkpoint |
|
|
| Frontend bug repro | Redux time-travel |
|
|
|
|
**기본값**: heap snapshot for leaks, ZFS/EBS for storage, PITR for DB, CRIU for container.
|
|
|
|
## 🔗 Graph
|
|
- 부모: [[State Management]]
|
|
- 변형: [[Heap Snapshot]] · [[V8-Snapshot]]
|
|
- 응용: [[Disaster-Recovery]]
|
|
- Adjacent: [[Event Sourcing]]
|
|
|
|
## 🤖 LLM 활용
|
|
**언제**: cold-start optim, leak diag, DR planning, time-travel debug strategy.
|
|
**언제 X**: write-heavy hot path — snapshot overhead 의 measure 필요.
|
|
|
|
## ❌ 안티패턴
|
|
- **Snapshot as backup**: 매 same disk 의 snapshot 의 disk failure 의 protect X.
|
|
- **No retention policy**: 매 snapshot accumulate → storage explode.
|
|
- **Heap snapshot in prod under load**: 매 GC pause spike — staging 에서.
|
|
|
|
## 🧪 검증 / 중복
|
|
- Verified (V8 docs, Chrome DevTools docs, ZFS handbook, Postgres PITR docs).
|
|
- 신뢰도 A.
|
|
|
|
## 🕓 Changelog
|
|
| 날짜 | 변경 |
|
|
|---|---|
|
|
| 2026-05-08 | Phase 1 |
|
|
| 2026-05-10 | Manual cleanup — snapshot taxonomy, V8/heap/ZFS/PITR/CRIU patterns |
|