it-swarm-ko.tech

Red Hat Linux가 시스템에서 실제 사용 가능한 메모리보다 적은 메모리를보고하는 이유는 무엇입니까?

비교적 작은 가정용 Red Hat Linux 서버 (약 8GB RAM)가 있습니다. 나는 다양한 것들을 추적하기 위해 집에서 자란 앱을 실행하는 것 외에는 많이 사용하지 않습니다. 박스에서 실행되는 유일한 실제 것은 데이터베이스와 웹 서버입니다.

NMON 및 TOP과 같은 도구를 사용하여 시스템 카운터를 검사 할 때 총 시스템 여유 메모리는 상대적으로 적고 (수백 MB 정도) 데이터베이스 및 웹 서버의 활성 메모리는 여전히 낮습니다 (단지 결합 된 3GB 소비). 다른 모든 실행중인 프로세스를 포함하더라도 총 소비 메모리는 4GB 미만입니다.

Red Hat Linux가 총 메모리에서 실행중인 프로세스에 사용 된 총 메모리를 뺀 것보다 적은 메모리를보고하는 이유는 무엇입니까?

9
Aaron K

사용 가능한 메모리와 사용되지 않은 메모리를 혼동하지 마십시오. 유닉스 세계에서 사용 가능한 메모리는 논리적 데이터가 매핑되지 않은 물리적 메모리 페이지입니다. 사용되지 않은 메모리에는 일부 데이터가 매핑되어 있지만 현재 실행중인 프로세스에서 active 사용하지 않습니다.

% free -m
             total       used       free     shared    buffers     cached
Mem:           997        942         55          0         71        366
-/+ buffers/cache:        504        492
Swap:         2015        618       1397

리눅스 (및 모든 유닉스 OS)는 가능한 한 적은 메모리를 확보하려고합니다. 대신, 다양한 IO 전송 작업을위한 파일 캐시 및 버퍼와 같은 작업을 위해 실행중인 OS의 프로세스에 능동적으로 매핑되지 않은 메모리를 사용합니다.

혼란 스러울 수있는 다른 것은 실행중인 모든 프로세스에서 사용중인 메모리를 추가하여 총 사용중인 메모리를 얻을 수 없다는 것입니다. 이 작업을 시도하면 응용 프로그램이 실제로 컴퓨터에있는 것보다 많은 메모리를 사용하고있는 것으로 나타납니다. 이것은 두 가지 이유 때문입니다

  1. Copy-On-Write 메모리 할당, memory mapping IOshared dynamic library 를 통해 다양한 프로세스간에 메모리를 공유 할 수 있습니다.
  2. 운영 체제는 실제로 제공된 것보다 많은 메모리를 응용 프로그램에 약속 할 자유가 있습니다. 대부분의 응용 프로그램 작성자는 오버 헤드를 피하기 위해 한 번에 많은 양의 메모리를 요청하는 것을 선호하며 실제로 모든 메모리를 사용하지 않을 수도 있습니다.

이 문제를 논의하는 lwn.net 에 관한 최근 기사가 있습니다.

19
Dave Cheney

Linux는 파일 시스템 액세스를 메모리에 적극적으로 캐시하여 디스크 액세스 시간을 단축합니다. 걱정할 것이 없습니다.

상자에서 free -m을 실행하면 메모리 사용 위치를 더 잘 알 수 있습니다.

아래는 내 상자 중 하나에서 가져온 출력입니다. 사용 가능한 메모리는 파일 시스템 액세스 요청을 위해 거의 4G 캐시 된 147Meg입니다.

free -m
             total       used       free     shared    buffers     cached
Mem:          6035       5888        147          0         77       4116
-/+ buffers/cache:       1693       4341
Swap:         4722          0       4722
4
Ryaner

시스템에서 어떤 종류의 커널을 실행하고 있습니까? 32 비트 커널은 PAE가 활성화 된 상태로 컴파일되지 않는 한 약 3.6GB의 메모리 만보고합니다.

이 버전이 최신 버전의 Redhat Enterprise Linux (또는 CentOS)-v3 이상이면 기본 32 비트 커널에서이 기능을 사용할 수 있습니다.

위에서 설명한 '무료'명령의 출력을 게시 할 수 있으면 이것이 문제인지 여부를 확인할 수 있습니다.

1
Mike Pountney

"buffered"및 "cached"필드도 포함하고 있습니까?

1
jj33

리눅스에서,/proc/meminfo의 Committed_AS를 살펴보면, 커널이 실제로 프로세스 실행을 약속 한 메모리 양 (실제 + 스왑)입니다.

리눅스는 메모리를 매우 효율적으로 사용하며, 어떤 프로세스로 약속 된 블록 not 은 최근에/자주 액세스하는 파일을 캐시하는 데 사용됩니다. 따라서 리눅스는 부팅 후 얼마 지나지 않아 사용 가능한 모든 물리적 메모리의 90 %를 사용하는 것이 일반적입니다.

커널이 .. 및 더티 (스왑) 사용법을 제공하기 위해 커밋 한 내용을 살펴보면 전체적으로 더 나은 그림을 볼 수 있습니다.

이 동작을 조정해야하는 경우 질문을 업데이트하십시오. :)

이것은 Linux의 표준 MO입니다. 일부 배포판은 sysctl을 통해 필요에 맞게 메모리 관리를 조정합니다. 그러나 당신이보고하는 것은 무엇보다도 전형적인 것입니다.

1
Tim Post