리눅스 메모리는 무엇입니까? 낮은 캐시, 낮은 버퍼, VM이 아님


11

우선, 나는 상황을 설명하지 않는 LinuxAteMyRAM 을 읽었습니다 .

# free -tm
             total       used       free     shared    buffers     cached
Mem:         48149      43948       4200          0          4         75
-/+ buffers/cache:      43868       4280
Swap:        38287          0      38287
Total:       86436      43948      42488
#

위와 같이 -/+ buffers/cache:라인 표시는 사용 된 메모리 속도가 매우 높다는 것을 나타냅니다. 그러나의 출력에서 top100MB 이상의 메모리를 사용한 프로세스는 없습니다.

그렇다면 메모리는 무엇입니까?

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
28078 root      18   0  327m  92m  10m S    0  0.2   0:25.06 java
31416 root      16   0  250m  28m  20m S    0  0.1  25:54.59 ResourceMonitor
21598 root     -98   0 26552  25m 8316 S    0  0.1  80:49.54 had
24580 root      16   0 24152  10m  760 S    0  0.0   1:25.87 rsyncd
 4956 root      16   0 62588  10m 3132 S    0  0.0  12:36.54 vxconfigd
26703 root      16   0  139m 7120 2900 S    1  0.0   4359:39 hrmonitor
21873 root      15   0 18764 4684 2152 S    0  0.0  30:07.56 MountAgent
21883 root      15   0 13736 4280 2172 S    0  0.0  25:25.09 SybaseAgent
21878 root      15   0 18548 4172 2000 S    0  0.0  52:33.46 NICAgent
21887 root      15   0 12660 4056 2168 S    0  0.0  25:07.80 SybaseBkAgent
17798 root      25   0 10652 4048 1160 S    0  0.0   0:00.04 vxconfigbackupd

이것은 가상 머신의 컨테이너가 아닌 x84_64 Linux를 실행하는 x86_64 머신 (공통 브랜드 서버 아님)입니다. 커널 ( uname -a) :

Linux 2.6.16.60-0.99.1-smp #1 SMP Fri Oct 12 14:24:23 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux

내용 /proc/meminfo:

MemTotal:     49304856 kB
MemFree:       4066708 kB
Buffers:         35688 kB
Cached:         132588 kB
SwapCached:          0 kB
Active:       26536644 kB
Inactive:     17296272 kB
HighTotal:           0 kB
HighFree:            0 kB
LowTotal:     49304856 kB
LowFree:       4066708 kB
SwapTotal:    39206624 kB
SwapFree:     39206528 kB
Dirty:             200 kB
Writeback:           0 kB
AnonPages:      249592 kB
Mapped:          52712 kB
Slab:          1049464 kB
CommitLimit:  63859052 kB
Committed_AS:   659384 kB
PageTables:       3412 kB
VmallocTotal: 34359738367 kB
VmallocUsed:    478420 kB
VmallocChunk: 34359259695 kB
HugePages_Total:     0
HugePages_Free:      0
HugePages_Rsvd:      0
Hugepagesize:     2048 kB

dftmpfs파일 시스템 에서 많은 메모리 소비를보고하지 않습니다 .


2
출력은 ps -eo pid,user,args,pmem --sort pmem무엇입니까?
Braiam 2016 년

여기에 붙여 넣은 링크 , 몇 번 시도했지만 동일한 출력을 얻었습니다.
Jason

3
사용하지 마십시오 head! 완전한 명령의 완전한 출력을 원합니다. 내가 당신이 사용하기를 원한다면 나는 head그것을 내 명령에 넣을 것입니다. 제발 항상 명령 사람들의 전체 출력이 요구 제공합니다.
Braiam

3
전화에서 내 머리 꼭대기의 구문을 기억하지 말고 sysv 공유 메모리를 확인하십시오. 명령은 ipcs라고 생각합니다.
derobert

