RFR: 8315923: pretouch_memory by atomic-add-0 fragments huge pages unexpectedly [v28]
Johan Sjölen
jsjolen at openjdk.org
Fri Jan 19 09:41:36 UTC 2024
On Mon, 15 Jan 2024 06:50:49 GMT, Liming Liu <duke at openjdk.org> wrote:
>> As described at [JDK-8315923](https://bugs.openjdk.org/browse/JDK-8315923), this patch uses madvise with MADV_POPULATE_WRITE to pretouch memory when supported (since kernel 5.14).
>>
>> Ran the newly added jtreg test on 64c Neoverse-N1 machines with kernel 4.18, 5.13 and 6.1, and observed that transparent huge pages formed right after pretouch on kernel 6.1. Recorded the time spent on the test in *seconds* with `VERBOSE=time` as the table below, and got that the patch takes improvements when the system call is supported, while does not hurt if not supported:
>>
>> <table>
>> <tr>
>> <th>Kernel</th>
>> <th colspan="2"><tt>-XX:-TransparentHugePages</tt></th>
>> <th colspan="2"><tt>-XX:+TransparentHugePages</tt></th>
>> </tr>
>> <tr><td></td><td>Unpatched</td><td>Patched</td><td>Unpatched</td><td>Patched</td></tr>
>> <tr><td>4.18</td><td>11.30</td><td>11.30</td><td>0.25</td><td>0.25</td></tr>
>> <tr><td>5.13</td><td>0.22</td><td>0.22</td><td>3.42</td><td>3.42</td></tr>
>> <tr><td>6.1</td><td>0.27</td><td>0.33</td><td>3.54</td><td>0.33</td></tr>
>> </table>
>
> Liming Liu has updated the pull request incrementally with one additional commit since the last revision:
>
> Untabify
src/hotspot/os/linux/os_linux.cpp line 4403:
> 4401: // Check the availability of MADV_POPULATE_WRITE.
> 4402: UseMadvPopulateWrite = (::madvise(0, 0, MADV_POPULATE_WRITE) == 0);
> 4403:
What happens if the user sets `UseMadvPopulateWrite` to false when starting the JVM? It should not be used then.
test/hotspot/gtest/runtime/test_os_linux.cpp line 407:
> 405: }
> 406: }
> 407:
Is there a reason that you want to use pthreads directly instead of using `TestThreadGroup`?
Draft:
```c++
char* heap = os::reserve_memory(1 * G, false, mtInternal);
size_t size = 1*G;
auto pretouch = [&](Thread* c, int id)) {
os::pretouch_memory(heap, heap + byte, os::vm_page_size());
};
auto use_memory = [&](Thread* c, int id) {
int* iptr = reinterpret_cast<int*>(heap);
for (int i = 0; i < 1000 && (size_t)i < (byte / (sizeof(int))); i++)
*iptr++ = i;
};
TestThreadGroup<decltype(use_memory)> users_t(use_memory, 8);
TestThreadGroup<decltype(pretouch)> pretouch_t(pretouch, 1);
users_t.doit();
pretouch_t.doit();
users_t.join();
pretouch_t.join();
-------------
PR Review Comment: https://git.openjdk.org/jdk/pull/15781#discussion_r1458667877
PR Review Comment: https://git.openjdk.org/jdk/pull/15781#discussion_r1458665368
More information about the hotspot-runtime-dev
mailing list