메모리의 익명 페이지란 무엇입니까?

메모리의 익명 페이지란 무엇입니까?

최근 내 웹 서버 중 하나가 더 많은 메모리를 소비하고 있었는데, 확인해보니 /proc/meminfoAnonPages가 거의 모든 메모리를 소비하고 있는 것으로 나타났습니다.

일부 문서에서 이 문제를 이해하려고 노력하고 있지만 명확하지 않습니다. 누군가 정확히 무엇이고 어떻게 해결하는지 도와줄 수 있습니까?

답변1

매뉴얼 페이지에서 proc(5):

AnonPages %lu (since Linux 2.6.18)
       Non-file backed pages mapped into user-space page tables.

Linux에서 프로세스가 메모리를 매핑하는 방식은 일반적으로 mmap(2)"파일이나 장치를 메모리에 매핑"하는 시스템 호출을 사용하는 것입니다. 메모리는 디스크의 실제 파일로 뒷받침될 수 있으므로 일반 메모리 블록처럼 파일을 처리할 수 있습니다.

그러나 어떤 파일에서도 지원되지 않는 빈 메모리 부분을 할당할 수도 있습니다. 이러한 메모리 페이지를 "익명"이라고 합니다. 매뉴얼 페이지에서 mmap:

MAP_ANONYMOUS
       The mapping is not backed by any file; its contents are initialized to zero.

C로 프로그래밍해 본 적이 있다면 아마도 malloc(3)C를 사용하여 동적 메모리를 할당하는 방법에 익숙할 것입니다. Linux에서는 대부분의 경우 익명 메모리 할당 페이지를 malloc실제로 호출합니다 .mmap

AnonPages가장 일반적인 메모리 유형(프로세스에서 사용하는 동적 메모리 영역)의 사용량을 보여줍니다.

mmap익명 페이지의 사용 또는 할당이 malloc반드시 즉시 AnonPages반영되는 것은 아닙니다. 동적 메모리를 할당하면 사용할 수 있는 가상 주소 공간만 얻을 수 있지만, 메모리 페이지는 실제로 "인스턴스화"되지 않고 프로세스의 사용자 공간 메모리를 사용하기 시작할 때까지(메모리에서 쓰기 또는 읽기) 프로세스의 사용자 공간 메모리에 매핑되지 않습니다. 그런 다음에만 이러한 메모리 페이지가 RAM에 로드되고 계산됩니다 AnonPages.

간단히 말해서, AnonPages"메모리"와 "RAM"을 생각할 때 가장 먼저 떠오르는 것은 아마도 "메모리"일 것입니다. "일반" 메모리 페이지는 요청에 따라 프로세스에 동적으로 할당되고 해당 프로세스에서 사용됩니다. 실제로 "고칠" 필요는 없습니다. AnonPages"최고의 타자"가 되는 것은 예상되고 일반적인 일입니다.

가장 많은 메모리를 차지하는 프로세스(예: 사용 top)를 찾아 그에 따라 행동해야 합니다. 많은 메모리(RSS)를 소비하는 하나의 프로세스가 있거나 메모리를 채우는 많은 프로세스가 있을 수 있습니다.

관련 정보