5
이것에 대한 해결책을 찾은 적이 있습니까? -여기 비슷한 문제가 있습니다 : superuser.com/questions/793192/…
Hackeron

답변:


4

Linux의 메모리는 진단하고 이해하는 이상한 짐승이 될 수 있습니다.

일반적으로 대부분의 경우 정상 작동 상태에서는 메모리가 한 작업 또는 다른 작업에 할당됩니다. 일부는 현재 실행중인 포 그라운드 프로세스에 할당됩니다. 일부는 디스크에서 캐시 된 데이터를 저장합니다. 일부는 특정 시점에 적극적으로 실행되지 않는 프로세스와 관련된 데이터를 보유합니다.

Linux의 프로세스에는 자체 가상 주소 공간이 있습니다 (의 출력에 VIRT top). 여기에는 프로세스와 관련된 모든 데이터가 포함되며 프로세스가 얼마나 큰지 고려할 수 있습니다. 그러나 모든 메모리가 "실제"메모리 맵의 일부인 경우는 드물다 (의 출력에서 ​​RES top). RES 또는 상주 메모리는 특정 시점에 RAM에서 직접 액세스 할 수있는 데이터입니다. 그런 다음 그 위에 공유 메모리 (SHR)가 있습니다. 동일한 프로세스의 여러 인스턴스간에 공유 할 수 있습니다. 따라서 프로세스에서 사용중인 메모리는 RES + SHR의 특정 시점에 있지만 공유 메모리를 사용하는 프로세스의 인스턴스가 둘 이상인 경우 사용량은 RES + RES + RES ... + SHR입니다.

RES와 VIRT의 차이점은 무엇입니까? 프로세스에 할당 된 메모리 블록이있는 경우 반드시 할당 된 메모리입니까? 아니요. 메모리는 페이지에 할당되며 페이지는 활성 또는 비활성 일 수 있습니다. 활동적인 것들이 RES에 있습니다. 비활성은 "나머지"입니다. 그들은 현재 접근하지 않기 때문에 한쪽으로 밀 수 있습니다. 즉, 메모리가 부족 해지면 디스크로 교체 할 수 있습니다. 그러나 그들은 단지 디스크로 바로 가지 않습니다. 먼저 그들은 캐시에 앉아 있습니다. 항상 스왑하고 싶지 않으므로 응용 프로그램과 스왑 공간 사이에 버퍼가 있습니다. 스와 퍼가 실행할 다른 프로세스를 선택하고 다른 페이지가 활성화 및 비활성화되면 이러한 버퍼는 지속적으로 변경됩니다. 그리고 모든 사람이 단순한 인간이 따라갈 수 있도록 금식하는 방법입니다.

그리고 무엇보다도 디스크 버퍼가 있습니다. 비활성 메모리는 캐시로 이동 될뿐만 아니라 해당 캐시가 디스크로 스왑 될 때 먼저 쓰기를 위해 큐잉 될 디스크 버퍼로 이동합니다. 이것이 믹스의 두 번째 캐시 계층입니다. 그리고 이러한 디스크 버퍼는 일반적인 IO 버퍼링을 위해 시스템의 다른 부분에서도 사용됩니다. 그래서 그들은 끊임없이 변화하고 있습니다.

그래서 당신이 좋아하는 것들을보고 있습니다 topfree등은 어느 일정 기간 동안 기계, 또는 집계 된 통계의 현재 상태의 순간 스냅 샷입니다. 데이터를 읽을 때까지 오래되었습니다.

하나의 프로세스는 많은 양의 메모리에 액세스 할 수 있지만, 그렇게하는 것은 거의 합리적이지 않습니다. 어쨌든 한 번에 모든 메모리에 액세스 할 수 없으므로, 현재보고 있지 않은 메모리는 특별히 "코어에서 잠김"으로 표시되지 않는 한 캐시로 이동됩니다.

