Every method call that's implemented in XS is looked-up at compile-time in that script, even for class methods. That's the sweet spot for :sealed. The only other things I do with it are a few hot methods in Dotiac::DTL::Core, but that's probably not worth the bother.
On Tue, Aug 30, 2022 at 1:14 PM Joe Schaefer <j...@sunstarsys.com> wrote: > Just look through my commit history on this sample Registry script to see > what's involved in getting sealed activated on your scripts. > > https://github.com/SunStarSys/cms/blob/master/enquiry.pl > > On Tue, Aug 30, 2022 at 1:12 PM Joe Schaefer <j...@sunstarsys.com> wrote: > >> It'd be pretty harmless to apply the RegistryCooker.pm patch once we find >> a home for sealed.pm (either in this project or as a stand-alone pragma >> on CPAN). >> Nothing will segfault without consciously using types on your lexical >> object reference declarations; otherwise it's a giant noop. >> >> On Tue, Aug 30, 2022 at 12:53 PM Joe Schaefer <j...@sunstarsys.com> wrote: >> >>> If you really beat the hell out of it thread-wise, sealed.pm v4.0.0 >>> will still segfault, but there's not much more I can do with the code at >>> this point to prevent that. >>> B::Generate doesn't really support what I'm doing here, which is to do >>> surgery on an existing op-tree, instead of just playing around with a >>> user-generated one. >>> There's no good way to remove the target "method_named" op that we're >>> replacing with a gv_op. If that can't be supported using B::OP APIs, then >>> it should >>> be handled from perl itself. The problem is that the politics around >>> the feature were never resolved, because nobody wants to change the default >>> "virtual method" >>> behavior of Perl's OO-runtime-lookups. Now with the new :sealed >>> SUBROUTINE ATTRIBUTE, it's only enabled for people (like us) who want it >>> conditionally applied, >>> just like we do for the :method attribute. >>> >>> On Tue, Aug 30, 2022 at 11:26 AM Joe Schaefer <j...@sunstarsys.com> >>> wrote: >>> >>>> Someday this patch might be interesting: >>>> >>>> diff -u RegistryCooker.pm~ RegistryCooker.pm >>>> --- RegistryCooker.pm~ 2022-08-30 11:10:19.790171019 -0400 >>>> +++ RegistryCooker.pm 2022-08-30 11:12:34.319572045 -0400 >>>> @@ -399,7 +399,8 @@ >>>> my $eval = join '', >>>> 'package ', >>>> $self->{PACKAGE}, ";", >>>> - "sub handler {", >>>> + "use base 'sealed';", >>>> + "sub handler :Sealed {", >>>> "local \$0 = '$script_name';", >>>> $nph, >>>> $shebang, >>>> >>>> On Mon, Aug 29, 2022 at 2:21 PM Joe Schaefer <j...@sunstarsys.com> >>>> wrote: >>>> >>>>> Forgive me for the pent up frustration of having our wonderful >>>>> mod_perl project being completely ignored and abandoned by the Perl >>>>> Steering Committee's frivolous lingustic interests over the years since >>>>> the >>>>> Parrot announcement. >>>>> SaywerX gave us a reason to be hopeful again. Let's see what they do >>>>> with it. >>>>> >>>>> On Mon, Aug 29, 2022 at 1:34 PM Joe Schaefer <j...@sunstarsys.com> >>>>> wrote: >>>>> >>>>>> If the Perl steering committee had any brains left it would have >>>>>> capitalized on the perl 5.34 release and Co announced modperl2 ithread >>>>>> compatibility now available with Perl7’s new release. >>>>>> >>>>>> Instead they are going to kick the tires on the defaults for >>>>>> strictures and warnings until nobody cares any more. >>>>>> >>>>>> Get Outlook for iOS <https://aka.ms/o0ukef> >>>>>> ------------------------------ >>>>>> *From:* Joe Schaefer <j...@sunstarsys.com> >>>>>> *Sent:* Monday, August 29, 2022 1:17:17 PM >>>>>> *To:* mod_perl list <modperl@perl.apache.org> >>>>>> *Subject:* Re: sealed.pm v4.0.0 is out >>>>>> >>>>>> The only reason I’ve been vacillating about glibc/malloc thread >>>>>> safety is because I couldn’t fathom the fact that people still believed >>>>>> modperl isn’t compatible with mpm_event at this point in the Perl7 >>>>>> storyline. The old segfaults of the past that happened in glibc malloc >>>>>> were because Perl was corrupting the heap in some other part of the >>>>>> codebase, and there’s no simple way to track it down without a tool like >>>>>> Valgrind, but we weren’t successful with that effort either. >>>>>> >>>>>> Get Outlook for iOS <https://aka.ms/o0ukef> >>>>>> ------------------------------ >>>>>> *From:* Joe Schaefer <j...@sunstarsys.com> >>>>>> *Sent:* Monday, August 29, 2022 1:08:00 PM >>>>>> *To:* mod_perl list <modperl@perl.apache.org> >>>>>> *Subject:* Re: sealed.pm v4.0.0 is out >>>>>> >>>>>> Religiously avoid setting up per request ithread environment >>>>>> variables. Just use PerlSetEnv in your Webserver config. Everything we >>>>>> did >>>>>> in modperl to support CGI scripts is a train wreck. >>>>>> >>>>>> Get Outlook for iOS <https://aka.ms/o0ukef> >>>>>> ------------------------------ >>>>>> *From:* Joe Schaefer <j...@sunstarsys.com> >>>>>> *Sent:* Monday, August 29, 2022 1:04:03 PM >>>>>> *To:* mod_perl list <modperl@perl.apache.org> >>>>>> *Subject:* Re: sealed.pm v4.0.0 is out >>>>>> >>>>>> Look into reducing the scope of your interpreters down from the >>>>>> request level to the handler level. If all you are doing is running >>>>>> registry scripts, you will get even better scaling out of just a few >>>>>> ithreads per worker process. >>>>>> >>>>>> Get Outlook for iOS <https://aka.ms/o0ukef> >>>>>> ------------------------------ >>>>>> *From:* Joe Schaefer <j...@sunstarsys.com> >>>>>> *Sent:* Monday, August 29, 2022 12:57:14 PM >>>>>> *To:* mod_perl list <modperl@perl.apache.org> >>>>>> *Subject:* Re: sealed.pm v4.0.0 is out >>>>>> >>>>>> The only impact to your work with modperl is that you will need to >>>>>> assess the ithread-safety of your dependent XS-based modules. For >>>>>> example, >>>>>> use a JSON::XS thread safe alternative- there are several. >>>>>> >>>>>> Get Outlook for iOS <https://aka.ms/o0ukef> >>>>>> ------------------------------ >>>>>> *From:* Joe Schaefer <j...@sunstarsys.com> >>>>>> *Sent:* Monday, August 29, 2022 12:49:22 PM >>>>>> *To:* mod_perl list <modperl@perl.apache.org> >>>>>> *Subject:* Re: sealed.pm v4.0.0 is out >>>>>> >>>>>> There is a mountain of awful advice floating around about ithreads, >>>>>> including pretty much everything going on in Raku around adopting the >>>>>> node.js model instead. It is safe to ignore all that now that SawyerX >>>>>> spit >>>>>> polished all of the perl5 internals. >>>>>> >>>>>> Get Outlook for iOS <https://aka.ms/o0ukef> >>>>>> ------------------------------ >>>>>> *From:* Joe Schaefer <j...@sunstarsys.com> >>>>>> *Sent:* Monday, August 29, 2022 12:40:43 PM >>>>>> *To:* mod_perl list <modperl@perl.apache.org> >>>>>> *Subject:* Re: sealed.pm v4.0.0 is out >>>>>> >>>>>> Many of the performance hacks we’ve encouraged over the years, eg >>>>>> around HTTPD’s lingering close effect, are obsoleted with ithreads. >>>>>> Unless >>>>>> you send flush buckets down the output filter stack yourself, the >>>>>> “response >>>>>> handler” phase exits long before the “connection handler” starts making >>>>>> non >>>>>> blocking socket system calls. So you need an order of magnitude fewer >>>>>> ithreads than you do prefork children in a multitier arch. >>>>>> >>>>>> Get Outlook for iOS <https://aka.ms/o0ukef> >>>>>> ------------------------------ >>>>>> *From:* Joe Schaefer <j...@sunstarsys.com> >>>>>> *Sent:* Sunday, August 28, 2022 11:09:14 AM >>>>>> *To:* mod_perl list <modperl@perl.apache.org> >>>>>> *Subject:* Re: sealed.pm v4.0.0 is out >>>>>> >>>>>> Benchmark ran on my 2021 Dell Precision Laptop w/ 8 cores + HT (so >>>>>> 16vCPU) and Ubuntu 22.04 inside WSL2. Never topped 50% avg CPU, and >>>>>> almost >>>>>> all of the CPU was in userland (not system calls). >>>>>> >>>>>> On Sat, Aug 27, 2022 at 11:42 AM <j...@sunstarsys.com> wrote: >>>>>> >>>>>> See https://sunstarsys.com/essays/perl7-sealed-lexicals. For the >>>>>> full effect, you will need to build B::Generate with this patched version >>>>>> instead: https://github.com/SunStarSys/cms/blob/master/Generate.xs >>>>>> >>>>>> >>>>>> >>>>>> Sample mod_perl config + benchmarks: >>>>>> >>>>>> >>>>>> >>>>>> <IfModule mpm_event_module> >>>>>> >>>>>> StartServers 2 >>>>>> >>>>>> MinSpareThreads 100 >>>>>> >>>>>> MaxSpareThreads 500 >>>>>> >>>>>> ThreadLimit 1000 >>>>>> >>>>>> ThreadsPerChild 100 >>>>>> >>>>>> MaxRequestWorkers 1000000 >>>>>> >>>>>> MaxConnectionsPerChild 0 >>>>>> >>>>>> </IfModule> >>>>>> >>>>>> >>>>>> >>>>>> <IfModule mod_perl.c> >>>>>> >>>>>> PerlSwitches -T -I/home/joesuf4/src/cms/lib >>>>>> >>>>>> PerlInterpStart 2 >>>>>> >>>>>> PerlInterpMax 4 >>>>>> >>>>>> PerlInterpMinSpare 1 >>>>>> >>>>>> PerlInterpMaxSpare 4 >>>>>> >>>>>> PerlInterpMaxRequests 1000000 >>>>>> >>>>>> PerlOptions +GlobalRequest >>>>>> >>>>>> >>>>>> >>>>>> <Directory /home/joesuf4/src/cms> >>>>>> >>>>>> Require all granted >>>>>> >>>>>> AddHandler perl-script .pl >>>>>> >>>>>> PerlResponseHandler ModPerl::Registry >>>>>> >>>>>> Options +ExecCGI >>>>>> >>>>>> </Directory> >>>>>> >>>>>> >>>>>> >>>>>> <Directory /home/joesuf4/src/trunk/content> >>>>>> >>>>>> Require all granted >>>>>> >>>>>> </Directory> >>>>>> >>>>>> >>>>>> >>>>>> <VirtualHost *:80> >>>>>> >>>>>> ServerName localhost >>>>>> >>>>>> DocumentRoot /home/joesuf4/src/trunk/content >>>>>> >>>>>> Alias /perl-script /home/joesuf4/src/cms >>>>>> >>>>>> </VirtualHost> >>>>>> >>>>>> >>>>>> >>>>>> </IfModule> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> ab -n 10000 -c 1000 http://localhost/perl-script/enquiry.pl >>>>>> >>>>>> This is ApacheBench, Version 2.3 <$Revision: 1879490 $> >>>>>> >>>>>> Copyright 1996 Adam Twiss, Zeus Technology Ltd, >>>>>> http://www.zeustech.net/ >>>>>> >>>>>> Licensed to The Apache Software Foundation, http://www.apache.org/ >>>>>> >>>>>> >>>>>> >>>>>> Benchmarking localhost (be patient) >>>>>> >>>>>> Completed 1000 requests >>>>>> >>>>>> Completed 2000 requests >>>>>> >>>>>> Completed 3000 requests >>>>>> >>>>>> Completed 4000 requests >>>>>> >>>>>> Completed 5000 requests >>>>>> >>>>>> Completed 6000 requests >>>>>> >>>>>> Completed 7000 requests >>>>>> >>>>>> Completed 8000 requests >>>>>> >>>>>> Completed 9000 requests >>>>>> >>>>>> Completed 10000 requests >>>>>> >>>>>> Finished 10000 requests >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> Server Software: Apache/2.4.52 >>>>>> >>>>>> Server Hostname: localhost >>>>>> >>>>>> Server Port: 80 >>>>>> >>>>>> >>>>>> >>>>>> Document Path: /perl-script/enquiry.pl >>>>>> >>>>>> Document Length: 1329 bytes >>>>>> >>>>>> >>>>>> >>>>>> Concurrency Level: 1000 >>>>>> >>>>>> Time taken for tests: 1.218 seconds >>>>>> >>>>>> Complete requests: 10000 >>>>>> >>>>>> Failed requests: 0 >>>>>> >>>>>> Total transferred: 15010000 bytes >>>>>> >>>>>> HTML transferred: 13290000 bytes >>>>>> >>>>>> Requests per second: 8207.94 [#/sec] (mean) >>>>>> >>>>>> Time per request: 121.833 [ms] (mean) >>>>>> >>>>>> Time per request: 0.122 [ms] (mean, across all concurrent >>>>>> requests) >>>>>> >>>>>> Transfer rate: 12031.37 [Kbytes/sec] received >>>>>> >>>>>> >>>>>> >>>>>> Connection Times (ms) >>>>>> >>>>>> min mean[+/-sd] median max >>>>>> >>>>>> Connect: 0 2 6.2 0 24 >>>>>> >>>>>> Processing: 4 93 49.6 82 458 >>>>>> >>>>>> Waiting: 1 80 44.5 71 455 >>>>>> >>>>>> Total: 17 95 49.5 84 458 >>>>>> >>>>>> >>>>>> >>>>>> Percentage of the requests served within a certain time (ms) >>>>>> >>>>>> 50% 84 >>>>>> >>>>>> 66% 100 >>>>>> >>>>>> 75% 112 >>>>>> >>>>>> 80% 120 >>>>>> >>>>>> 90% 147 >>>>>> >>>>>> 95% 173 >>>>>> >>>>>> 98% 233 >>>>>> >>>>>> 99% 318 >>>>>> >>>>>> 100% 458 (longest request) >>>>>> >>>>>> >>>>>> >>>>>> % pgrep -f apache2 | xargs -n1 ps -uwww >>>>>> >>>>>> USER PID %CPU %MEM VSZ RSS TTY STAT START TIME >>>>>> COMMAND >>>>>> >>>>>> root 442827 0.0 0.1 18180 14244 ? Ss 11:27 0:00 >>>>>> /usr/sbin/apache2 -k start >>>>>> >>>>>> USER PID %CPU %MEM VSZ RSS TTY STAT START TIME >>>>>> COMMAND >>>>>> >>>>>> www-data 446387 1.7 1.5 7549352 129692 ? Sl 11:28 0:12 >>>>>> /usr/sbin/apache2 -k start >>>>>> >>>>>> USER PID %CPU %MEM VSZ RSS TTY STAT START TIME >>>>>> COMMAND >>>>>> >>>>>> www-data 451006 15.2 1.5 7483708 128468 ? Sl 11:39 0:10 >>>>>> /usr/sbin/apache2 -k start >>>>>> >>>>>> USER PID %CPU %MEM VSZ RSS TTY STAT START TIME >>>>>> COMMAND >>>>>> >>>>>> www-data 451317 11.7 1.4 7483772 119836 ? Sl 11:39 0:07 >>>>>> /usr/sbin/apache2 -k start >>>>>> >>>>>> USER PID %CPU %MEM VSZ RSS TTY STAT START TIME >>>>>> COMMAND >>>>>> >>>>>> www-data 451629 6.4 1.3 7483804 113012 ? Sl 11:39 0:03 >>>>>> /usr/sbin/apache2 -k start >>>>>> >>>>>> USER PID %CPU %MEM VSZ RSS TTY STAT START TIME >>>>>> COMMAND >>>>>> >>>>>> www-data 451929 1.1 1.4 7483816 116668 ? Sl 11:39 0:00 >>>>>> /usr/sbin/apache2 -k start >>>>>> >>>>>> >>>>>> >>>>>> -- >>>>>> Joe Schaefer, Ph.D. >>>>>> We only build what you need built. >>>>>> <j...@sunstarsys.com> >>>>>> 954.253.3732 <//954.253.3732> >>>>>> >>>>>> >>>>>> >>>>> >>>>> -- >>>>> Joe Schaefer, Ph.D. >>>>> We only build what you need built. >>>>> <j...@sunstarsys.com> >>>>> 954.253.3732 <//954.253.3732> >>>>> >>>>> >>>>> >>>> >>>> -- >>>> Joe Schaefer, Ph.D. >>>> We only build what you need built. >>>> <j...@sunstarsys.com> >>>> 954.253.3732 <//954.253.3732> >>>> >>>> >>>> >>> >>> -- >>> Joe Schaefer, Ph.D. >>> We only build what you need built. >>> <j...@sunstarsys.com> >>> 954.253.3732 <//954.253.3732> >>> >>> >>> >> >> -- >> Joe Schaefer, Ph.D. >> We only build what you need built. >> <j...@sunstarsys.com> >> 954.253.3732 <//954.253.3732> >> >> >> > > -- > Joe Schaefer, Ph.D. > We only build what you need built. > <j...@sunstarsys.com> > 954.253.3732 <//954.253.3732> > > > -- Joe Schaefer, Ph.D. We only build what you need built. <j...@sunstarsys.com> 954.253.3732 <//954.253.3732>