[TIL/크래프톤 정글9기] 58일차 (Week 08 웹서버에서 정적파일 전송 시 mmap or malloc??)

blueprint·2025년 7월 9일

크래프톤정글9기

목록 보기
48/55

mmap or malloc?

CSAPP 숙제 문제를 하며 11.9 문제에서 기존에 사용한 mmap 대신 malloc을 사용하여 정적 컨텐츠를 처리하라고 되어있었다. mmap과 malloc을 사용하는 기준과 일반적으로 어떤 것이 많이 쓰이는지 궁금해졌다.

Tiny를 수정해서 정적 컨텐츠를 처리할 때 요청한 파일을 mmap과 rio_readn 대신에 malloc, rio)readn, rio_writen을 사용해서 연결 식별자에게 복사하도록 하시오.

정적 파일 전송이란?

  • 웹 서버가 클라이언트에게 HTML, CSS, 이미지 등의 정적인 파일을 전송하는 작업
  • 요청이 들어오면 서버는 해당 파일을 디스크에서 읽어 클라이언트에 보냄

전송 방식의 종류

방식설명복사 횟수
malloc + read + write파일을 힙에 복사 후 클라이언트에 전송2회 복사
mmap + write파일을 메모리에 직접 매핑 후 전송1회 복사
sendfile()커널이 파일에서 소켓으로 직접 전송0회 복사 (zero-copy)

malloc의 작동 방식

  • malloc(size)은 힙(heap)에 메모리를 할당
  • 이후 read() 시스템 콜을 통해 파일 내용을 복사
  • write할 때 다시 커널로 복사됨 → 총 2번 복사
  • 구현이 간단
  • 메모리 관리가 명확함 (할당/해제 시점이 명확)
  • 작은 파일에서는 mmap 오버헤드가 없어 더 빠를 수 있음

메모리 흐름:

  • [디스크] → [커널 공간] → [사용자 공간 malloc 버퍼] → [커널] → [소켓]

mmap의 작동 방식

  • mmap()은 파일을 가상 메모리 주소 공간에 직접 매핑
  • read() 없이도 메모리에 바로 접근 가능
  • write() 시 커널이 직접 페이지 캐시에서 전송
    복사 줄어듦
  • 같은 파일을 여러 프로세스가 동시에 접근할 때 메모리 공유 가능
  • 페이지 폴트 기반 지연 로딩 (전체 파일을 한 번에 메모리에 올리지 않음)
  • 커널의 페이지 캐시 활용으로 반복 요청 시 더 빠름

메모리 흐름:
[디스크] → [커널 공간 (페이지 캐시)] → [소켓]

접근 시점에만 로딩됨 (page fault 기반 lazy load)


sendfile()이 더 빠름

  • 사용자 공간을 아예 거치지 않음
  • 커널이 직접 디스크 ↔ 소켓 처리
  • zero-copy 방식
  • mmap보다도 빠름

실제 웹서버는 뭘 쓸까?

서버사용 방식
Nginxsendfile() (sendfile on)
Apache 2.4 이후sendfile() 또는 mmap 설정 가능
  • nginx.conf

  • apache2.conf
    명시적으로 지정 해야 함


어떤 방식이 유리하나?

상황추천 방식이유
파일이 작음 (<128KB)malloc간단하고 빠름
파일이 큼 (>=128KB)mmap복사 줄고 커널 캐시 이용
최고 성능 필요sendfile()완전한 zero-copy

※ 기준이 128인 이유

  • glibc malloc이 MMAP_THRESHOLD (기본값 128KB)를 넘으면 내부적으로 mmap 사용
  • 즉, 큰 파일에서는 어차피 malloc도 내부적으로 mmap을 사용
  • 따라서 작은 파일에서는 malloc이 더 효율적

0개의 댓글