따라서 응용 프로그램에서 "사용 된"메모리 양과 "사용한"메모리 양은 완전히 다른 것입니다. 대부분의 응용 프로그램 데이터 공간은 실제로 "코어"메모리가 아닌 캐시에 있지만 캐시는 대부분 RAM에 있으므로 즉시 사용할 수 있으며 "활성화"하면 "코어"메모리가됩니다. 디스크로 스왑 아웃되지 않은 경우 스왑 해제가 필요할 때 (버퍼에 있으면 빠를 수 있음)입니다.

짐승의 고속 특성과 수치가 항상 변한다는 사실로 인해 숫자가 계산되는 동안 부분적으로 변경 될 수 있으므로 "이것은 사용중인 메모리 양입니다"라고 정확하게 말할 수는 없습니다. 사용자의 관점. meminfo는 커널이 제공하는 시간의 스냅 샷이지만 실행중인 커널이기 때문에 프로세스가 실제로 실행되고 있지 않으므로 프로세스 사이에 있기 때문에 프로세스 사용 중 하나의 실제 상태를 표시하지 않아도됩니다.

내가 말했듯이, 그것은 매우 혼란 스럽습니다.

그러나 하루가 끝나면 실제로 중요하지 않습니다. 중요한 것은 "사용 가능한"메모리 양이 아니라 사용한 스왑 공간의 양과 스왑 공간에 액세스하는 빈도입니다. 메모리 부족이 과도한 스와핑을 유발하지만 메모리 부족이 아니라 시스템 속도가 느려지는 스와핑입니다. 사용 된 메모리가 많지만 스왑 공간을 사용하지 않는 경우 (정상)입니다. 일반적으로 사용 가능한 메모리는 바람직하지 않으며 어쨌든 한 가지 용도로 사용되었지만 아직 다른 용도로는 할당되지 않았다는 점에서 순전히 과도기적입니다 (예 : 캐시 메모리, 디스크로 스왑 됨). 그러나 아직 다른 용도로 사용되지 않았거나 디스크 버퍼이거나 버퍼가 디스크로 플러시되었지만 아직 캐시를 요청한 응용 프로그램이 없습니다.


6
이것은 정말 흥미롭지 만 OP가 왜이 특정 불일치를 관찰하는지에 대한 질문에는 답하지 않습니다.
terdon

실제 기대되는 차이는 OP의 기대치와 Linux가 제공하는 것 사이에 있다고 생각합니다. 즉, Linux가 제공하는 가치는 합산되지 않으며 이미 변경 되었기 때문입니다.
Majenko 2016 년

OP가 실제로 질문을 이해하지 못하는 것처럼 보이기 때문에 "올바른"답변을 어떻게 선택할 수 있는지 모르겠습니다. 우리는 얼굴이 맑아 질 때까지 시스템이 어떻게 작동하는지 설명 할 수 있지만, 그가 기본 사항을 파악하지 못하고 그의 질문이 실제로 의미가 없다는 것을 깨닫지 못하면 결코 "올바른"답을 얻지 못할 것입니다.
Majenko 2016 년

이것을 작성해 주셔서 감사하지만 솔직히 나는 그 뒤에있는 불가지론을 좋아하지 않습니다. "스냅 샷"이론에 동의하지만 스냅 샷에서 RAM 사용량이 높다는 동일한 숫자를 계속 표시하면 어떻게되는지 알 수 없지만 궁금하지 않습니까?
Jason

5
이것을 블로그에 게시해야합니다. 좋지만 여기서는 관련이 없습니다. 프로세스의 VIRT가 모든 RAM 사용량을 설명하지 않으며, 시스템의 압박에도 불구하고 시스템이 스왑되지 않기 때문에 이상한 일이 있습니다 (그리고 내가 작성한 것을 이해하는 사람이 이상한 것을 의미합니다).
Gilles 'SO- 악마 그만해'

0

이것은 답변의 한 부분입니다.

