ZGC: Failed to truncate backing file (Permission denied) at startup after 14.0.2 to 15.0.1 upgrade

David Tavoularis David.Tavoularis at mycom-osi.com
Mon Nov 23 14:35:49 UTC 2020


Hi Per,

Thank you for your quick reply.

> The fact that ftruncate returns EACCESS suggests that there's some kind  
> of environment problem that is blocking the file from growing.
> In the production system, is this process running in some constrained  
> environment/container/cgroup?
Yes, it is running inside a pod in an OpenShift environment.

> To test this, run with JDK 14 and use "-Xms270g -Xmx270g"
I tried with "-Xms100g -Xmx100g", I hope that it is fine for this test.

$ /opt/3rd_party/jdk_installed/jdk-14.0.2/bin/java -Xms100g -Xmx100g  
-XX:+UnlockExperimentalVMOptions -XX:+UseZGC -Xlog:gc*=debug -version
[0.006s][debug][gc,heap] Minimum heap 107374182400  Initial heap  
107374182400  Maximum heap 107374182400
[0.006s][info ][gc,init] Initializing The Z Garbage Collector
[0.006s][info ][gc,init] Version: 14.0.2+12-46 (release)
[0.006s][info ][gc,init] NUMA Support: Disabled
[0.006s][info ][gc,init] CPUs: 70 total, 40 available
[0.006s][info ][gc,init] Memory: 419840M
[0.006s][info ][gc,init] Large Page Support: Disabled
[0.006s][info ][gc,init] Medium Page Size: 32M
[0.006s][info ][gc,init] Workers: 24 parallel, 5 concurrent
[0.009s][debug][gc,task] Executing Task: ZWorkersInitializeTask, Active  
Workers: 24
[0.009s][info ][gc,init] Address Space Type:  
Contiguous/Unrestricted/Complete
[0.009s][info ][gc,init] Address Space Size: 1638400M x 3 = 4915200M
[0.010s][info ][gc,init] Heap backed by file: /memfd:java_heap
[0.010s][info ][gc,init] Min Capacity: 102400M
[0.010s][info ][gc,init] Initial Capacity: 102400M
[0.010s][info ][gc,init] Max Capacity: 102400M
[0.010s][info ][gc,init] Max Reserve: 80M
[0.010s][info ][gc,init] Pre-touch: Disabled
[0.010s][info ][gc,init] Available space on backing filesystem: N/A
[25.372s][info ][gc,init] Uncommit: Disabled
[25.372s][debug][gc,marking] Expanding mark stack space: 0M->32M
[25.888s][info ][gc,init   ] Runtime Workers: 24 parallel
[25.960s][info ][gc        ] Using The Z Garbage Collector
[26.179s][debug][gc,nmethod] Rebuilding NMethod Table: 0->1024 entries,  
0(0%->0%) registered, 0(0%->0%) unregistered
openjdk version "14.0.2" 2020-07-14
OpenJDK Runtime Environment (build 14.0.2+12-46)
OpenJDK 64-Bit Server VM (build 14.0.2+12-46, mixed mode)

$ /opt/3rd_party/jdk_installed/jdk-15.0.1/bin/java -Xms100g -Xmx100g  
-XX:+UnlockExperimentalVMOptions -XX:+UseZGC -Xlog:gc*=debug -version
[0.006s][debug][gc,heap] Minimum heap 107374182400  Initial heap  
107374182400  Maximum heap 107374182400
[0.006s][info ][gc,init] Initializing The Z Garbage Collector
[0.006s][info ][gc,init] Version: 15.0.1+9-18 (release)
[0.006s][info ][gc,init] NUMA Support: Disabled
[0.006s][info ][gc,init] CPUs: 70 total, 40 available
[0.006s][info ][gc,init] Memory: 419840M
[0.006s][info ][gc,init] Large Page Support: Disabled
[0.007s][info ][gc,init] Workers: 24 parallel, 5 concurrent
[0.010s][debug][gc,task] Executing Task: ZWorkersInitializeTask, Active  
Workers: 24
[0.011s][info ][gc,init] Address Space Type:  
Contiguous/Unrestricted/Complete
[0.011s][info ][gc,init] Address Space Size: 1638400M x 3 = 4915200M
[0.012s][info ][gc,init] Heap Backing File: /memfd:java_heap
[0.012s][error][gc     ] Failed to truncate backing file (Permission  
denied)
[0.012s][debug][gc,marking] Expanding mark stack space: 0M->32M
[0.081s][info ][gc,init   ] Runtime Workers: 24 parallel
[0.084s][info ][gc        ] Using The Z Garbage Collector
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.

