]> git.proxmox.com Git - pve-http-server.git/commit
avoid AnyEvent::AIO to fix CPU spinning if pure-perl lib is installed
authorDominik Csapak <d.csapak@proxmox.com>
Mon, 3 Jul 2023 06:39:55 +0000 (08:39 +0200)
committerThomas Lamprecht <t.lamprecht@proxmox.com>
Mon, 3 Jul 2023 07:34:50 +0000 (09:34 +0200)
commit9a43feac82d2687c1d7bbe12b381c09d1418ac0c
treefe78532652539932ea10ccf739e920c42b2222c9
parent06d037304e45f22b6623a49db3caea583f2a6c26
avoid AnyEvent::AIO to fix CPU spinning if pure-perl lib is installed

when installing AnyEvent::AIO (by the package libanyevent-aio-perl),
the worker forks of our daemons using AnyEvent would consume 100% cpu
cycles while trying to do an epoll_wait which no one read from. It
was not really clear which part of the code set that fd up.

Reading the documentation of the related perl modules, it became
clear that the issue was with AnyEvent::IO. By default this uses
AnyEvent::AIO (if installed) which in turn uses IO::AIO which
explicitly says it uses pthreads and is not really fork compatible
(which we rely heavy upon).

It seems that IO::AIO sets up some fds with epoll in the END handler
of it's library (or earlier, but sends data to it in the END
handler), so that when using 'exit' instead of 'POSIX::_exit' (which
we do in PVE::Daemon) creates the observed behavior.

Interestingly we did not use any of AnyEvent::IO's functionality, so
we can safely remove it. Even if we would have used  it in the past,
without AnyEvent::AIO the IO would not have been async anyway (the
pure perl impl doesn't do async IO). My best guess is that we wanted
to use it, but noticed that we can't, and forgot to remove the use
statement.  (This is indicated by a comment that says aio_load is not
async unless IO::AIO is used)

This only occurs now, since bookworm is the first debian release to
package the library.

if we ever wanted to use AnyEvent::AIO, there are probably two other
ways that could fix it:
* replace our 'exit()' calls with 'POSIX::_exit()', which seems to
  fix it, but other side effects are currently unknown
* use 'IO::AIO::reinit()' after forking, which also seems to fix it,
  but perldoc says it 'is not an operation supported by any
  standards, but happens to work on GNU/LINUX and some newer BSD
  systems'

With this fix, one can safely install 'libanyevent-aio-perl' and
'libperl-languageserver-perl' (the only user of it AFAICS) on a
Proxmox VE or Proxmox Mail Gateway system.

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
src/PVE/APIServer/AnyEvent.pm