"사용 된"메모리 ( "free"명령에서)로 지정된 것과 "활성 (사용자) 프로세스에 할당 된 메모리"(/ proc / meminfo에서) 간에는 차이가 있습니다. 시스템의 총 용량은 48149MB (약 47Gb)입니다.

/ proc / meminfo를 보면 다음과 같이 표시됩니다. 비활성 : 17296272 kB = (약 16.5Gb)-비활성 메모리는 종료 된 프로세스에서 비롯된 것일 수 있습니다. 활성화 된 프로세스에서 오랫동안 사용하지 않은 메모리 일 수도 있습니다. 프로세스가 종료 되었기 때문에 메모리가 "해제"되지 않습니다. 왜? 더 많은 일이 있기 때문입니다. 동일한 메모리 페이지가 다시 사용될 수 있으므로, 리눅스 커널은 프로세스가 필요할 때까지 데이터를 "비활성"목록에 그대로 둡니다.

이 페이지는 그 중 일부를 설명합니다. http://careers.directi.com/display/tu/Understanding+and+optimizing+Memory+utilization ; Linux 커널에서 사용하는 PFRA (Page frame reclaiming algorithm) 섹션을 읽으십시오. "프로세스의 사용자 모드 주소 공간에 속하는 페이지보다 먼저 프로세스가 참조하지 않는 디스크 및 메모리 캐시에 포함 된 페이지를 회수해야합니다." "클레임" "사용됨"(비활성 + 활성)에서 "무료"로 이동하는 것을 의미합니다.

메모리 관리에 대한 자세한 설명 : 활성 및 비활성 목록 작동 방식 및 페이지 간 이동 방법 https://www.cs.columbia.edu/~smb/classes/s06-4118/l19.pdf

데이터 구조를 위해 커널에서 사용하는 메모리도 있으며 이것이 "slab 1049464 kb"(~ 1GB)로 표시된다고 생각합니다. 그러나 이것이 별도로 계산된다는 것은 긍정적이지 않습니다.


과거에는 공유 메모리 세그먼트를 할당했지만 응용 프로그램이 잘못 작성되어 메모리가 부족한 시스템 경험이 있었지만 추가하지는 않았다고 덧붙였습니다. 공유 메모리 세그먼트는이를 사용하는 모든 프로세스가 종료 된 경우에도 지속됩니다. 이것은 리눅스는 아니지만 리눅스에서도 마찬가지입니다. 위에서 언급했듯이 이에 대한 정보는 ipcs를 참조하십시오. makelinux.net/alp/035 참조 공유 메모리를 명시 적으로 할당 해제해야한다고 말합니다.
ssl

1
귀하의 답변에 관한 모든 것을 이해하지 못하지만 "비활성 메모리는 종료 된 프로세스에서 비롯된 것일 수 있습니다"는 분명히 잘못되었습니다. 사용자 영역 메모리는 매핑 또는 익명의 두 가지 방식으로 제공됩니다. 데이터를 파일에서 다시로드 할 수 있으므로 매핑 된 메모리를 항상 회수 할 수 있습니다. 익명 메모리를 교체하면 회수 할 수 있습니다. 비활성 메모리는 교정에 적합한 메모리입니다. 그러나 메모리는 여전히 사용 중이므로 내용은 파일에 있거나 어딘가에 스왑해야합니다. 프로세스가 종료되면 메모리가 사용 가능해지며 더 이상 활성 + 비활성으로 간주되지 않습니다.
Gilles 'SO- 악마 그만해'

1
일부 참고 문헌 : 비활성 메모리를 증가시킬 수있는 원인과이를 회수하는 방법은 무엇입니까? 서버 오류시; 오래되었지만 여전히 대부분의 Red Hat 팁입니다 . 바빈 투 라키아의 기사도 인용합니다. 이 문제에 대해서는 명확하지 않지만 "PFRA 이해"섹션에서 익명 및 매핑 된 페이지에 대해 설명합니다.
Gilles 'SO- 악마 그만해'

