Linux 캐시 및 스왑 메모리에 문제가 있습니다. 나는 Linux가 디스크에서 데이터를 읽을 때(RAM에 버퍼링) 자체적으로 최적화하고 있다는 것을 알고 있지만 내 경우에는 이 메모리 부분으로 인해 응용 프로그램이 스왑 공간을 사용하게 되는 것 같아서 응용 프로그램이 매우 느리게 실행되기 시작합니다(I 문제는 다음과 같습니다). Linux에서 실행되는 Java 서버). 출력은 다음과 같습니다.
[glassfish@pahod001 logs]$ free -m
total used free shared buffers cached
Mem: 32108 31031 1076 1 452 14980
-/+ buffers/cache: 15598 16509
Swap: 8191 49 8142
이제 모든 것이 거의 해결된 것 같습니다. 캐시를 포함하더라도 여전히 1076MB의 RAM을 사용할 수 있습니다. 그러나 얼마 후(Java 서버가 다시 시작된 이후의 시간 계산 -> 약 2일) Java 프로세스가 스왑 공간을 사용하기 시작했습니다( 에서 볼 수 있음 /proc/<proc id>/status
). 오늘 아침에는 10MB의 RAM을 사용하기 시작했으며 캐시된 데이터는 거의 15GB입니다. Linux가 애플리케이션에 실제로 필요한 메모리보다 캐시 메모리에 우선순위를 두고 이를 스왑으로 옮기는 이유는 무엇입니까? 스왑을 비활성화해야 합니까? 시스템 가동 시간은 737일입니다(중요한 서버입니다). 캐시에 뭔가가 걸려서 수동으로 정리해야 할까요? 프로덕션 서버이므로 모든 작업을 신중하게 수행해야 합니다.
이틀 전에 다시 시작한 프로세스는 이미 스왑을 사용하고 있으며 현재 15,5GB의 여유 RAM이 있습니다. 이런 캐시 메모리 관리 방식이 이해가 안 되네요...
[glassfish@pahod001 logs]$ cat /proc/20122/status
Name: java
State: S (sleeping)
Tgid: 20122
Pid: 20122
PPid: 1
TracerPid: 0
Uid: 537 537 537 537
Gid: 537 537 537 537
Utrace: 0
FDSize: 256
Groups: 537
VmPeak: 5995004 kB
VmSize: 5995000 kB
VmLck: 0 kB
VmHWM: 1017892 kB
VmRSS: 759988 kB
VmData: 5843144 kB
VmStk: 88 kB
VmExe: 4 kB
VmLib: 16624 kB
VmPTE: 2600 kB
VmSwap: 2844 kB
답변1
Java가 6GB(거의 모든 데이터)를 차지하고 3MB(0.0005%)의 스왑 공간이 걱정됩니까? 46MB의 사용된 스왑 공간은 어떻습니까?아니요이 프로세스의 경우 – 무엇을 사용하고 얼마나 자주 사용합니까?
물론 캐싱 목적으로 활성 프로세스를 교체해서는 안 됩니다. 그러나 이 3MB의 Java는 며칠 전에 로드되었기 때문에 사용되지 않았을 수 있습니다. 실제로 무엇이든 교체하고 있다는 사실은 알 수 없습니다. 교체하는 알고리즘이 RAM을 더 잘 활용할 수 있다고 결정한다는 것뿐입니다.
Java가 6GB를 영원히 예약해야 하는 이유를 설명할 수 있습니까? 제가 보기에는 메모리 누수가 있거나 알고리즘이 빅 데이터에 대해 허용되지 않는 동작을 하는 것 같습니다.
전체 시스템에 대한 더 넓은 진단 보기를 제공하는 것이 필요하다고 생각하지만 RHEL이 없습니다.