
물리적 메모리(RAM)가 12GB로 할당된 Linux 서버에서 실행되는 Java 애플리케이션이 있는데, 여기서 일정 기간 동안의 정상적인 사용률을 아래와 같이 볼 수 있습니다.
sys> free -h
total used free shared buff/cache available
Mem: 11G 7.8G 1.6G 9.0M 2.2G 3.5G
Swap: 0B 0B 0B
최근 애플리케이션 로드가 증가하면서 RAM 사용률이 거의 꽉 찼고 사용 가능한 공간이 매우 적어서 약간의 속도 저하가 발생할 수 있었지만 여전히 애플리케이션은 계속해서 정상적으로 작동하는 것을 볼 수 있었습니다.
sys> free -h
total used free shared buff/cache available
Mem: 11G 11G 134M 17M 411M 240M
Swap: 0B 0B 0B
sys> free -h
total used free shared buff/cache available
Mem: 11G 11G 145M 25M 373M 204M
Swap: 0B 0B 0B
나는 언급했다https://www.linuxatemyram.com/아래 사항을 제안했습니다.
경고 신호조사해 볼 수 있는 실제 메모리 부족 상황:
- 사용 가능한 메모리(또는 "여유 + 버퍼/캐시")가 0에 가깝습니다.
- 사용된 스왑이 증가하거나 변동합니다.
- dmesg | grep oom-killer는 작업 중인 OutOfMemory-killer를 보여줍니다.
위의 점에서 응용 프로그램 수준에서는 OOM 문제가 표시되지 않으며 스왑도 비활성화되었습니다. 그래서 두 가지 점을 무시합니다. 나를 괴롭히는 한 가지 점은 설명이 필요한 사용 가능한 메모리가 0보다 작다는 것이었습니다.
질문:
- available이 0에 가까울 경우 시스템 충돌이 발생합니까?
- 사용 가능한 메모리가 줄어들면 RAM을 업그레이드해야 한다는 의미입니까?
- RAM 메모리는 어떤 기준으로 할당/증가해야 합니까?
- RAM 메모리 할당을 위해 따라야 하는 공식적인 권장 사항/지침이 있습니까?
답변1
내 질문 중 하나에 대한 답변을 얻을 수 있습니다.
available이 0에 가까울 경우 시스템 충돌이 발생합니까?
내 서버 중 하나에서 테스트할 때 아래와 같이 거의 가득 찬 메모리를 로드했습니다.
sys> free -h
total used free shared buff/cache available
Mem: 11G 11G 135M 25M 187M 45M
Swap: 0B 0B 0B
내 응용 프로그램만(더 많은 메모리를 소비함) 커널 로그에서 참조할 수 있는 메모리 부족 킬러에 의해 종료된 것을 볼 수 있습니다.
dmesg -e
[355623.918401] [21805] 553000 21805 69 21 2 0 0 rm
[355623.921381] Out of memory: Kill process 11465 (java) score 205 or sacrifice child
[355623.925379] Killed process 11465 (java), UID 553000, total-vm:6372028kB, anon-rss:2485580kB, file-rss:0kB, shmem-rss:0kB
https://www.kernel.org/doc/gorman/html/understand/understand016.html
Out Of Memory Killer 또는 OOM Killer는 시스템의 메모리가 매우 부족할 때 Linux 커널이 사용하는 프로세스입니다. 이러한 상황은 Linux 커널이 프로세스에 메모리를 과도하게 할당했기 때문에 발생합니다. ... 이는 실행 중인 프로세스에 물리적으로 사용 가능한 것보다 더 많은 메모리가 필요함을 의미합니다.