RDS(NetEase Cloud Relational Database Service)는 한동안 온라인 상태였으며 온라인 운영 및 유지 관리 과정에서 제품이 지속적으로 RDS로 이동하는 동안 고려되지 않았거나 완전히 충족되지 않은 몇 가지 사항도 발생했습니다. 존경받는. . 나중에 시간이 나면 공유하겠습니다.
오늘 말씀드리고 싶은 것은 온라인상의 4G RDS 인스턴스입니다. OOM(메모리 부족) 문제가 발생하여 MySQL 프로세스가 직접 종료되었습니다. 이 문제를 설명하려면 먼저 Linux 시스템 메모리 할당 전략부터 시작해야 합니다.
일반적으로 C 언어 프로그램을 작성할 때 우리는 메모리 공간을 동적으로 적용하기 위해 malloc을 사용하는 데 익숙합니다. (Java는 JVM에 의한 메모리 관리를 담당합니다.) malloc 함수는 운영 체제에 연속적인 메모리 단위를 적용한 다음 반환합니다. 이 공간의 시작 주소입니다. malloc 함수가 null을 반환하면 시스템에 할당할 메모리 공간이 없다는 의미입니다. 이것은 우리의 일반적인 생각이며 물론 일부 운영 체제(Solaris)에서는 이것이 실제로 맞습니다.
하지만 리눅스는 그렇지 않습니다. 리눅스의 메모리 할당은 애플리케이션이 메모리 공간을 신청한 후 즉시 사용하지 않을 것이라고 가정하므로 애플리케이션이 실제로 필요할 때 일정량의 초과 예약이 허용됩니다. 이를 사용하면 운영 체제가 다른 응용 프로그램의 메모리 공간을 회수하여 이 응용 프로그램의 요구 사항을 충족할 수 있게 될 수 있습니다. 간단히 말해서 응용 프로그램이 실제 할당 가능한 공간(물리적 메모리 및 스왑 포함)보다 더 많은 공간을 적용할 수 있게 됩니다. . 더 많은 메모리를 사용하는 경우 이 기능을 OverCommit이라고 합니다.
이 기능은 Linux 운영 체제에서도 구성할 수 있습니다. /proc/sys/overcommit_memory를 다른 값으로 설정하여 OverCommit 정책을 조정할 수 있습니다.
Overcommit_memory는 3가지 값을 가질 수 있습니다:
0: 기본값 Linux 커널은 초과 예약 여부와 초과 예약 크기를 결정하기 위해 일부 휴리스틱 알고리즘을 사용합니다. 일반적으로 약간의 초과 예약이 허용되고 명백히 제공이 불가능한 일부 요청은 거부되며 일부 규칙 제한이 적용됩니다. 다른 사용자에 의한 오버 커밋으로 인해 크기도 다릅니다.
1: 초과 예약에 대한 제한 없이 허용됩니다. 물론 이는 무한하지 않으며 주소 지정 공간에 의해서도 제한됩니다. 32비트 시스템은 최대 4G만 가질 수 있고 64비트 시스템은 약 16T일 수 있습니다. .
2: 금지됨, 초과 예약이 금지됩니다. 시스템이 할당할 수 있는 메모리는 스왑 + 실제 물리적 메모리 * overcommit_ratio를 초과하지 않습니다. 이 값은 /proc/sys/vm/overcommit_ratio를 통해 설정할 수 있으며 기본값은 50%입니다.
Linux의 메모리 할당을 확인하기 위해 작은 프로그램을 사용하여 테스트합니다.
#include <stdio.h> #include <stdlib.h> #define MEGABYTE 1024*1024 int main(int argc, char *argv[]) { void *myblock = NULL; int count = 0; while (1) { myblock = (void *) malloc(MEGABYTE); if (!myblock) break; printf("Currently allocating %d MB\n", ++count); } exit(0); } #include <stdio.h> #include <stdlib.h> #define MEGABYTE 1024*1024 int main(int argc, char *argv[]) { void *myblock = NULL; int count = 0; while(1) { myblock = (void *) malloc(MEGABYTE); if (!myblock) break; memset(myblock,1, MEGABYTE); printf("Currently allocating %d MB\n",++count); } exit(0); }
전자는 malloc()을 통해 메모리 공간을 신청한 후 즉시 사용하지 않은 반면, 후자는 반대로 각 신청 후 즉시 1로 채웠다. 두 프로그램을 실행한 결과를 살펴보겠습니다.
이것은 1G RAM과 400M 스왑을 갖춘 가상 머신에서 실행한 결과입니다. 전자는 실제 메모리보다 훨씬 더 많은 공간을 적용하지만 후자는 실제 사용 가능한 메모리 공간을 초과하지 않습니다. 이는 앞서 설명한 Linux 메모리 할당 전략을 확인합니다.
이는 그 자체로 체계적인 최적화이며 이해할 수 있습니다. 그러나 우리는 모든 "초과 예약"이 동시에 리소스를 사용하는 많은 수의 프로그램이 없을 것이라는 가정에 기초하고 있으며 이는 분명히 위험하다는 것을 알고 있습니다. 따라서 Linux는 시스템의 사용 가능한 메모리(스왑 포함)가 모두 소모되기 전에 일부 프로세스를 선택적으로 종료하여 일부 메모리를 해제하는 OOM Killer(메모리 부족 킬러) 메커니즘을 사용합니다. 다음 장에서는 Linux OOM Killer의 메커니즘에 중점을 둘 것입니다.