프로세스의 실제 메모리 사용량


20

다음은 내 서버 의 메모리 사용량 mysqlapache각각 의 메모리 사용량입니다 . 의 출력에 따라 pmap말, mysql379M에 대해 사용하고 apache277M을 사용하고 있습니다.

[root@server ~]# pmap 10436 | grep total
 total           379564K

[root@server ~]# pmap 10515 | grep total
 total           277588K

이것을 출력과 비교하면 top값이 거의 일치 함을 알 수 있습니다.

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
10515 apache    20   0  271m  32m 3132 S  0.0  6.6   0:00.73 /usr/sbin/httpd
10436 mysql     20   0  370m  21m 6188 S  0.0  4.3   0:06.07 /usr/libexec/mysqld --basedir=....

이제이 값은 분명히 두 프로세스의 현재 메모리 사용량이 아닙니다. ram내 시스템 에서 512M 을 초과하면 이 두 프로세스에 할당 된 페이지의 크기이며 실제로는 그렇지 않습니다. 그들에 의해 적극적으로 사용되는 메모리의 크기 이제 우리가를 사용할 때 프로세스의 메모리 사용량이 훨씬 적은 pmap -x여분의 열이 보입니다 Dirty. 아래의 예에서 볼 수 있듯이 Dirty첫 번째 coloumn의 379M과 반대로 coloumn은 15M을 보여줍니다. 내 질문은 : coloumn 아래의 값 Dirty이 해당 프로세스에서 적극적으로 사용하는 '실제'메모리 양입니까? 그렇지 않은 경우 프로세스의 실제 메모리 사용량을 어떻게 알 수 있습니까? 하지 pstop위와 같은 이유. 우리는 아래에 뭔가가 있습니까/proc 이 정보를 제공합니까?

[root@server ~]# pmap -x 10436 | grep total
total kB          379564   21528   15340
[root@server ~]#


[root@server ~]# free -m
             total       used       free     shared    buffers     cached
Mem:           489        447         41          0         52        214
-/+ buffers/cache:        180        308
Swap:         1023          0       1023
[root@server ~]#

답변:


18

프로세스 의 실제 메모리 사용량과 같은 것이 없기 때문에 "프로세스의 실제 메모리 사용량"을 제공하는 명령 은 없습니다 .

프로세스의 각 메모리 페이지는 다음과 같이 될 수 있습니다.

  • 해당 프로세스에서만 사용되는 임시 저장소.
  • 다양한 메커니즘을 사용하여 다른 프로세스와 공유합니다.
  • 디스크 파일로 백업됩니다.
  • 실제 메모리 또는 스왑

“더러운”수치는 RAM에 있고 (스왑이 아님) 파일로 백업되지 않은 모든 것을 더한다고 생각합니다. 여기에는 공유 메모리와 비공유 메모리가 모두 포함됩니다 (서버를 포크하는 것 이외의 대부분의 경우 공유 메모리는 메모리 매핑 된 파일로만 구성됨).

로 표시되는 정보 pmap는 및 에서 제공 됩니다 . 이것이 프로세스의 실제 메모리 사용량입니다. 단일 숫자로 요약 할 수 없습니다./proc/PID/maps/proc/PID/smaps


6

필자는 맨 페이지에서 pmap(예 :)와 같은 소스의 상단 및 도면 정보와 유사한 분석을 수행하는 응용 프로그램에 대해 작성한 것을 인용합니다 /proc/[N]/maps.

가상 주소 공간 대. 물리적 메모리

위의 통계 중 일부를 해석 할 때 가상 주소 공간실제 메모리 의 차이점을 이해하는 것이 중요 합니다. 이름에서 알 수 있듯이 가상 주소 공간은 실제가 아닙니다. 기본적으로 현재 프로세스에 할당 된 모든 메모리의 맵입니다. 이 맵의 크기 제한은 각 프로세스 (일반적으로 2-4GB)마다 동일하며 누적되지 않습니다 (즉 , 각각 고유 한 2-4GB 가상 주소를 가진 수십 또는 수백 개의 프로세스가있을 수 있음) 실제로 512MB의 실제 메모리 만있는 시스템의 공간 ).

실제로 가상 주소 공간에서 데이터를 저장하거나 검색 할 수 없습니다. 실제 데이터에는 실제 실제 메모리가 필요합니다. 하나를 다른 것과 관련하여 관리하는 것이 커널의 일입니다. 가상 공간 통계 (VirtualSz, Data + Stack 및 Priv & Write)는 프로세스 구조 및 실제 메모리 사용과의 관계를 고려하는 데 유용하지만 실제로 사용 된 RAM의 양, 실제 메모리 통계 (ResidentSz, Share 및 비율)이 중요합니다.

pmap대부분 가상 주소 공간 에 대한 정보를보고 합니다 . top출력 에서 "값이 거의 일치 함"이라는 관찰은 아마도 RES 수치와는 매우 다른 VIRT 수치를 나타냅니다. 위의 "VirtualSz"및 "ResidentSz"레이블에 해당하는 것과 정확히 일치합니다 (VIRT는 가상, RES는 거주자 용).

이제 pmap -x를 사용하면 프로세스에 대한 메모리 사용량이 훨씬 적은 Dirty가 있습니다. 아래 예에서 볼 수 있듯이 Dirty coloumn은 첫 번째 coloumn에서 379M과 반대로 15M을 보여줍니다. 내 질문은 : coloumn 아래의 값이 더티가 해당 프로세스에서 적극적으로 사용하는 '실제'메모리 양입니까?

아뇨,하지만 "더러운"메모리는 디스크에서로드 된 후 수정 된 데이터를 나타냅니다. 이 변경은 현재 RAM에 저장되므로 상주 메모리의 일부 여야합니다 . 그러나 동의어가 아닙니다.


나는 동의한다. 그러나 2 ~ 4GB는 32 비트 시스템 용입니다. 요즘 대부분의 시스템은 아마도 64 비트 일 것입니다.
ctrl-alt-delor

3

가상 메모리는 단축 다이얼 번호와 비슷합니다 (32 비트 시스템의 경우 32 비트 시스템의 경우 64 비트 커널의 32 비트 앱의 경우 40 억 개, 64 비트 응용 프로그램의 경우 훨씬 더 많음). 단축 다이얼에 매핑됩니다.

여러 프로세스가 동일한 주소 (전화 번호)에 대해 서로 다른 매핑 (단축 다이얼 번호)을 가질 수 있습니다. 예를 들어 여러 라이브러리를 공유 할 수 있으므로 전체 라이브러리에 대한 가상 주소가 있습니다 (pmap에서 확인할 수 있음). bash의 인스턴스 2 개와 같은 실행 파일을 공유 할 수도 있습니다.

지금까지 모든 가상 주소의 하위 주소가 어떻게 맞을 수 있는지 설명하지만 더 많은 것이 있습니다. 하나의 프로세스는 너무 많은 가상 메모리를 가질 수 있으므로 어떻게해야합니까? 라이브러리의 일부 또는 실행 파일이 사용되지 않거나, 디스크에서 램으로 복사되지 않거나, 램이 가득 차서 디스크에서로드 된 부분이 삭제 된 비트는 필요한 경우 디스크에서 다시 가져올 수 있기 때문에, 또는 디스크로 백업되지 않은 메모리는 스왑에 매핑되고 스왑을 위해 복사 된 다음 삭제됩니다. 그런 다음 필요할 때 스왑에서 읽을 수 있습니다. 이러한 후자의 전략 중 하나라도 너무 많이 사용하면 시스템이 느려집니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.