이 기사에서 프로세스가 참조하지 않는 비활성 페이지에 대한 생각을 얻었습니다. kernel.org/doc/gorman/html/understand/understand013.html 여전히 실행중인 프로세스에서 해제 할 수 있다고 생각합니다. "LRU 목록에서 페이지 회수"섹션
ssl

그러나 그것은 아마도 스왑 캐시의 페이지를 의미합니까?
ssl

-2

NFS를 전혀 사용하십니까? 어느 쪽이든
달릴 가치가 있습니다 . 손을 slabtop -othe nfs_inode_cache수 있습니다.


-4

보고있는 수치는 swap사용되며 , 출력은 "0"이며 이는 RAM이 부족하지 않았 음을 의미합니다. 시스템이 메모리를 교환하지 않는 한 어쨌든 해석하기 어려운 다른 수치에 대해 걱정하지 마십시오.

편집 : 좋아, 내 대답은 간결하지 않고 암호로 간주되는 것 같습니다. 자세히 설명하겠습니다.

여기서 가장 큰 문제는 top / ps의 출력을 해석하는 것입니다. 정확하지는 않습니다. 예를 들어, 동일한 공유 라이브러리의 여러 용도가 예상대로 계산되지 않으므로 http://virtualthreads.blogspot.ch/2006/02/understanding-memory-usage-on-linux.html을 참조하십시오.

그러나 스왑 크기가 정확히 0이면 시스템의 메모리가 부족하지 않은 것보다 정확하지 않습니다. 물론 이것은 매우 당연한 말이지 만 시스템 실제 메모리 사용량을 프로파일 링하는 데 top이 올바른 것은 아닙니다. (그리고 상단을 보면 최소한 virt 또는 % mem에 대한 출력을 정렬하십시오.)

http://elinux.org/Runtime_Memory_Measurement 도 참조하십시오 .


1
시스템이 바뀌더라도 걱정할 필요가 없습니다. 시스템이 너무 자주 스왑하는 경우 걱정할 필요가 있습니다 (이것은 사용 된 스왑 공간이 큰 것과 같지 않습니다). 사용 된 스왑이 0이라는 사실은 사용 가능한 실제 메모리가 거의 없기 때문에 그 자체가 이상합니다.
Gilles 'SO- 악마 그만해'

글쎄, 그의 출력은 그의 시스템이 전혀 스왑하지 않았다는 것을 나타냅니다. 그것은 반드시 최적의 교환 속도입니다. 나는 작은 스왑 크기가 좋은 것이라고 말하지 않았지만 반드시 0 크기입니다. 시스템에 실제로 사용 가능한 메모리가 부족하지 않는 한 왜 스와핑을 시작해야합니까?
Echsecutor

아니요, 스와핑이 없으면 최적이 아닙니다. 현재 사용되지 않는 프로그램의 메모리는 자주 사용되는 파일을위한 디스크 캐시 공간을 확보하기 위해 교체되어야합니다. 의 출력에 대해 방금 추가 한 비트에 관해서는 free당신이 의미한다고 생각합니다. top그러나 심지어 합은 합계 보다 클 수 있습니다 (공유 메모리가 여러 번 계산되기 때문에).
Gilles 'SO- 악마 그만해'

합계가 더 적을 수 있다는 것은 무엇을 의미합니까? top은 화면에 맞는 프로세스 수만큼만 표시합니다. 위의 프로세스가 모두 실행중인 프로세스가 아니라고 생각합니다. 따라서 메모리 사용량별로 정렬되지 않으므로 출력 부분은 '메모리를 사용한 내용'질문에 대해 쓸모가 없습니다. .
Echsecutor

아, 그리고 스왑을 시작하기에 최적의 시간이 언제인지에 대한 토론에 들어가고 싶지 않지만 리눅스 서버의 기본값은 메모리가 "현재 사용되지 않기 때문에"스왑하지 않는 것입니다.
Echsecutor
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.