Varnish는 mlock()을 통해 메모리에 기록되는 ~80MB 파일 기반 SHM 로그를 사용하는 HTTP 가속기입니다. 이것광택 문서불필요한 디스크 액세스를 피하기 위해 tmpfs에 파일을 저장하는 것이 좋습니다. 그러나 전체 파일이 메모리에 잠겨 있으면 Linux 커널이 여전히 백업 파일에 쓸 수 있습니까?
나는 이것을 모니터링하기 위해 inotify와 fatrace를 사용해 보았지만 이 상호 작용은 아마도 커널 내부에서 발생하기 때문에 이러한 도구에는 파일 활동이 전혀 표시되지 않습니다. ls를 사용하여 백업 파일을 모니터링하면 파일 시간 변경이 표시되고 sha1sum은 내용 변경이 표시되기 때문에 파일이나 파일 시스템에 일종의 업데이트가 있었던 것 같습니다. 그러나 실제로 디스크 액세스가 포함됩니까, 아니면 이 모든 것이 메모리에서 발생합니까?
기본적으로 SHM을 사용하여 SHM을 지원하는 것은 존재하지 않을 수도 있는 문제에 대한 추악한 해결 방법처럼 보이기 때문에 tmpfs 해결 방법을 수행하지 않으려고 합니다.
답변1
Varnish는 공유 메모리에 (예: POSIX 대신 shm_open
) 일반 메모리 매핑 파일을 사용하는 것 같습니다. ~에서원천:
loghead = mmap(NULL, heritage.vsl_size,
PROT_READ|PROT_WRITE,
MAP_HASSEMAPHORE | MAP_NOSYNC | MAP_SHARED,
heritage.vsl_fd, 0);
BSD에서는 MAP_NOSYNC
강제로(예를 들어 메모리를 해제하는 경우) 않는 한 공유 데이터를 디스크에 쓰지 않도록 커널에 요청합니다. 잠겨 있는 경우에는 이런 일이 거의 발생하지 않습니다. 안타깝게도,Linux에서는 지원되지 않습니다 MAP_NOSYNC
.
따라서 Linux는 캐시에서 디스크로 더티(변경된) 페이지를 정기적으로 기록하게 됩니다. tmpfs에 캐시를 배치하면 이를 방지할 수 있습니다. POSIX 또는 SysV 공유 메모리를 사용하는 Varnish의 경우에도 마찬가지입니다(실제로 POSIX 공유 메모리는 Linux에서 구현되고 거기에 tmpfs가 설치되어 있으므로 /dev/shm
tmpfs를 사용하는 것이 좋습니다).