> The fact that ftruncate returns EACCESS suggests that there's some kind  
> of environment problem
Is there a workaround or a way to fix the environment problem ?

Best Regards
David

On Mon, 23 Nov 2020 15:11:30 +0100, Per Liden <per.liden at oracle.com> wrote:

> Hi David,
>
> On 11/20/20 4:21 PM, David Tavoularis wrote:
>> Hi,
>>  I found a possible regression in customer production environment  
>> linked to JDK-8245203 "ZGC: Don't track size in ZPhysicalMemoryBacking"  
>> or JDK15 "Fixed support for transparent huge pages".
>> After upgrade from jdk-14.0.2 to jdk-15.0.1, the JVM (using ZGC) is  
>> crashing at startup with the error message "Failed to truncate backing  
>> file (Permission denied)"
>>  This error message was introduced in changelist  
>> http://hg.openjdk.java.net/jdk-updates/jdk15u/rev/556d5070c458
>> Cf source code :  
>> http://hg.openjdk.java.net/jdk-updates/jdk15u/file/556d5070c458/src/hotspot/os/linux/gc/z/zPhysicalMemoryBacking_linux.cpp  
>>   The issue was seen in Prod, not in Test, nor in labs, I suspect that   
>> Heap Backing Filesystem  is not correctly set to tmpfs in Prod or a  
>> permission issue on a directory/file owned by root.
>>  $ /opt/3rd_party/jdk_installed/jdk-15.0.1/bin/java -version
>> openjdk version "15.0.1" 2020-10-20
>> OpenJDK Runtime Environment (build 15.0.1+9-18)
>> OpenJDK 64-Bit Server VM (build 15.0.1+9-18, mixed mode, sharing)
>>  $ /opt/3rd_party/jdk_installed/jdk-15.0.1/bin/java -XX:+UseZGC -version
>> [0.009s][error][gc] Failed to truncate backing file (Permission denied)
>> Error: Could not create the Java Virtual Machine.
>> Error: A fatal exception has occurred. Program will exit.
>>  $ /opt/mycom/3rd_party/jdk_installed/jdk-14.0.2/bin/java  
>> -XX:+UnlockExperimentalVMOptions -XX:+UseZGC -version
>> openjdk version "14.0.2" 2020-07-14
>> OpenJDK Runtime Environment (build 14.0.2+12-46)
>> OpenJDK 64-Bit Server VM (build 14.0.2+12-46, mixed mode)
>>  Should I fill a bug at https://bugreport.java.com/bugreport/ ?
>> What additional information should I provide ?
>> Any workaround ?
>
> It's hard to tell exactly why this fails. One difference between JDK 14  
> and 15 is that the backing file will be truncated to the max heap size  
> up-front when the JVM starts (but it will not be backed by any memory  
> until we actually start to expand the heap), instead of gradually grown  
> as the heap expands. So, one theory is that you could have had this  
> problem even with 14, but the heap might not have grown large enough for  
> the problem to be exposed. To test this, run with JDK 14 and use  
> "-Xms270g -Xmx270g". This will force the backing file to be truncated  
> up-front, similar to what happens in JDK 15.
>
> Also running with "-Xlog:gc*=debug" will print a few more things that  
> might be interesting.
>
> The fact that ftruncate returns EACCESS suggests that there's some kind  
> of environment problem that is blocking the file from growing. In the  
> production system, is this process running in some constrained  
> environment/container/cgroup?
>
> cheers,
> Per


More information about the zgc-dev mailing list