리눅스 메모리 부족 응용 프로그램 분해 방지


34

나는 때때로 리눅스 박스에 메모리가 부족하고 그것을 처리하기 위해 임의의 프로세스를 분해하기 시작한다는 것을 발견했다.

이 문제를 피하기 위해 관리자가하는 일이 궁금합니다. 메모리 양을 늘리는 유일한 해결책이 있습니까? (스왑 만 도움이 되겠습니까?) 이것을 피하기 위해 소프트웨어로 상자를 설정하는 더 좋은 방법이 있습니까? (예 : 할당량 또는 일부)?


여기에서 답변을 찾았습니다 : serverfault.com/questions/362589/… Patrick의 답변은 매우 유익합니다
Amaury

답변:


44

리눅스는 기본적으로 다소 뇌 손상을 입힌 메모리 관리 개념을 가지고 있습니다. 시스템보다 많은 메모리를 할당 한 다음 문제가 발생했을 때 무작위로 프로세스를 쏴 버립니다. (살해되는 것의 실제 의미는 그보다 더 복잡합니다. Google "Linux OOM Killer"는 그것이 좋은지 나쁜지에 대한 많은 세부 사항과 인수를 제공합니다.)


온전한 유사성을 메모리 관리로 복원하려면 :

  1. OOM Killer 비활성화 ( vm.oom-kill = 0/etc/sysctl.conf에 넣기 )
  2. 메모리 오버 커밋 비활성화 ( vm.overcommit_memory = 2/etc/sysctl.conf에 넣기 )
    이 값은 기본 값입니다. 0 = "RAM이 충분한 경우 추정", 1 = "항상 예", 2 = "그렇지 않으면 아니오 기억을 가지고 ")

이러한 설정은 Linux를 전통적인 방식으로 작동하게합니다 (프로세스가 사용 가능한 것보다 많은 메모리를 요청하면 malloc ()이 실패하고 메모리를 요청하는 프로세스가 해당 실패에 대처할 것으로 예상됩니다).

컴퓨터를 재부팅하여 다시로드 /etc/sysctl.conf하거나 proc파일 시스템을 사용하여 재부팅하지 않고 즉시 활성화하십시오.

echo 2 > /proc/sys/vm/overcommit_memory 

11
리눅스가 두뇌를 손상시킨 것은 아니지만 메모리를 할당하는 프로그래머는 절대 사용하지 않습니다. Java VM은 이것으로 유명합니다. Java 응용 프로그램을 실행하는 서버를 관리하는 관리자는 오버 커밋없이 1 초 동안 생존하지 못합니다.
Aleksandar Ivanisevic

11
Java 프로그래머는 사용되지 않은 메모리를 할당하지 않으며 java에는 malloc이 없습니다. 나는 당신이 이것을 -Xms와 같은 JVM 설정과 혼동하고 있다고 생각합니다. 어쨌든 스왑 공간을 추가하여 가상 메모리 크기를 늘리는 것은 오버 커밋보다 훨씬 안전한 솔루션입니다.
jlliagre

5
이 솔루션은 시스템의 메모리 부족 또는 프로세스 종료를 막지 않습니다. 하나의 프로세스가 모든 메모리를 사용하면 malloc을 시도하는 다음 프로세스는 충돌을 일으키지 않을 것입니다. 불행히도 다음 프로세스가 초기화 (또는 중요한 다른 프로세스) 인 경우 OOM Killer는 일반적으로 피합니다.
pehrs

8
jlliagre, 내가 자바 가상 머신 (가상 머신)가 아닌 자바 프로그램은 관리자의 관점에서이 :) 동일하지만, 말했다
알렉산다르 Ivanisevic

8
아마도 여기에 위의 내용을 추가 /etc/sysctl.conf하면 다음에 다시 부팅 할 때만 적용됩니다. 지금 변경 하려면 sysctl루트 권한을 가진 명령을 사용해야합니다.sudo sysctl vm.overcommit_memory=2
nickgrim


3

서버의 짧은 대답은 더 많은 RAM을 구입하여 설치하는 것입니다.

일상적으로 충분한 OOM (메모리 부족) 오류가 발생하고 Linux 커널에서 VM (가상 메모리) 관리자의 초과 커밋 sysctl 옵션 외에는 서버가 좋지 않습니다.

스왑 크기 (커널 메모리 관리자가 디스크로 페이징 한 가상 메모리)를 사용하면 현재 값이 낮을 때 도움이되며 사용량에는 하나 또는 몇 개가 아닌 이러한 많은 양의 메모리가 필요한 많은 작업이 사용됩니다 사용 가능한 총 가상 메모리 (RAM + 스왑)를 요청하는 각 프로세스.

스왑으로 2 배 이상의 RAM을 할당하는 많은 응용 프로그램의 경우 스왑으로서의 RAM 양은 개선에 대한 수익 감소를 제공합니다. 일부 대규모 계산 시뮬레이션에서는 속도 저하가 견딜 수있는 경우에 적합 할 수 있습니다.

RAM (ECC 여부)이 적당한 양, 예를 들어 4-16GB에 비해 상당히 저렴하기 때문에 오랫동안이 문제를 직접 경험하지 못했습니다.

메모리 사용 패턴에 대한 가장 일반적인 두 가지 빠른 평가로 메모리 사용을 기준으로 정렬 된 free및 사용을 포함하여 메모리 소비를 보는 기본 사항 top. 따라서 최소한 해당 명령의 출력에서 ​​각 필드의 의미를 이해해야합니다.

