Linux 커널은 설치된 RAM의 몇 퍼센트를 사용합니까?

Linux 커널은 설치된 RAM의 몇 퍼센트를 사용합니까?

저는 컴퓨팅 클러스터를 개발 중이며 단일 프로세스에 제공할 수 있는 최대 RAM 용량을 결정하려고 합니다. 16GB RAM이 있는 시스템에서는 메모리 부족 킬러를 호출하기 전에 15680MB(overcommit_memory = 2, overcommit_ratio = 0)를 할당(및 터치)할 수 있다는 것이 답입니다.

일반 Linux 배포판에서는 이것이 어느 정도 타당해 보이지만 내 자신의 최소 커널(v 3.16)을 컴파일했고 내 테스트 응용 프로그램은 sbin/init(메모리에 다른 것이 전혀 없는 IE)로 실행됩니다.

비교를 위해 RAM이 512MB만 있는 시스템을 시뮬레이션하면 44MB의 오버헤드로 468MB를 할당할 수 있는데 이는 매우 합리적으로 보입니다.

그렇다면 16GB 시스템에 커널 메모리가 그렇게 많은 이유는 무엇입니까?

커널 문서를 읽어보면 일정 비율의 메모리가 "안전성"을 위해 커널용으로 예약되어 있는 것으로 보입니다. 이는 /proc/sys/vm/을 통해 조정할 수 있습니다. 그러나 admin_reserve_kbytes 및 user_reserve_kbytes를 변경해도 OOM Killer가 호출되는 시점에는 아무런 영향이 없다는 것을 알았습니다.

설치된 RAM의 양에 비례하여 증가하는 다른 것이 있습니까?

답변1

상당히 오래된(2006) 논문에서는 일부 커널 오버헤드를 메모리 크기의 함수로 설명합니다.http://halobates.de/memorywaste.pdf

에서:

페이지 구조(페이지 할당 추적): 1.37%
페이지 테이블: 0.5%

한편, 나의 16GB 테스트 머신은 총 4.3%의 오버헤드를 보여주었습니다.

따라서 약 2%는 아직 설명되지 않았습니다. 따라서 질문은 아직 완전히 답변되지 않았으며 답변은 매우 오래된 커널을 기반으로 합니다. 그러나 이것이 지금까지 이 질문에 가장 가까운 대답이었습니다.

답변2

귀하의 질문에 대한 짧은 대답은 다음과 같습니다.가능한 한 많이, 일단 프로세스에 사용할 수 있는 것을 제공하면 됩니다. 또 다른 방법은 여유 메모리를 예약하는 것이지만 이는 낭비입니다. 16GB 시스템은 오늘 12GB를 사용할 수 없으므로 내일은 20GB를 사용할 수 있습니다. 현재 사용되지 않는 메모리는 영원히 손실되는 I/O 및 기타 작업을 저장할 수 있습니다. 나중에 메모리를 저장할 수는 없습니다.

"하지만 나중에 사용할 수 있도록 지금 메모리를 비워야 한다"고 생각하고 있다면, 이 말도 안되는 생각을 마음에서 지워보세요. 지금 사용하실 수 있습니다그리고나중에 사용하십시오. 여기서는 절충안이 없습니다. 사실, 지금 사용하고 있다면 나중에 아무것도 하지 않고도 사용할 수 있습니다. 지금 사용하지 않으면 나중에 사용하기 위해 몇 가지 작업을 수행해야 합니다. 따라서 지금 사용하면 나중에 사용할 가능성이 높아집니다.

메모리는 프로세스에서만 사용할 수 있거나 커널 오버헤드라는 오해를 갖고 있는 것 같습니다. 이것은 사실이 아닙니다. 일반적인 시스템에서 실제 메모리의 대부분은 사용 가능하지도 않고 프로세스에서 사용되거나 커널 오버헤드로 인해 소비되지도 않습니다.

예를 들어, 시스템에 사용 가능한 메모리가 충분하다고 가정하고 실행 top한 다음 종료합니다. 시스템에는 두 가지 옵션이 있습니다. top프로그램을 RAM에 유지하거나 프로그램이 포함된 페이지를 삭제할 수 있습니다 . 다음 두 가지 옵션을 살펴보겠습니다.

RAM을 확보하려면 노력이 필요합니다. 더 나쁜 것은 RAM을 사용하려면 이러한 노력을 포기해야 한다는 것입니다. 그리고 다시 실행하면 top프로그램을 디스크에서 로드해야 하는데 이는 매우 느립니다.

페이지를 RAM에 저장한 다음 top다시 실행하면 디스크에서 로드하는 데 문제가 없습니다. 이것은 큰 승리입니다. 메모리를 다른 용도로 사용해야 하는 경우 메모리를 사용하고 여유 풀에서 메모리를 제거하는 수고를 겪을 필요 없이 바로 해당 용도로 변환할 수 있습니다.

따라서 RAM 페이지는 실행 파일을 저장하는 데 계속 사용됩니다. 이 사용법은 top실행 중이 아니기 때문에 어떤 프로세스와도 연관되지 않습니다 . 그러나 잠재적으로 유용한 데이터가 포함되어 있으므로 무료는 아닙니다. 그리고 이는 오버헤드가 아닙니다. 메모리가 다른 작업을 수행하는 데 더 유용하다면 필요한 경우 실행 파일을 디스크에서 페이징할 수 있으므로 내용을 삭제할 수 있습니다.

실제로 일반적인 부하가 걸리는 일반적인 시스템에서는 대부분의 메모리에 미래에 유용할 수 있는 정보가 포함되어 있지만 메모리가 다른 목적으로 필요할 경우 폐기될 수 있습니다.

만약 당신이 그것을 보고 있다면 /proc/meminfo, 아마도 당신이 봐야 할 숫자는 다음과 같습니다 MemAvailable. 이는 여유 메모리가 더 필요할 경우 간단히 폐기할 수 있는 정보가 포함된 메모리와 여유 메모리를 결합합니다.

답변3

대답은 커널이 시작될 때 서버가 사용할 수 있는 메모리 양에 따라 달라집니다. 메모리 확장을 사용할 때 이는 확장할 수 있는 최대값을 기준으로 합니다.

Linux 커널 4.15의 경우:

  • 4GB RAM은 4.8%로 예약되어 있습니다.
  • 8GB RAM: 3.2%
  • 16GB RAM: 2.3%
  • 32GB RAM: 1.9%
  • 64GB RAM: 1.7%

그렇다면 16GB 시스템에 커널 메모리가 그렇게 많은 이유는 무엇입니까?

상대적으로 말하면 아니오. 숫자가 정확하다고 가정하면 512MB에는 8.6%, 16GB에는 2.3%가 예약되어 있음을 알 수 있습니다.

커널에서 왜 이러한 스케일이 선택되었는지는 모르겠지만 dmesg에서 분석 내용을 볼 수 있습니다.

[    0.000000] Memory: 65920612K/67108324K available (12300K kernel code, 2473K rwdata, 4272K rodata, 2408K init, 2416K bss, 1187712K reserved, 0K cma-reserved)

관련 정보