Use DAX in ZGC

Yasumasa Suenaga suenaga at oss.nttdata.com
Fri Feb 14 13:31:29 UTC 2020


Hi Per,

On 2020/02/14 20:52, Per Liden wrote:
> Hi Yasumasa,
> 
> On 2/14/20 10:07 AM, Yasumasa Suenaga wrote:
>> Hi all,
>>
>> I tried to allocate heap to DAX on Linux with -XX:AllocateHeapAt, but it couldn't.
>> It seems to allow when filesystem is hugetlbfs or tmpfs.
>>
>> According to kernel document [1], DAX is supported in ext2, ext4, and xfs.
>> Also we need to mount it with "-o dax".
>>
>> I want to use ZGC on DAX, so I want to introduce new option -XX:ZAllowHeapOnFileSystem to allow to use all filesystem as backing storage.
>> What do you think this change?
> 
> 
> +  experimental(bool, ZAllowHeapOnFileSystem, false,     \
> +          "Allow to use filesystem as Java heap backing storage "     \
> +          "specified by -XX:AllocateHeapAt")     \
> +     \
> 
> Instead of adding a new option it would be preferable to automatically detect that it's a dax mounted filesystem. But I haven't has a chance to look into the best way of doing that.

I thought so, but I guess it is difficult.
PMDK also does not check it automatically.

   https://github.com/pmem/pmdk/blob/master/src/libpmem2/pmem2_utils_linux.c#L18

In addition, we don't seem to be able to get mount option ("-o dax") via syscall.
I strace'ed `mount -o dax ...`, I saw "-o dax" was passed to 5th argument (const void *data). It would be handled in each filesystem, so I could not get it.

Another solution, we can use /proc/mounts, but it might be complex.


>     const size_t expected_block_size = is_tmpfs() ? os::vm_page_size() : os::large_page_size();
> -  if (expected_block_size != _block_size) {
> +  if (!ZAllowHeapOnFileSystem && (expected_block_size != _block_size)) {
>       log_error(gc)("%s filesystem has unexpected block size " SIZE_FORMAT " (expected " SIZE_FORMAT ")",
>                     is_tmpfs() ? ZFILESYSTEM_TMPFS : ZFILESYSTEM_HUGETLBFS, _block_size, expected_block_size);
>       return;
>     }
> 
> This part looks potentially dangerous, since we might then be working with an incorrect _block_size.

I guess block size in almost filesystems is 4KB even if DAX.
(XFS allows variable block sizes...)

   https://nvdimm.wiki.kernel.org/2mib_fs_dax

So I think we can limit _block_size to OS page size (4KB).


>   int ZPhysicalMemoryBacking::create_file_fd(const char* name) const {
> +  if (ZAllowHeapOnFileSystem && (AllocateHeapAt == NULL)) {
> +    log_error(gc)("-XX:AllocateHeapAt is needed when ZAllowHeapOnFileSystem is specified");
> +    return -1;
> +  }
> +
>     const char* const filesystem = ZLargePages::is_explicit()
>                                    ? ZFILESYSTEM_HUGETLBFS
>                                    : ZFILESYSTEM_TMPFS;
> 
> This part looks unnecessary, no?

I added ZAllowHeapOnFileSystem to use with AllocateHeapAt.
So I want to warn if AllocateHeapAt == NULL.


Thanks,

Yasumasa


> cheers,
> Per
> 
>>
>>    http://cr.openjdk.java.net/~ysuenaga/dax-z/
>>
>> If it can be accepted, I will file it to JBS and will propose CSR.
>>
>>
>> Thanks,
>>
>> Yasumasa
>>
>>
>> [1] https://www.kernel.org/doc/Documentation/filesystems/dax.txt


More information about the hotspot-gc-dev mailing list