Mod_perl won't work with mpm_event and threads unless you compile Perl with 
specific options and avoid doing certain things which can cause segmentation 
faults in Perl. You can't just use an "off-the-shelf" version of Perl. Search 
the mod_perl mailing list archives for posts by Joe Schaefer going back over 
the past ~3 years for clues on how to do that and check out his sealed.pm 
module. I haven't done it or used it personally. It sounds non-trivial to set 
up properly. If you try going down this route, please report back with your 
findings.

According to conventional wisdom, mpm_prefork works better (or at least easier) 
for mod_perl and is often recommended for mod_perl. Most mod_perl developers 
avoid using threads entirely because the combination of mod_perl and threads is 
so problematic. Mpm_prefork is less efficient than mpm_event by most accounts, 
of course. You would certainly need to configure Apache to have way more than 4 
servers with mpm_prefork.

Good luck,
Ed

> On Oct 23, 2025, at 11:42 AM, Steven Haigh via modperl 
> <[email protected]> wrote:
> I'm writing a web UI in perl + mod_perl that sends an SSE stream to the 
> browser full of JSON formatted updates etc. The browser then renders that all 
> via Javascript to the user.
> 
> I've noticed that if I reload the page multiple times, or just navigate away, 
> when there's ~6 existing SSE streams, apache will stop accepting new 
> connections completely.
> 
> I've hunted around via the normal search engines, turned up very little - and 
> out of desperation, asked ChatGPT's Codex...
> 
> It suggested the following apache config:
> 
> LoadModule mpm_event_module modules/mod_mpm_event.so
> # Tune event MPM so we have headroom for long-lived SSE connections
> <IfModule mpm_event_module>
>    ServerLimit              4
>    StartServers             2
>    MinSpareThreads         50
>    MaxSpareThreads        150
>    ThreadsPerChild         64
>    MaxRequestWorkers      256
>    MaxConnectionsPerChild   0
> </IfModule>
> 
> ## Load mod_perl
> LoadModule perl_module /usr/lib/apache2/modules/mod_perl.so
> PerlModule Apache2::Reload
> PerlInitHandler Apache2::Reload
> PerlOptions +Parent
> PerlSwitches -Mlib=/usr/local/apache2/htdocs-includes
> PerlInterpStart      20
> PerlInterpMinSpare   10
> PerlInterpMaxSpare   20
> PerlInterpMax        80
> 
> Even with this however, when I hit 6 x concurrent SSE streams being served, 
> Apache grinds to a halt and doesn't even load the /server-status/ page for 
> troubleshooting.
> 
> Once some of the 'dead' SSE streams fail and those connections terminated, 
> apache starts behaving again.
> 
> Has anyone come across this before and maybe knows a bit of additional 
> knowledge as to why this is, and what I can do about it?

Reply via email to