여전히 사용되지 않은 RAM이 있는데 왜 일부 스왑 공간이 사용되고 있습니까?


9

문제보다는 호기심이 더 많습니다. 그리고 나는 당혹스럽게도 기본적인 질문이 있음을 인정합니다.

많은 경우에 Linux 시스템에서 ~ 600MB의 사용되지 않는 RAM이 있더라도 ~ 500MB의 스왑 공간이 사용되는 것으로 나타났습니다.

내 순진한 높은 수준의 이해는 RAM이 소진 될 때까지 스왑 공간이 시작되지 않는다는 것입니다.

메모리를 요청하는 사용자 프로세스는 논리적으로 만 수행하며 메모리가 RAM 또는 스왑 공간에 의해 물리적으로 백업되는지 여부에 대한 개념이 없기 때문에이 상황은 Linux 커널을 수행해야한다고 가정했습니다.

질문으로 이어지는 이유는 무엇입니까? 커널이 스왑 공간을 사전에 사용합니까? 이 성능 조정 알고리즘의 일부입니까? 액세스 가능성이 가장 적은 것으로 생각되는 메모리의 디스크 부분 (LRU 구성표)으로 교체합니까? 그렇다면 RAM에 모든 것을 남겨 두는 것이 의미가 없습니까? 고갈이 가까워 졌을 때만 LRU 부분을 RAM에서 스왑 공간으로 바꾸십시오.

리눅스 서버에는 2GB의 RAM과 2GB의 스왑 공간이 있습니다.


1
왜이 질문을 끝내기 위해 4 표를 얻었습니까?

2
@Aaron : 나쁜 질문이있는 것은 아닙니다. 방금 시스템 관리 측면에서 말하면 고급 사용자 나 서버 관리자에게 더 적합합니다. 호기심으로 궁금해하는 것은 파워 유저 POV와 같습니다.

답변:


11

RAM 의 사용되지 않은 부분은 실제로 HDD 캐시로 사용됩니다. 당신이 그것에 대해 생각하면, 당신은 실제로 RAM의 일부에 액세스 할 때 디스크의 일부를 더 자주 읽습니다. RAM을 사용하여 HDD 데이터를 캐시하는 동안 디스크 에이 RAM을 배치하는 것이 좋습니다.


7

실제로 메모리가 필요할 때 커널이 디스크 액세스로 완료 될 때까지 기다릴 필요가 없으므로 미리 사물을 교체하는 것이 좋습니다.

예를 들어 큰 이미지를 열고 싶다고 가정 해 봅시다. 이미지가로드되면 300MB의 RAM이 필요합니다. 커널이 가능한 모든 RAM을 사용하는 경우 이미지를로드하려면 커널이 RAM에서 디스크로 200MB를 전송해야합니다. 미리 RAM을 비우면 몇 밀리 초가 절약됩니다.


7

두 가지 이유 :

  1. (@dtrosset) Linux는 사용하지 않는 프로그램 비트를 교체하여 더 많은 캐시와 버퍼를 제공합니다.
  2. 과거에 더 많은 메모리를 사용하고 일부 내용을 바꾸었을 수 있으며 강제로 무엇이든간에 사용되지 않았기 때문에 사용되지 않았기 때문에 스왑되지 않았습니다.

1

다른 답변 외에도 프로그램에서 메모리를 사용하지 않더라도 할당 된 메모리를 백업하도록 Linux를 구성 할 수 있습니다.

그러나 메모리를 과도하게 커밋하고 OOM 킬러를 두려워하는 것은 Linux 경험에서 필요하지 않은 부분입니다. sysctl 매개 변수 vm / overcommit_memory를 2로 설정하면 오버 커밋 동작이 꺼지고 OOM 킬러가 계속 베이크 상태로 유지됩니다. 대부분의 최신 시스템에는 대부분의 상황에 충분한 스왑 파일을 제공 할 수있는 충분한 디스크 공간이 있어야합니다. 오버 커밋 된 메모리가 부족할 때 pet 프로세스가 종료되지 않도록하는 대신 상황을 완전히 피하는 것이 더 쉬울 수 있습니다. [ OOM 킬러로부터의 휴식 ]

프로그램이 메모리를 할당하면 커널은 더 많은 스왑 페이지를 커밋 된 것으로 표시 할 수 있습니다. 이 표시는 커널의 메모리 관리자에 저장되며 실제 디스크 공간은 아직 건드리지 않았습니다. 해당 메모리가 사용될 때까지 실제로 스왑 및 스왑 할 필요는 없습니다. 이들이 사용되지 않으면 스왑 사용량은 성능에 영향을주지 않으면 서 변동합니다.

프로세스에는 자체 주소 공간 또는 "보기"(스왑이 처음부터 작동하는 방식)가 표시되므로 커널은이를 관리하는 방법에 많은 여유가 있습니다. 위에 링크 된 기사의 포크 예제를 사용하면 사용되지 않은 많은 양의 메모리를 새로 할당하는 것보다 공유 메모리 페이지가 훨씬 많기 때문에 메모리에 쓰기 중 복사가 할당되어 스왑 사용 횟수가 증가합니다. 실제로 작성된 경우 (발생하지 않을 수도 있음) "커밋 된 스왑"을 사용되지 않은 RAM (RAM 사용 증가 및 스왑 사용 감소)으로 바꿀 수 있습니다. 전체 또는 거의 모든 RAM을 사용하는 머신에 500MB가 할당 된 프로세스를 상상해보십시오. 스왑에 사용 가능한 500MB가 있고 디스크 공간이 저렴하면 오늘날의 TB 드라이브의 1 %가 얼마나됩니까? : P) 메모리를 복사 할 필요가 없습니다 (아직,

따라서 OOM 킬러의 가능성을 피할 수 있으며 메모리 할당 (포크와 같은 것을 통한 "암시 적"할당 포함)을 통해 메모리 할당이 성공해야한다고 가정하고 대부분의 소프트웨어를 설계하는 것이 훨씬 간단합니다. 교환하면 성능에 영향을 줄 수 있습니다. 이러한 영향은 거의 항상 미미하지만 최악의 경우 스왑을 발생시킵니다 (아직 완전한 커널 충돌 또는 OOM 킬러보다 선호되는 경우도 있음).

Linux 메모리 관리자의 작동 방식에 대한 정확한 세부 정보는 모르지만이 답변은 제 자신의 일반적인 이해와 몇 년 동안 읽은 것을 기억합니다. 나는이 답변을 다시 편집하려고 노력했기 때문에 OS 디자인에 대한 최소한의 이해가 필요합니다 (매우 복잡하고 관심이있는 것은 아닙니다). 어떻게 개선 될 수 있는지 알려주세요. 손에 쥐는 것은 그렇게 창피한 기본적인 질문이 아닐 수도 있습니다.

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