특정 응용 프로그램 (예 : 데이터베이스, 네트워크 서비스 서버, 실시간 비디오 처리) 및 서버 사용 (몇몇 고급 사용자, 100-1000 사용자 / 클라이언트 연결)이 없으면 처리와 관련된 일반적인 권장 사항을 생각할 수 없습니다 OOM 문제.


3

실제 메모리의 양을 늘리는 것이 모든 상황에서 효과적인 응답은 아닙니다.

이를 확인하는 한 가지 방법은 'atop'명령입니다. 특히이 두 줄.

이것은 건강했을 때 서버가 아닙니다.

MEM | tot   23.7G | free   10.0G | cache   3.9G | buff  185.4M | slab  207.8M |
SWP | tot    5.7G | free    5.7G |              | vmcom  28.1G | vmlim  27.0G |

제대로 작동하지 않을 때 (그리고 overcommit_memory를 50에서 90으로 조정하기 전에 50G를 초과하는 vmcom의 동작, 몇 초마다 붐 킬러 프로세스가 폭발하고 NFSd 자식 프로세스가 날아가서 부하가 급격히 튀어 오릅니다. 지속적으로 다시 만들고.

최근 다중 사용자 Linux 터미널 서버가 가상 메모리 할당을 과도하게 커밋하지만 실제로 요청 된 페이지가 거의 사용되지 않는 경우가 중복되었습니다.

이 정확한 경로를 따르는 것은 좋지 않지만 오버 커밋 메모리는 기본 50에서 90으로 조정되어 일부 문제가 완화되었습니다. 우리는 모든 사용자를 다른 터미널 서버로 옮기고 다시 시작해야 전체 이점을 볼 수있었습니다.


2

ulimit를 사용하여 프로세스가 종료되기 전에 청구 할 수있는 메모리 양을 줄일 수 있습니다. 문제가 서버와 충돌하는 하나 또는 몇 개의 런 어웨이 프로세스 인 경우 매우 유용합니다.

문제가 단순히 서비스를 실행할 메모리가 충분하지 않다면 필요한 솔루션은 세 가지뿐입니다.

  1. 캐시 등을 제한하여 서비스에서 사용하는 메모리를 줄입니다.

  2. 더 큰 스왑 영역을 만듭니다. 성능이 저하되지만 시간이 좀 걸릴 수 있습니다.

  3. 더 많은 메모리 구매


0

이 버그 와 관련된 비슷한 문제가 있었고 해결책은 이전 / 최신 (고정) 커널을 사용하는 것이 었습니다.

그러나 당시 내 컴퓨터를 재부팅 할 수 없었기 때문에 어떤 종류의 추악한 해결책은 다음 명령으로 루트로 로그인하고 시스템 캐시를 지우는 것입니다.

echo 3 > /proc/sys/vm/drop_caches

-5

@ voretaq7 linux는 두뇌 손상을 입은 메모리 관리 개념을 가지고 있지 않습니다. 기본적으로 vm.overcommit_ratio는 0입니다.

0       -   Heuristic overcommit handling. Obvious overcommits of
            address space are refused. Used for a typical system. It
            ensures a seriously wild allocation fails while allowing
            overcommit to reduce swap usage.  root is allowed to
            allocate slightly more memory in this mode. This is the
            default.

이런 식으로 4GB의 램이 있고 가상 메모리의 malloc으로 4.2GB를 할당하려고하면 할당이 실패합니다.

vm.overcommit_ratio = 1 인 경우

            1    -   Always overcommit. Appropriate for some scientific
            applications. Classic example is code using sparse arrays
            and just relying on the virtual memory consisting almost
            entirely of zero pages.

vm.overcommit_ratio = 2로

           2    -   Don't overcommit. The total address space commit
            for the system is not permitted to exceed swap + a
            configurable percentage (default is 50) of physical RAM.
            Depending on the percentage you use, in most situations
            this means a process will not be killed while accessing
            pages but will receive errors on memory allocation as
            appropriate.

            Useful for applications that want to guarantee their
            memory allocations will be available in the future
            without having to initialize every page.

따라서 기본적으로 리눅스는 오버 커밋하지 않습니다. 애플리케이션에 더 많은 메모리가 있다면 코드가 버그 일 수 있습니다


2
당신은 여기에 자신을 모순했습니다. 맨 위에 "기본적으로 vm.overcommit_ratio는 0"이라고 말하고 맨 아래에 "기본적으로 linux는 초과 커밋하지 않습니다"라고 말합니다. 후자가 사실이면 vm.overcommit_ratio는 기본적으로 2가됩니다!
Michael Hampton

vm.overcommit_ratio = 0, malloc을 사용하면 실제 RAM보다 더 많은 가상 할당 할 수 있습니다 때 오버 커밋이 수단이 오버 커밋하지 않는 것이 나를 위해, 그래서 실제 RAM보다하지 ALLOC 더 많은 메모리를 않습니다
c4f4t0r

2
네, 당신은 오해했습니다.
Michael Hampton

당신은 내가 무엇을 말해 오해하는 경우, 기본 0, 램보다 더 많은 가상 메모리를 할당하는 할당하지 않고 2 가서 vm.overcommit_ratio + 스왑 공간을 허용하지 않습니다, 오해
c4f4t0r

2
당연하지. "명백한 초과 커밋"은 거부됩니다. 나머지는지나갑니다. 더 자세히 읽어야합니다.
Michael Hampton
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.