사용되지 않는 물리적 메모리가 여전히 많은데 Linux가 스왑 메모리를 사용하는 이유는 무엇입니까?

사용되지 않는 물리적 메모리가 여전히 많은데 Linux가 스왑 메모리를 사용하는 이유는 무엇입니까?
root@host [/home4/nudenude/public_html/hello/cache]# top -r
        top: unknown argument 'r'
usage:  top -hv | -abcHimMsS -d delay -n iterations [-u user | -U user] -p pid [,pid ...]

root@host [/home4/nudenude/public_html/hello/cache]# top
top - 09:15:22 up 32 days,  7:12,  2 users,  load average: 274.18, 268.12, 262.50
Tasks: 863 total, 215 running, 630 sleeping,   3 stopped,  15 zombie
Cpu(s): 13.8%us, 85.7%sy,  0.4%ni,  0.0%id,  0.0%wa,  0.0%hi,  0.2%si,  0.0%st
Mem:  16313868k total,  7121660k used,  9192208k free,   679320k buffers
Swap:  4194296k total,   311896k used,  3882400k free,   478132k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 6051 nudenude  20   0  103m  29m 4892 R  4.2  0.2   0:14.04 php
 6472 nudenude  20   0 97048  26m 5272 R  4.2  0.2   0:13.07 php
 7181 nudenude  20   0  100m  30m 4928 R  4.2  0.2   0:11.31 php
 7196 nudenude  20   0  105m  26m 5264 R  4.2  0.2   0:11.19 php
 8003 nudenude  20   0  105m  32m 5288 R  4.2  0.2   0:09.42 php
 8008 nudenude  20   0  107m  29m 4960 R  4.2  0.2   0:09.42 php
 8050 nudenude  20   0  105m  34m 5276 R  4.2  0.2   0:09.32 php
 8052 nudenude  20   0 98664  23m 5300 R  4.2  0.1   0:09.32 php
 8067 nudenude  20   0  104m  28m 5296 R  4.2  0.2   0:09.31 php
 8257 nudenude  20   0 96608  25m 5304 R  4.2  0.2   0:09.02 php
10640 nudenude  20   0 96032  22m 4932 R  4.2  0.1   0:04.40 php
12082 investgr  20   0 87588  16m 4928 R  4.2  0.1   0:00.23 php
 5962 nudenude  20   0  103m  33m 4900 R  3.9  0.2   0:14.19 php
 6095 nudenude  20   0  105m  29m 5276 R  3.9  0.2   0:13.96 php
 6467 nudenude  20   0  103m  28m 5280 R  3.9  0.2   0:12.97 php
 6488 nudenude  20   0  102m  26m 5280 R  3.9  0.2   0:12.96 php

내 서버에는 16GB의 메모리가 있습니다. 그 중 7GB는 여전히 무료입니다. 서버는 4GB SWAP 메모리를 사용하며, 메모리의 85.7%가 시스템에서 사용됩니다.

왜? 칼럼도 읽어보세요. 가상 103m, RES 29m. 그래서 대부분의 기억은 물리적인 기억도 아닙니다. 왜?

답변1

"VIRT 103m, RES 29m. 그럼 대부분의 메모리는 물리적 메모리도 아닙니다. 왜죠?"

이러한 차이점을 여러분께 알려드린 것은 제 잘못이므로 좀 더 자세히 설명하도록 하겠습니다.

프로그래밍을 좀 해봤다면 아마 무엇인지 알 것입니다.메모리 주소- (일반적으로) 시스템에서 메모리 바이트를 구성하는 데 사용되는 32비트 또는 64비트 숫자입니다(즉, 32비트 및 64비트 컴퓨터). 메모리의 각 바이트에는 주소가 있습니다. 이 내용이 처음이라면 지금 알아야 할 사항이 있습니다.

