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.