SFTP vs NFS — 실시간 I/O엔 왜 NFS인가
파일을 원격에 두고 쓸 때 SFTP 와 NFS 를 자주 견줍니다. 둘 다 “원격 파일” 을 다루지만 성격이 완전히 다릅니다. 배치 전송이면 SFTP, 실시간 읽기·쓰기면 NFS 입니다. 왜 그런지가 구조에 있습니다.
SFTP — SSH 위의 전송 서브시스템
SFTP 는 별도 소프트웨어가 아니라 OpenSSH 에 내장된 서브시스템입니다. sshd
데몬이 파일 전송 요청을 처리하는 구조입니다. 그래서 SFTP 로 읽고 쓰는 건
유저 공간에서 요청-응답을 주고받는 일입니다.
문제는 이 요청-응답이 매번 왕복을 요구한다는 겁니다.
클라이언트 서버
│── "파일 열어줘" ─────────▶│
│◀──────────── "OK" ────────│ 왕복 1번
│── "0~32KB 읽어줘" ───────▶│
│◀──────────── [32KB] ──────│ 왕복 1번
│── "32~64KB 읽어줘" ──────▶│
│◀──────────── [32KB] ──────│ 왕복 1번
게다가 단일 패킷 페이로드가 RFC 기준 32KB 로 제한됩니다. 큰 파일은 무조건 여러 번 나눠 요청해야 하고, 조각마다 SSH 암호화 비용이 붙습니다. 파이프라이닝 (응답을 안 기다리고 요청을 미리 여러 개 보냄)으로 완화되지만, 라이브러리가 지원해야 하고 암호화 오버헤드는 그대로입니다.
NFS — 앱이 구분 못 하는 커널 파일시스템
NFS 는 커널 공간의 파일시스템이라, 마운트하고 나면 앱은 그게 원격인지 로컬
디스크인지 구분하지 못합니다. open/read/write 시스템콜을 그대로
쓰고, 커널이 알아서 원격과 주고받습니다. 유저 공간에서 매번 요청-응답을
문자열로 주고받는 SFTP 와 근본이 다릅니다.
여기에 커널의 페이지 캐시가 얹힙니다. 한 번 읽은 블록은 메모리에 캐시되고, 순차 접근이면 읽기 선반영(readahead)으로 미리 당겨 옵니다. 그래서 반복 접근·순차 접근에서 NFS 가 훨씬 유리합니다.
선택 기준 — 배치는 SFTP, 실시간은 NFS
- 배치성 전송(업로드/다운로드) → SFTP. 파일을 통째로 한 번 옮기는 용도라면 요청-응답 왕복이 문제가 안 됩니다. SSH 하나로 인증·암호화가 끝나는 것도 장점입니다.
- 실시간 I/O(앱이 원격 파일을 로컬처럼 계속 읽고 쓰기) → NFS. 조각마다 왕복·암호화가 붙는 SFTP 로는 못 버팁니다.
한 줄로 하면, SFTP 는 파일을 옮기는 프로토콜이고 NFS 는 파일시스템 입니다. 실시간으로 읽고 쓰는 자리에 전송 프로토콜을 끼우면 왕복 지연이 쌓입니다.
댓글 0