Cent OS : 메모리 초과 할당을 끄거나 줄이려면 어떻게해야합니까?


20

때때로 "my"서버는 메모리와 스왑 공간이 모두 부족하기 때문에 중단됩니다. (핑에 계속 반응하지만 그 이상은 아니고 ssh조차도 아닙니다).

나는 리눅스가 메모리 초과 커밋을한다고 들었다. 나는 은행이 돈을 쓰는 것과 동일하다는 것을 이해한다. 대부분의 프로세스가 실제로 요청한 모든 메모리를 사용하지 않는다고 가정하면 실제로 사용 가능한 것보다 더 많은 메모리를 프로세스에 부여한다 적어도 동시에는 아닙니다.

이것이 실제로 시스템이 때때로 정지되는 원인이라고 가정하십시오.이 경우에 대해서는 여기에서 논의하지 않겠습니다 (서버의 모든 서비스가 다운 될 수 있지만 여전히 핑에 응답하는 이유는 무엇입니까? 및을 알아내는 방법 참조). .

그래서,

  1. CentOS에서 과도하게 메모리 초과 커밋을 비활성화하거나 줄이려면 어떻게합니까? vm.overcommit_memory (값 0, 1 또는 2)와 vm.overcommit_ratiom이라는 두 가지 설정이 있지만 어디서 설정을 찾아서 변경 해야하는지 (일부 구성 파일 희망) 알지 못합니다. 어떻게 시도해야합니까? 변경 사항을 적용하기 위해 서버를 재부팅해야하는지 여부입니다.

  2. 그리고 안전합니까? 어떤 부작용을 기대할 수 있습니까? overcommit_memory에 대한 인터넷 검색을 할 때 사람들이 서버를 더 이상 부팅 할 수 없다고 말하는 무서운 것들을 발견합니다 ....

HTTP 요청을 처리하는 동안 호출되는 PHP로 작성된 쿼리로 인해 메모리 사용량이 갑자기 증가하는 이유는 mysql이므로 일부 PHP 스크립트가 완료되지 않아 때때로 500 응답이 발생할 것으로 예상합니다. 서버가 너무 바빠서 내가 걸릴 수있는 위험이 있습니다 (확실히 전체 서버에 액세스 할 수없고 하드 재부팅 해야하는 것이 좋습니다).

아니면 잘못된 설정을 선택하면 서버가 실제로 재부팅되지 않을 수 있습니까?


1
오버 커밋을 비활성화해도 실제로 메모리 가 부족할 때는 도움이되지 않습니다 . 그러나 서버에 RAM을 추가하면 도움이 될 수 있습니다.
Michael Hampton

2
오버 커밋을 비활성화하면 최종 솔루션이 아니지만 서버에 메모리가 부족한 경우 (몇 초 동안 한 번에 한 번 씩만) 몇 가지 HTTP 요청 만 거부됩니다. 내 서버 DIE를 완전하고 영원히 (다시 시작할 때까지)받는 대신
마침이

답변:


30

메모리 오버 커밋은 vm.overcommit_memory=2

0은 기본 모드이며, 커널은 할당 요청과 비교하여 사용 가능한 메모리를 계산하여 할당을 경험적으로 결정합니다. 그리고 1로 설정하면 마법사 모드가 활성화되는데, 여기서 커널은 할당 할 수있는 충분한 여유 메모리가 있다고 광고합니다. 2로 설정하면 프로세스는 구성 가능한 양 overcommit_ratio의 RAM 까지만 할당 할 수 있으며 할당량을 초과하면 할당 실패 또는 OOM 메시지를 받기 시작합니다.

그렇게하는 것이 안전합니까? 워크로드 및 하드웨어 용량이 100 % 확실하지 않으면 메모리 오버 커밋을 비활성화하는 것이 실제로 도움이되는 적절한 사용 사례를 보지 못했습니다. 관심이 있으시면 kernel-docs패키지를 설치 하고 /Documentation/sysctl/vm.txt더 많은 내용을 읽거나 온라인으로 읽으십시오 .

설정하면 vm.overcommit_memory=2구성된 실제 RAM의 백분율까지 초과 커밋됩니다 vm.overcommit_ratio(기본값은 50 %).

echo 0/1/2 > /proc/sys/vm/overcommit_memory 

재부팅 후에도 지속되지 않습니다. 지속성을 위해 다음을 /etc/sysctl.conf파일에 넣으십시오 .

vm.overcommit_memory=X

실행합니다 sysctl -p. 다시 부팅 할 필요가 없습니다.


대답하지 않은 부분은 vm.memory_overcommit 설정을 변경 한 파일과 특히 적용하기 위해 재부팅 (또는 기타)해야하는 부분입니다.
matteo

2
echo 0/1/2> / proc / sys / vm / overcommit_memory 재부팅 후에도 유지되지 않습니다. 지속성을 위해 이것을 /etc/sysctl.conf 파일 vm.overcommit_memory = X에 넣고 sysctl -p를 실행하십시오. 다시 부팅 할 필요가 없습니다
Soham Chakraborty

고마워 정식으로 "수락"할 수 있도록 답변 본문에 추가해 주시기 바랍니다.
matteo

1
새로운 부분을 추가했습니다.
Soham Chakraborty

4
"overcommit_ratio"는 overcommit_memory = 2를 사용할 때 중요한 영향을 미칩니다. 할당 할 수있는 물리적 RAM의 백분율을 결정합니다! 따라서 비율이 100보다 작 으면 디스크 캐시 또는 유사한 디스크에 대해 일부 RAM이 할당되지 않은 상태로 유지됩니다. 기본 비율은 50 %이므로이 값을 변경하지 않으면 실제 RAM의 50 % 만 사용합니다!
David Gardner

6

완전히 규정되지 않은 진술 : 메모리 오버 커밋을 비활성화하는 것은 활성화하는 것보다 확실히 "더 안전하다".

$ customer는 수백 개의 웹 서버에 설치했으며 안정성 문제를 크게 도와주었습니다. 비활성화되지 않은 경우 Nagios 검사를 통해 실제로 큰 소리로 불을 지 릅니다.

반면에, 사람들은 작은 램을 과도하게 사용하고 절대로 사용하지 않을 때 프로세스가 메모리에서 빠져 나가는 것이 안전하다고 생각하지 않을 수 있습니다. (즉, SAP는 매우 좋은 예입니다)

그래서, 그것이 당신을 위해 물건을 향상시키는 지 다시 보게됩니다. 관련 문제를 해결하기 위해 이미 조사 중이므로 도움이 될 것 같습니다.

(심지어 심술 person은 사람이 공감할 위험이 있음을 압니다)


3

오버 커밋을 비활성화하는 것이 일부 상황에서 활성화하는 것보다 안전하다는 데 동의합니다. 서버가 소수의 큰 메모리 작업 (예 : 회로 시뮬레이션)을 실행하는 경우 OOM 이벤트를 기다리지 않고 메모리 요청을 미리 거부하는 것이 훨씬 안전합니다 (곧 따라야 함). OOM 킬러가 작업을 수행 한 후 문제가 발생했습니다.

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