비동기 OS fsync는 무엇이고, 왜 결제 시스템에서 필요할까?
- fsync(fd)는 운영체제에 강제로 디스크에 쓰라고 명령하는 함수입니다.
- 일반적으로 파일에 데이터를 쓰면, OS는 일단 메모리에 있는 캐시(buffer cache)에만 기록하고, 실제 디스크에는 나중에 기록합니다.
- fsync()를 호출하면:
- 캐시에 있는 데이터를
- 디스크로 즉시 flush(플러시)합니다.
⚡ 그럼 asynchronous OS fsync는? 핵심:
“디스크에 즉시 쓰진 않지만, OS가 백그라운드에서 나중에 디스크로 비동기적으로 flush 하는 구조”
- 대부분의 OS는 성능 향상을 위해 파일 시스템 캐시를 사용하고,
- fsync()를 명시적으로 호출하지 않으면, 일정 시간이 지나거나 I/O가 한계에 도달했을 때 비동기적으로 flush를 수행합니다.
📦 흐름 예시
1
2
3
4
5
1. 앱이 파일에 write()
2. OS는 메모리 캐시에 저장만 함
3. 앱은 완료된 것처럼 느끼지만, 디스크에는 아직 안 써짐
4. 나중에 OS가 비동기로 fsync를 수행함 (flush thread 등)
💡 왜 비동기 fsync를 쓸까?
| 목적 | 설명 |
|---|---|
| 성능 향상 | 매 write마다 디스크를 쓰면 느림 → 일단 RAM에 모아둠 |
| 배치 처리 | 한꺼번에 flush하면 디스크 I/O 효율 증가 |
| 앱의 부담 감소 | 앱이 일일이 fsync() 안 해도 운영체제가 알아서 처리 |
- 정전, 커널 패닉 등으로 RAM이 날아가면 데이터 손실 가능
- DB, 결제 시스템 등은 반드시 직접 fsync() 호출 필요
- 기본적으로 fsync()를 호출해서 트랜잭션을 디스크에 flush
- 하지만 설정에 따라 wal_writer_delay, commit_delay 등을 조정하면 비동기적으로 처리 가능
✍️ 정리
| 용어 | 설명 |
|---|---|
| fsync() | 사용자(앱)가 명시적으로 디스크에 flush 요청 |
| async OS fsync | OS가 캐시된 데이터를 자동으로 백그라운드에서 비동기적으로 디스크에 기록 |
| 위험 | flush 전에 장애 발생 시 데이터 유실 가능 |
| 장점 | 성능 향상, 처리량 증가 |
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.



