저는 Red Hat Enterprise Linux Server 버전 5.9에서 Java 서버를 실행하고 있습니다. 최근에 나는 HugePages를 사용하기 시작했습니다. 왜냐하면 내가 사용하고 싶었던 몇 가지 장점이 있기 때문입니다. 시스템은 올바르게 구성되었으며(많은 웹사이트 및 블로그의 경우와 마찬가지로) 대형 페이지에 대해 40G RAM이 설정되어 있습니다.
HugePages_Total: 20480
거대한페이지_무료:20480
HugePages_Rsvd: 0
큰 페이지 크기: 2048kB
서버의 총 메모리: 128G. hugePages를 설정한 후 시스템이 다시 시작되고 힙 크기가 29G인 hugePages에서 서버 프로세스가 시작되었습니다. 모든 것이 순조롭게 진행되고 있습니다. 최근에 jvm 매개변수를 일부 변경하고 힙 크기를 30G로 늘렸습니다. jvm 프로세스가 다시 시작되었을 때 거대한 페이지를 사용하지 않았습니다. 로그에 오류가 나타납니다.
Java HotSpot(TM) 서버 VM 경고: 공유 메모리를 예약할 수 없습니다(errno = 22).
Java 매개변수의 다른 변경사항이 이 문제를 일으키지 않는지 확인하기 위해 몇 가지 테스트를 수행했으며 힙 크기 증가가 원인이라는 결론을 내렸습니다.
이제는 이해가 안 돼요. 시스템은 hugePages가 전혀 사용되지 않음을 보여주므로 여전히 40G의 공간이 남아 있고 Java는 여전히 그 중 30G를 보유할 수 없습니다.
왜 이런 일이 발생하는지 설명할 수 있는 사람이 있나요?
더 중요한 것은 앞으로 이런 일이 발생하지 않도록 할 수 있는 방법이 있습니까?
이것은 프로덕션 시스템이므로 최종 구성을 생성하면 남은 공간이 없기 때문에 huge page 외부에서 Java 프로세스를 실행할 수 없습니다. 최종 구성은 96G 대용량 페이지로, 하나의 32GB Java 프로세스가 지속적으로 작동하고 리소스가 비상 시 다른 두 프로세스를 실행하기 위해 예약됩니다. 이러한 긴급 상황이 발생하면 Java 프로세스가 hugePages를 사용할 수 있는지 확인해야 합니다.
어떤 도움이라도 좋을 것입니다.
답변1
JVM에서 거대한 페이지 사용을 명시적으로 활성화해야 한다고 생각합니다 -XX:+UseLargePages
. 이 게시물을 확인하세요.대규모 Java 힙 및 Linux 대규모 페이지 조정.
다른 관련 JVM 스위치를 확인하고 싶을 수도 있습니다.
답변2
또한 /etc/security/limits.conf에서 "memlock" 매개변수를 확인해야 합니다. 이 매개변수가 충분히 높은 값으로 설정되지 않으면 JVM을 실행하는 사용자는 거대한 페이지가 충분히 구성되어 있어도 거대한 페이지를 할당할 수 없습니다. (할당을 원할 경우 memlock이 30GB 이상으로 설정되어 있는지 확인하세요.)