서버에서 디스크 동기화(fsync)가 잦을 때 생기는 성능 문제

서버 성능 이슈를 분석하다 보면 CPU나 네트워크는 여유가 있는데, 응답 속도는 느리고 I/O wait 수치만 높은 상황을 마주하는 경우가 많습니다. 이때 자주 등장하는 원인 중 하나가 디스크 동기화(fsync)의 과도한 사용입니다. fsync는 데이터 무결성을 보장하는 중요한 시스템 호출이지만, 사용 빈도가 높아질수록 서버 전체 성능에 구조적인 부담을 주게 됩니다.

fsync는 어떤 역할을 하는가

fsync는 애플리케이션이 기록한 데이터를 운영체제의 캐시 수준에서 끝내지 않고, 실제로 디스크에 기록이 완료될 때까지 강제로 대기하게 만드는 동작입니다.
즉,
쓰기 요청
캐시 반영
디스크 플러시 완료
까지를 하나의 트랜잭션처럼 묶는 역할을 합니다.

이 덕분에 전원 장애나 시스템 크래시 상황에서도 데이터 유실을 최소화할 수 있습니다.

문제가 되는 지점은 ‘동기화 대기’

fsync 자체가 느린 연산이라기보다는, 대기(wait) 가 문제의 핵심입니다. fsync를 호출한 스레드는 디스크가 실제로 쓰기 작업을 마칠 때까지 블로킹 상태로 멈춥니다.

이 과정에서
SSD 내부 플래시 프로그램 지연
HDD의 회전 지연
스토리지 컨트롤러 큐 적체
가 그대로 응답 지연으로 전이됩니다.

fsync가 잦아질수록 성능이 급격히 떨어지는 이유

fsync 호출 빈도가 높아지면, 디스크는 작은 쓰기 요청을 연속적인 동기 플러시 작업으로 처리하게 됩니다. 이때 발생하는 문제는 다음과 같습니다.

쓰기 병합 불가
쓰기 큐 깊이 감소
순차 쓰기가 랜덤 쓰기로 분해
스토리지 내부 캐시 무력화

결과적으로 디스크의 실제 처리 효율이 크게 떨어집니다.

Page Cache와 fsync의 충돌 구조

리눅스는 Page Cache를 통해 쓰기 성능을 높입니다. 평소에는
메모리에 먼저 기록
나중에 묶어서 디스크 반영
하는 구조입니다.

하지만 fsync는 이 흐름을 강제로 끊습니다. 캐시에 쌓인 데이터를 기다리지 않고 즉시 디스크에 반영하도록 요구하기 때문에, Page Cache의 성능 최적화 효과가 거의 사라집니다.

I/O wait이 급증하는 메커니즘

fsync가 빈번해지면 CPU는 놀고 있어도, 프로세스는 디스크 응답을 기다리느라 실행되지 못합니다. 이 상태가 바로 I/O wait 증가입니다.

특히 문제는
단일 fsync가 느려지는 것이 아니라
여러 스레드가 동시에 fsync 대기에 걸리며
전체 처리량이 급격히 떨어진다는 점
입니다.

데이터베이스 환경에서의 fsync 폭증

데이터베이스 서버에서는 fsync 문제가 더욱 두드러집니다.
트랜잭션 커밋마다 fsync
로그 파일에 대한 동기 기록
WAL(Write Ahead Logging) 구조
등으로 인해 fsync 호출이 매우 빈번해질 수 있습니다.

이 경우 디스크 성능이 충분해 보여도, 지연 분산(latency jitter) 이 커져 응답 시간이 불안정해집니다.

SSD에서도 fsync는 안전하지 않다

SSD는 빠르기 때문에 fsync 부담이 적을 것이라 생각하기 쉽지만, 현실은 다릅니다. fsync는 SSD 내부에서
FTL 매핑 갱신
플래시 블록 프로그램
메타데이터 동기화
까지 강제합니다.

이 과정은 내부적으로 매우 무겁고, 특히 소비자용 SSD에서는 fsync 지연이 수 밀리초 이상 튀는 경우도 흔합니다.

성능 저하가 ‘간헐적’으로 보이는 이유

fsync 문제는 항상 느린 것이 아니라, 간헐적으로 크게 느려지는 특성을 가집니다. 이는
스토리지 내부 가비지 컬렉션
쓰기 증폭
캐시 플러시 타이밍
과 맞물리기 때문입니다.

그래서 평소에는 정상처럼 보이다가, 특정 순간에만 응답이 급격히 느려지는 현상이 발생합니다.

서버 전체에 미치는 연쇄 효과

fsync 대기가 누적되면
요청 큐 적체
스레드 풀 고갈
타임아웃 증가
재시도 로직 폭증
으로 이어지며, 단순한 디스크 문제가 서비스 전체 장애처럼 보이게 만듭니다.

이 때문에 fsync 문제는 원인을 찾기 어려운 성능 장애로 자주 오인됩니다.

fsync를 줄이지 못하는 이유

문제는 fsync를 단순히 줄이기 어렵다는 점입니다. fsync는 데이터 무결성과 직결되기 때문에,
완전히 제거하기 어렵고
잘못 줄이면 데이터 손실 위험
이 발생합니다.

그래서 성능 튜닝은 fsync 제거가 아니라, 빈도와 타이밍을 조절하는 방향으로 접근해야 합니다.

구조적으로 접근해야 하는 개선 방향

fsync로 인한 성능 문제는
애플리케이션 쓰기 패턴
파일 시스템 설정
스토리지 특성
을 함께 고려해야 합니다.

단순히 “디스크가 느리다”가 아니라, 동기화 요청이 디스크의 설계와 맞지 않게 사용되고 있는지를 보는 것이 핵심입니다.

정리

서버에서 fsync가 잦아질수록 성능 문제는 필연적으로 발생합니다. 이는 디스크 속도의 문제가 아니라, 캐시 기반 비동기 쓰기 구조를 강제로 끊는 동기화 대기 비용 때문입니다. fsync는 반드시 필요한 기능이지만, 과도한 사용은 I/O wait 증가, 응답 지연, 처리량 감소로 이어집니다. 결국 안정적인 서버 성능을 위해서는 fsync를 무작정 피하는 것이 아니라, 언제, 얼마나, 어떤 방식으로 사용하고 있는지를 구조적으로 이해하는 것이 가장 중요합니다.

댓글 남기기