Skip to content

dmeventd hangs for minutes when started by lvm and RLIMIT_NOFILE is large

Reproduction steps:

  • Not have dm-event.socket/dm-event.service enabled
  • Run some LVM command with large open file descriptor limit, e.g.: sudo sh -c 'ulimit -n 1073741816; lvcreate --size 15G --snapshot --name snap0 /dev/mapper/vg0-root'

lvcreate would spawn dmeventd itself, which would daemonize, and try to close all of those billion FDs (see https://gitlab.com/lvmteam/lvm2/-/blob/28786f826abaf4b8cdbd38533fab864cc0e227c7/daemons/dmeventd/dmeventd.c#L1998-2011), consuming 100% CPU time for minutes:

<...>
close(246564837)                        = -1 EBADF (Bad file descriptor)
close(246564836)                        = -1 EBADF (Bad file descriptor)
close(246564835)                        = -1 EBADF (Bad file descriptor)
close(246564834)                        = -1 EBADF (Bad file descriptor)
close(246564833)                        = -1 EBADF (Bad file descriptor)
<...>

Although the reproduction case above has an explicit ulimit -n 1073741816 command, processes run in systemd service context typically have large open file limit by default.

Workaround: enable either dm-event.socket or dm-event.service. Those start dmeventd in foreground (-f), bypassing this daemonization step.