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