SIGBUS on linux in perfMemory_init (containers)
Severin Gehwolf
sgehwolf at redhat.com
Mon May 2 12:41:15 UTC 2022
Hi,
On Fri, 2022-04-29 at 14:19 -0700, Ioi Lam wrote:
>
>
> On 4/29/2022 1:55 PM, Ioi Lam wrote:
> >
> >
> > On 4/29/2022 6:44 AM, Vitaly Davidovich wrote:
> > > Hi all,
> > >
> > > We've been seeing intermittent SIGBUS failures on linux with jdk11.
> > > They
> > > all have this distinctive backtrace:
> > >
> > > C [libc.so.6+0x12944d]
> > >
> > > V [libjvm.so+0xcca542] perfMemory_init()+0x72
> > >
> > > V [libjvm.so+0x8a3242] vm_init_globals()+0x22
> > >
> > > V [libjvm.so+0xedc31d] Threads::create_vm(JavaVMInitArgs*,
> > > bool*)+0x1ed
> > >
> > > V [libjvm.so+0x9615b2] JNI_CreateJavaVM+0x52
> > >
> > > C [libjli.so+0x49af] JavaMain+0x8f
> > >
> > > C [libjli.so+0x9149] ThreadJavaMain+0x9
> > >
> > >
> > > Initially, we suspected that /tmp was full but that turned out to not be
> > > the case. After a few more instances of the crash and investigation, we
> > > believe we know the root cause.
> > >
> > >
> > > The crashing applications are all running in a K8 pod, with each JVM
> > > in a
> > > separate container:
> > >
> > >
> > > container_type: cgroupv1 (from the hs_err file)
> > >
> > >
> > > /tmp is mounted such that it's shared by multiple containers. Since
> > > these
> > > JVMs are running in containers, we believe what happens is the
> > > namespaced
> > > (i.e. per container) PIDs overlap between different containers - 2
> > > JVMs, in
> > > separate containers, can end up with the same namespaced PID. Since /tmp
> > > is shared, they can now "contend" on the same perfMemory file since
> > > those
> > > file names are PID based.
> >
> > Hi Vitaly,
> >
> > Is there any reason for sharing the same /tmp directory across
> > different containers?
> >
> > Are you using the /tmp/hsperfdata_$USER/<pid> files at all. If not,
> > for the time being, you can disable them with the -XX:-UsePerfData flag,
> >
> > https://bugs.openjdk.java.net/browse/JDK-8255008 has a related proposal:
> >
This bug is private. Could this one be made accessible somehow?
Another related bug seems to be, though not quite the same:
https://bugs.openjdk.java.net/browse/JDK-8284330
> > Java: -Djdk.attach.tmpdir=/container-attachdir
> > -XX:+UnlockCommercialFeature -XX:+FlightRecorder -XX:+StartAttachListener
> > Docker: --volume /tmp/container-attachdir:/container-attachdir
> >
> > In this case, we probably will run into the same UID clash problem as
> > well.
> >
> > Maybe we should have an additional property like
> > -Djdk.attach.use.global.pid=true
> >
>
> I read the proposal in JDK-8255008 again and realized that the JVM
> inside the container doesn't know what it's host PID is. The proposal is
> to create these files:
>
> $jdk_attach_dir/hsperfdata_{user}/e4f3e2e4fd97:10
> $jdk_attach_dir/.java_pid:e4f3e2e4fd97:10
>
> where the e4f3e2e4fd97 is the container ID which is visible as
> /tmp/hostname from inside the container.
>
> I'll try to implement a prototype for the proposal.
Please be aware that the container's hostname is also user-settable.
E.g.
$ docker run --hostname foo ...
Would set the hostname to 'foo'.
Ioi, did you end up creating a bug for this?
Thanks,
Severin
> Thanks
> - Ioi
>
> >
> > >
> > > Once multiple JVMs can contend on the same file, a SIGBUS can
> > > arise
> > > if one
> > > JVM has mmap'd the file and another ftruncate()'s it from under
> > > it (e.g.
> > > https://github.com/openjdk/jdk11/blob/37115c8ea4aff13a8148ee2b8832b20888a5d880/src/hotspot/os/linux/perfMemory_linux.cpp#L909
> > >
> > >
> > > ).
> > >
> > >
> > > Is this a known issue? I couldn't find any existing JBS entries
> > > or
> > > mailing
> > > list discussions around this specific circumstance.
> > >
> > >
> > > As for possible solutions, would it be possible to use the global
> > > PID
> > > instead of the namespaced PID to "regain" the uniqueness
> > > invariant of
> > > the
> > > PID?
> >
> > I think this needs to be optional. E.g., if you run a tool such as
> > "jcmd" inside the same container as the jvm process, the jcmd tool
> > would expect the PID to be the local version specific to this
> > container.
> >
> > > Also, might it make sense to flock() the file to prevent
> > > another
> > > process from mucking with it?
> > >
> > That will not solve the fundamental problem where two processes are
> > using the same hsperfdata file. One of them would fail to write to
> > it,
> > and tools won't be able to monitor both processes.
> >
> > Thanks
> > - Ioi
> >
> > > Happy to provide more info if needed.
> > >
> > >
> > > Thanks
> >
>
More information about the hotspot-runtime-dev
mailing list