최신 운영 체제에서 프로그래밍할 때 발생하는 주소는 고유하고 RAM의 특정 고유 위치를 참조한다는 점에서 "실제"가 아닙니다. 즉, 0xdeadbeef한 프로그램의 주소(즉, 일반적으로 주소를 나타내는 방식인 16진수의 32비트 숫자)는 다른 프로그램의 0xdeadbeef 위치와 동일하지 않습니다. 옛날에는 이랬습니다. 즉, 시스템에는 0x000000에서 시작하는 주소 세트가 하나만 있었습니다.주소 공간커널을 포함한 모든 것 간에 공유됩니다.

이것이 더 이상 사실이 아닌 데에는 여러 가지 이유가 있으며 그 중 하나는 보안입니다. 서로 다른 프로그램은 서로의 메모리에 접근할 수 없어야 하므로 주소가 필요할 이유가 없습니다. 어쨌든 이제 일어나는 일은 커널이 각 프로세스에가상 주소 공간(당신은 또한 볼 수 있습니다당신의 다른 답변에 대한 나의 답변)는 0x0000000에서 시작합니다. 이는 일부가 공유 라이브러리 등과 같은 다른 엔터티에 매핑되도록 구성됩니다. 프로세스 자체의 개인 공간은 여러 섹션으로 나누어지며, 대부분은 순전히 이론적입니다. 기술적으로는 "힙" 섹션의 일부이지만 프로그램은 사용 가능한 전체 힙을 거의 사용하지 않습니다.

최고 VIRT 점수는 /proc 인터페이스를 통해 커널이 보고한 숫자에서 가져옵니다. 실제로 방문한 모든 부분의 주소입니다.특정한 일에 전념하다. 즉, 프로그램 수이다.가상 주소 공간실제 사용이 가능한 것들입니다.

그건아직실제 기억과는 다릅니다. 특정한 방식으로 무언가를 사용할 수 있다고 말하는 것과 그것을 사용하는 것은 다릅니다. 예를 들어, 100MB의 배열을 선언했지만 배열에 아무것도 넣지 않은 경우 VIRT 점수에 100MB를 추가하기만 하면 RSS에는 아무것도 없습니다(또는 배열의 주소를 보유하는 데 바이트가 거의 필요하지 않음). /RES("RESident Set Size") 점수. 커널은 매우 똑똑하다메모리 관리이 방법. 가상 주소를 실제 주소에 매핑하는 테이블을 유지한다는 것은 가상 주소가 많기 때문에 가상 주소 목록이 해당 실제 주소 목록보다 훨씬 클 수 있음을 의미합니다.아무것도 해당하지 않습니다왜냐하면 프로그램은 실제로 그것들에 접근하려고 시도하지 않고 단지 그것들이 생성되도록 요청하기 때문입니다.

프로그램이 아직 매핑되지 않은 주소에 액세스하려고 하면 커널은 이를 위해 실제 메모리를 제공합니다. 따라서 소비되는 "가상 주소 공간"의 양은 항상 사용되는 "실제 메모리"의 양보다 큽니다. 일반적으로 크기가 훨씬 더 크지만 정확한 이유는 이 설명 범위를 벗어납니다. ;)

VIRT는 정해진 신용 한도로, RES는 실제 부채로 생각할 수 있습니다. RES에는 다른 프로그램(일반적으로 공공 도서관)과 공유될 수 있는 부분이 포함되어 있기 때문에 이러한 비유는 복잡합니다. Linux 커널은 "Pss" 점수를 보고합니다. 예:

  • 100% 프라이빗 공간
  • 공유 공간 A의 25%는 다른 3개의 프로세스에서도 사용됩니다.
  • 공유 공간 B의 50%, B를 사용하는 다른 프로세스 1개.

A를 사용하는 다른 프로세스 중 하나가 종료되면 Pss가 그에 따라 증가합니다(33%까지). 하지만 탑은 이 수치를 신고하지 않았다.

사용되지 않는 물리적 메모리가 여전히 많은데 Linux가 스왑 메모리를 사용하는 이유는 무엇입니까?

