
저는 컴퓨팅 클러스터를 개발 중이며 단일 프로세스에 제공할 수 있는 최대 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)