RFR: 8324580: Disable THP when thp_pagesize is unknown

Thomas Stuefe stuefe at openjdk.org
Wed Jan 24 15:26:29 UTC 2024


On Wed, 24 Jan 2024 00:36:03 GMT, Zdenek Zambersky <zzambers at openjdk.org> wrote:

> **Problem:**
> When THP is enabled, JDK reads `/sys/kernel/mm/transparent_hugepage/hpage_pmd_size` file to [detect](https://github.com/openjdk/jdk/blob/96607df7f055a80d56ea4c19f3f4fcb32838b1f8/src/hotspot/os/linux/hugepages.cpp#L206) large page size. However this file only [appeared](https://github.com/torvalds/linux/commit/49920d28781dcced10cd30cb9a938e7d045a1c94) in kernel 4.10 and does not exist on kernel old kernels (such as 3.10 used by RHEL-7).
> 
> This results in detected large page size of 0B and crash, when `-XX:+UseTransparentHugePages` is used on old kernel.
> 
> gdb --args jdk-23+6/bin/java -XX:+UseTransparentHugePages -Xmx128m -Xlog:pagesize -version
> ...
> [0.005s][info][pagesize] Static hugepage support:
> [0.005s][info][pagesize]   hugepage size: 2M
> [0.005s][info][pagesize]   hugepage size: 1G
> [0.005s][info][pagesize]   default hugepage size: 2M
> [0.005s][info][pagesize] Transparent hugepage (THP) support:
> [0.005s][info][pagesize]   THP mode: always
> [0.005s][info][pagesize]   THP pagesize: 0B
> [0.005s][info][pagesize] Shared memory transparent hugepage (THP) support:
> [0.005s][info][pagesize]   Shared memory THP mode: unknown
> [0.005s][info][pagesize] JVM will attempt to prevent THPs in thread stacks.
> [0.005s][info][pagesize] UseLargePages=1, UseTransparentHugePages=1
> [0.005s][info][pagesize] Large page support enabled. Usable page sizes: 4k. Default large page size: 0B.
> 
> Program received signal SIGFPE, Arithmetic exception.
> [Switching to Thread 0x7ffff7fc2700 (LWP 31385)]
> 0x00007ffff68eeb20 in lcm(unsigned long, unsigned long) () from /home/tester/jdk-23+6/lib/server/libjvm.so
> (gdb) bt
> #0  0x00007ffff68eeb20 in lcm(unsigned long, unsigned long) () from /home/tester/jdk-23+6/lib/server/libjvm.so
> #1  0x00007ffff64a68f2 in Arguments::apply_ergo() () from /home/tester/jdk-23+6/lib/server/libjvm.so
> #2  0x00007ffff700458f in Threads::create_vm(JavaVMInitArgs*, bool*) () from /home/tester/jdk-23+6/lib/server/libjvm.so
> #3  0x00007ffff6a2373f in JNI_CreateJavaVM () from /home/tester/jdk-23+6/lib/server/libjvm.so
> #4  0x00007ffff7fe704b in InitializeJVM (ifn=<synthetic pointer>, penv=0x7ffff7fc1ea8, pvm=0x7ffff7fc1ea0) at src/java.base/share/native/libjli/java.c:1550
> #5  JavaMain (_args=<optimized out>) at src/java.base/share/native/libjli/java.c:491
> #6  0x00007ffff7feb1c9 in ThreadJavaMain (args=<optimized out>) at src/java.base/unix/native/libjli/java_md.c:650
> #7  0x00007ffff7bc6ea5 in start_thread (arg=0x7ffff7fc2700) at pthread_create.c:307
> #8  0x00007ffff76ebb0d ...

Hi @zzambers, thanks for finding this one.

I would not disable THPs in this case, though. I would set it to the default static huge page size, if that is available and <=, say, 16 MB.

Reasoning:
- Getting the THP size wrong is not so bad:
  - if its smaller than reality, we miss some THP clustering opportunities at the border of reservations, but no big deal
  - if its larger than reality, we may unnecessarily align up memory sizes and lose some memory that way. As long as the page size is not absurdly large (e.g. 1GB pages), its fine.

Therefore my proposal would be, in os_linux.cpp, when determining _large_pagesize, to:

if (thp_pagesize == 0) {
  set it to MIN2(static default large page size, 16MB);
}

-------------

PR Comment: https://git.openjdk.org/jdk/pull/17545#issuecomment-1908353804


More information about the hotspot-runtime-dev mailing list