다음은 내 서버의 각 mysql
메모리 사용량 입니다. apache
출력에 따르면 pmap
약 mysql
379M이 사용되고 있으며 apache
277M이 사용되고 있습니다.
[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=....
이제 이 값은 이 두 프로세스의 현재 메모리 사용량이 아닙니다. 만약 그렇다면 내 시스템에서 512M 이상이 될 것이고 ram
이것이 실제 크기가 아니라 두 프로세스에 할당된 페이지 크기라는 것을 알고 있기 때문입니다. 적극적으로 사용하고 있는 메모리의 양입니다. 이제 를 사용하면 프로세스의 메모리 사용량이 훨씬 적음을 보여주는 pmap -x
추가 열이 표시됩니다 . Dirty
아래 예에서 볼 수 있듯이 이 Dirty
열에는 첫 번째 열의 379M 대신 15M이 표시됩니다. 내 질문은: Dirty
아래에 나열된 값이 프로세스에서 적극적으로 사용하는 "실제" 메모리 양입니까? 그렇지 않다면 프로세스의 실제 메모리 사용량을 어떻게 알 수 있습니까? 아니요 ps
, top
위와 같은 이유입니다. /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 ~]#
답변1
"프로세스의 실제 메모리 사용량"을 제공할 수 있는 명령은 없습니다.프로세스의 실제 메모리 사용량이 존재하지 않습니다..
프로세스의 각 메모리 페이지는 다음과 같습니다.
- 이 프로세스에서만 사용되는 임시 저장소입니다.
- 다양한 메커니즘을 사용하여 다른 프로세스와 공유합니다.
- 디스크 파일로 백업됩니다.
- 물리적 메모리 또는 스왑 영역.
"더러운" 숫자는 RAM(스왑 아님)의 모든 것을 합산하고 파일 지원이 없다고 생각합니다. 여기에는 공유 메모리와 비공유 메모리가 모두 포함됩니다. 하지만 대부분의 경우 포크된 서버를 제외하고 공유 메모리는 메모리 매핑된 파일로만 구성됩니다.
표시된 정보는 pmap
및에서 가져온 것입니다. 이는 프로세스의 실제 메모리 사용량입니다. 하나의 숫자로 요약할 수 없습니다./proc/PID/maps
/proc/PID/smaps
답변2
pmap
top과 유사한 분석을 수행하고 동일한 소스 (예 /proc/[N]/maps
: ) 에서 정보를 표시하는 애플리케이션의 매뉴얼 페이지에 제가 작성한 내용을 인용하겠습니다 .
가상 주소 공간과 가상 주소 공간 물리적 메모리
차이점을 이해하는 것이 중요합니다.가상 주소 공간그리고물리적 메모리위의 통계 중 일부를 설명합니다. 이름에서 알 수 있듯이 가상 주소 공간은 실제가 아닙니다. 이는 기본적으로 현재 프로세스에 할당된 모든 메모리의 맵입니다. 이 맵의 크기 제한은 각 프로세스(일반적으로 2~4GB)에 대해 동일하며 누적되지 않습니다(예:실제 물리적 메모리가 512MB에 불과한 시스템에는 각각 2~4GB의 가상 주소 공간이 있는 수십 또는 수백 개의 프로세스가 있을 수 있습니다.).
데이터는 실제로 가상 주소 공간에서 저장되거나 검색될 수 없습니다. 실제 데이터에는 실제 물리적 메모리가 필요합니다. 서로의 관계를 관리하는 것이 커널의 임무입니다. 가상 공간 통계(VirtualSz, Data+Stack 및 Priv&Write)는 프로세스 구조 및 물리적 메모리 사용량과의 관계를 고려하는 데 유용하지만 물리적 메모리 통계(ResidentSz, Share 및 Ratio)는 프로세스의 구조를 고려할 때 가장 유용합니다. 실제 사용된 RAM 양이 중요합니다.
pmap
주로 귀하에게 관련 정보를 보고하기 위해가상 주소 공간. 출력에서 관찰되는 "거의 일치하는 값"은 top
RES 플롯과 상당히 다른 VIRT 플롯을 참조할 수 있습니다. 이는 위에서 "VirtualSz" 및 "ResidentSz"라고 표시한 것과 정확히 일치합니다(가상의 경우 VIRT, 거주자의 경우 RES).
이제 pmap -x를 사용하면 프로세스의 메모리 사용량이 훨씬 적다는 것을 보여주는 추가 Dirty 열이 표시됩니다. 아래 예에서 볼 수 있듯이 "Dirty" 열에는 첫 번째 열의 379M 대신 15M이 표시됩니다. 내 질문은: Dirty 열 아래의 값이 프로세스에서 적극적으로 사용하는 "실제" 메모리 양입니까?
아니, 하지만 일종의. "더티" 메모리는 디스크에서 로드된 후 수정된 이후에 수정된 데이터입니다.상주 메모리이러한 변경 사항은 현재 RAM에 저장되어 있기 때문입니다. 그러나 동의어는 아닙니다.
답변3
가상 메모리는 약 30억 개(32비트 시스템의 경우 40억 개, 64비트 커널의 32비트 응용 프로그램, 64비트 응용 프로그램의 경우 그 이상)가 있다는 점을 제외하면 단축 다이얼 번호와 같습니다. 번호를 직접 입력하면 단축번호로 매핑됩니다.
여러 프로세스는 동일한 주소(전화번호)에 대해 서로 다른 매핑(단축 다이얼 번호)을 가질 수 있습니다. 예를 들어, 여러 라이브러리를 공유할 수 있으므로 전체 라이브러리에 대한 가상 주소를 갖게 됩니다(pmap에서 볼 수 있음). 두 개의 bash 인스턴스와 같은 동일한 실행 파일을 공유할 수도 있습니다.
지금까지는 가상 주소의 모든 하위 부분이 어떻게 맞는지 설명했지만 더 많은 것이 있습니다. 프로세스에 너무 많은 가상 메모리가 있어서 맞지 않을 수 있습니다. 어떻게 해야 합니까? 라이브러리 또는 실행 파일의 일부 부분이 사용되지 않거나, 디스크에서 메모리로 복사되지 않거나, 메모리가 가득 차고 디스크에서 로드된 비트가 필요한 경우 디스크에서 다시 가져올 수 있기 때문에 제거될 수 있습니다. 지원되지 않습니다. 내 디스크의 메모리가 스왑에 매핑되고 스왑에 복사된 후 삭제됩니다. 그런 다음 필요할 때 교환에서 읽을 수 있습니다. 후자의 전략 중 하나라도 너무 많이 사용하면 시스템이 매우 느려집니다.