이는 일부 물리적 메모리를 유지하는 데 중점을 두는 두 가지 우선 순위와 관련이 있습니다. 이 경우, 무언가가 교체되면 여전히 로드 중이지만 오랫동안 유휴 상태였던 프로세스에 속합니다. 다시 사용되면 스왑 영역에서 실제 메모리로 다시 로드됩니다(필요한 경우 다른 콘텐츠 교체).

여유 메모리 풀을 예약하려는 첫 번째 이유는 위에서 논의한 것과 관련이 있습니다. 반면 은행(커널)은 한 번에 완료할 수 있는 것보다 더 많은 WRT 메모리 크레딧을 발행할 수 있지만 대부분 그렇게 할 필요는 없습니다. 그러나 가까운 시일 내에 이 중 일부를 구현해야 할 수도 있습니다. 따라서 많은 변경 사항을 유지함으로써 활성 프로세스의 응답성을 높일 수 있다는 아이디어가 있습니다. 오랫동안 유휴 상태였던 프로세스가 완전히 가득 찰 때까지 RAM에 남겨두면 스와핑이 더 눈에 띄게 됩니다.가장 활동적인 프로세스 속도를 늦추세요, 임계점에 도달할 때까지는 발생하지 않기 때문입니다.

또 다른 이유는 사용 가능한 RAM이 실제로 커널에서 파일 캐시로 사용되기 때문입니다(이것이 출력의 첫 번째 줄이 free일반적으로 두 번째 줄과 매우 다른 이유입니다). 파일 캐싱의 목적은 자주 사용되지만 현재 실제로 사용되지 않는 콘텐츠를 나중에 다시 필요할 경우를 대비하여 메모리에 보관하는 것입니다. 실행 중인 프로세스가 무언가를 완료하면 여유 메모리로 표시되지만 파일 캐시의 일부로 남아 있습니다. 해당 프로세스 또는 다른 프로세스가 해당 항목을 다시 요청하면 해당 프로세스의 일부로 표시되며(더 이상 무료가 아님) 디스크에서 다시 로드할 필요가 없습니다. 이는 또한 활성 프로세스에 대한 응답성을 제공하고 성능을 향상시킵니다.

점수를 조정하여 커널이 이 정책을 얼마나 적극적으로 시행하는지 조정할 수 있습니다 /proc/sys/vm/swappiness. 그러나 특별한 이유가 없는 한 그대로 두어야 합니다. 다양한 상황에서 시스템의 반응성을 최적으로 유지하는 방법을 결정하기 위해 많은 생각과 경험이 필요했습니다.

답변2

mmap'ed 파일도 스왑된 것으로 나타납니다[스왑 가능 또는 스왑됨 읽기].

swapon -s는 스왑된 공간이 구성된 페이징 장치에서 나오는지 여부를 알려줍니다. 그렇지 않은 경우 프로세스가 디스크의 파일에 추가되고 있음을 확신할 수 있습니다.

프로그램 실행 파일은 이런 방식으로 자동으로 교체된다고 생각합니다. 프로그램이 이미 디스크에 있고 교체가 필요한 경우 거기에서 다시 로드할 수 있기 때문입니다. 프로그램이 실행되는 동안 실행 파일을 덮어쓰면 어떻게 될지 확실하지 않습니다.

VIRT에는 파일에서 매핑된 페이지, 사용된 스왑 공간, 아직 물리적으로 할당되지 않은 공간이 포함됩니다. RES는 실제로 소비된 RAM이지만 그 일부는 공유 라이브러리와 겹칩니다(예: 각 공유 객체를 공유하는 마지막 프로세스가 존재했을 때 RES에 표시된 전체 양만 다시 얻을 수 있습니다.

paxdiablo는 여기에 관련 질문에 대한 좋은 답변을 썼습니다.https://stackoverflow.com/questions/1972765/mmap-problem-allocates-huge-amounts-of-memory

건배

관련 정보