![Linux가 기본적으로 메모리를 오버커밋하는 이유는 무엇입니까?](https://rvso.com/image/154458/Linux%EA%B0%80%20%EA%B8%B0%EB%B3%B8%EC%A0%81%EC%9C%BC%EB%A1%9C%20%EB%A9%94%EB%AA%A8%EB%A6%AC%EB%A5%BC%20%EC%98%A4%EB%B2%84%EC%BB%A4%EB%B0%8B%ED%95%98%EB%8A%94%20%EC%9D%B4%EC%9C%A0%EB%8A%94%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
슈퍼유저 질문과 관련됨https://superuser.com/questions/200387/linux-overcommit-memory제 질문은 그들이 기본값을 오버커밋하도록 허용한 이유가 무엇인지입니다.
2.5.30 이후 값은 다음과 같습니다: 0(기본값): 이전과 동일: 얼마나 많은 과잉 커밋이 합리적인지 추측합니다.
답변1
Linux(및 Unix 시스템 전반)에서 메모리를 오버커밋해야 하는 필요성의 대부분은 fork()
호출 프로세스의 주소 공간을 복제하는 시스템 호출을 구현해야 하기 때문에 발생합니다.
대부분의 경우 이 시스템 호출 뒤에는 가 따르며 exec()
, 이 호출의 조합으로 인해 별도의 프로그램이 현재 프로세스의 하위 프로그램으로 생성되며, 이 경우 중복된 주소 공간의 대부분은 결국 사용되지 않게 됩니다.
이를 효율적으로 만들기 위해 Linux는 쓰기 중 복사를 사용하여 호출하는 애플리케이션의 메모리 중복을 방지합니다 . 이 경우 모든 페이지를 복사할 필요가 없으며 호출된 fork()
직후에 페이지를 삭제할 수 있습니다 .exec()
하지만 호출되는 시점에는 fork()
an이 오고 있는지 알 수 있는 방법이 없습니다 exec()
. 이는 작업자 자식을 생성하는 데 사용되고 부모의 주소 공간을 재사용하는 것이 바람직할 가능성이 높습니다. (이 기술은 연결을 처리하기 위해 사전 포크된 작업자를 사용하는 데몬에서 매우 널리 사용되었습니다.) 이 경우 포크된 자식에 대한 메모리 요구 사항의 대부분 또는 적어도 일부가 존재합니다(부모 메모리의 100%는 아닐 수도 있지만 대부분을 가정합니다.)
그러나 해당 경우에 대해 항상 메모리를 예약하는 것은 fork()
+ exec()
경우에 문제가 됩니다. 특히 부모가 여러 기가바이트의 메모리를 예약하고 많은 자식을 분기하는 장기 실행 프로세스인 경우 더욱 그렇습니다. 오버커밋이 아닌 경우 부모와 분기된 각 자식에 대해 사용되는 총 기가바이트의 양을 예약해야 합니다. 그러나 그 예약 중 어느 것도(또는 거의 전혀) 실제로 사용되지 않을 것입니다. 왜냐하면 exec()
해당 예약을 즉시 플러시하기 때문입니다. 최종 결과는 이러한 작업 부하에 엄청난 양의 스왑 공간(예약을 처리하기 위해 대부분은 사용되지 않지만 최악의 경우에는 있어야 함) 또는 오버커밋과 같은 것이 필요하다는 것입니다.
이 예를 잘 보여주는 반면 fork()
, Linux/Unix의 다른 API도 오버커밋이 필요합니다. 예를 들어 malloc()
호출될 때(또는 이를 구현하는 syscall) 프로세스에 의해 "접촉"될 때까지 실제로 메모리가 할당되지 않으므로 매우 큰 기가바이트 블록을 할당하고 드물게 사용하는 것이 완벽하게 유효합니다. 실제로는 몇 메가바이트가 사용됩니다. 이러한 API가 그런 방식으로 작동한다는 사실은 프로그램이 이러한 속성을 활용한다는 것을 의미합니다. 즉, 오버커밋이 없으면 API가 중단될 가능성이 가장 높습니다(이러한 예약을 지원하여 낭비되는 메모리나 스왑이 실제로 많지 않은 경우).
이 문제에 대한 흥미로운 토론은 fork()
다음에서 찾을 수 있습니다.Microsoft Research의 기사에 대한 이 LWN 게시물. 물론 기사 자체는 흥미롭습니다. 그러나 주석이 어떻게 즉시 오버커밋으로 바뀌고 그에 따른 문제가 발생하는지 확인할 수 있습니다.
기사의 이름은도로에 있는 포크().
답변2
모든 사람이 메모리를 구입할 만큼 충분한 리소스를 갖고 있는 것은 아니라고 생각합니다. 따라서 모든 애플리케이션이 제대로 실행되어야 하는 경우에는 적은 리소스로 애플리케이션을 실행하는 것이 도움이 됩니다.