RFR: 8324580: SIGFPE on THP initialization on kernels < 4.10 [v4]

Zdenek Zambersky zzambers at openjdk.org
Wed Feb 7 14:11:00 UTC 2024


On Wed, 31 Jan 2024 16:42:16 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...
>
> Zdenek Zambersky has updated the pull request incrementally with one additional commit since the last revision:
> 
>   Disable THP for too large page sizes

After more thinking about this and looking to code, I think, I would now prefer current state. (i.e. keeping [HugePages class](https://github.com/openjdk/jdk/blob/c3a632dca75d2fad0a60e03e7b4fc64edb1e906e/src/hotspot/os/linux/hugepages.hpp#L123) as container for "raw" (detected) OS values and than setting _large_page_size to final value in [os_linux.cpp](https://github.com/openjdk/jdk/blob/c3a632dca75d2fad0a60e03e7b4fc64edb1e906e/src/hotspot/os/linux/os_linux.cpp))

**Reasons:**
- It is convenient for debugging to (also) see raw values as read from OS in log
- There is already some other logic that which can affect final configuration, [being done in os_linux.cpp](https://github.com/openjdk/jdk/blob/c3a632dca75d2fad0a60e03e7b4fc64edb1e906e/src/hotspot/os/linux/os_linux.cpp#L3990), so to keep things consistent (also not to do refactoring in this change).
- It keeps some tests more intuitive straightforward e.g. [TestHugePageDetection](https://github.com/openjdk/jdk/blob/f173e278368d31bc1fe2407defe914e7e246e231/test/hotspot/jtreg/runtime/os/TestHugePageDetection.java) which uses [HugePageConfiguration](https://github.com/openjdk/jdk/blob/f173e278368d31bc1fe2407defe914e7e246e231/test/hotspot/jtreg/runtime/os/HugePageConfiguration.java#L179), read from OS and from log and compares them.

**Log:**
- There is an information about not being able to determine THP pagesize:
`[0.007s][info][pagesize] Cannot determine THP page size (kernel < 4.10 ?)`
- Final value of page size (_large_page_size variable) is displayed as "Default large page size":
`[0.007s][info][pagesize] Large page support enabled. Usable page sizes: 4k, 2M. Default large page size: 2M.`
- Line informing about falling back to default static hugepage size can be added.

**Full log:**
(current state in case of unknown THP pagesize (with fallback))

build/linux-x86_64-server-fastdebug/images/jdk/bin/java -XX:+UseTransparentHugePages -Xmx128m -Xlog:pagesize -version
[0.007s][info][pagesize] Static hugepage support:
[0.007s][info][pagesize]   hugepage size: 2M
[0.007s][info][pagesize]   hugepage size: 1G
[0.007s][info][pagesize]   default hugepage size: 2M
[0.007s][info][pagesize] Transparent hugepage (THP) support:
[0.007s][info][pagesize]   THP mode: always
[0.007s][info][pagesize]   THP pagesize: 0B
[0.007s][info][pagesize] Shared memory transparent hugepage (THP) support:
[0.007s][info][pagesize]   Shared memory THP mode: unknown
[0.007s][info][pagesize] JVM will attempt to prevent THPs in thread stacks.
[0.007s][info][pagesize] Cannot determine THP page size (kernel < 4.10 ?)
[0.007s][info][pagesize] UseLargePages=1, UseTransparentHugePages=1
[0.007s][info][pagesize] Large page support enabled. Usable page sizes: 4k, 2M. Default large page size: 2M.
[0.010s][info][pagesize] CodeHeap 'non-nmethods':  min=4M max=6M base=0x00007f7f27c00000 size=6M page_size=2M
[0.011s][info][pagesize] CodeHeap 'profiled nmethods':  min=4M max=116M base=0x00007f7f20800000 size=116M page_size=2M
[0.011s][info][pagesize] CodeHeap 'non-profiled nmethods':  min=4M max=118M base=0x00007f7f28200000 size=118M page_size=2M
[0.018s][info][pagesize] Heap:  min=8M max=128M base=0x00000000f8000000 size=128M page_size=2M
[0.018s][info][pagesize] Block Offset Table: req_size=256K req_page_size=4K base=0x00007f7f3fa7e000 size=256K page_size=4K
[0.018s][info][pagesize] Card Table: req_size=256K req_page_size=4K base=0x00007f7f3fa3e000 size=256K page_size=4K
[0.018s][info][pagesize] Mark Bitmap: req_size=2M req_page_size=2M base=0x00007f7f20600000 size=2M page_size=2M
...

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

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


More information about the hotspot-runtime-dev mailing list