Re: Very slow JSF Development Mode on tomee 8.x newer than 8.0.6

Jens Zurawski <[email protected]> Thu, 2 Nov 2023 14:19:19 +0100
Newsgroups gmane.comp.java.openejb.user
Message-ID <[email protected]>
Thank you very much, Vicente. I've only just added a comment with some 
infos.

Let's wait and see how they will react to it.

cu
Jens


Am 02.11.2023 um 13:49 schrieb Vicente Rossello:
> https://bz.apache.org/bugzilla/show_bug.cgi?id=68054
>
> Let's see how it works
>
> On Tue, Oct 31, 2023 at 3:04 PM Vicente Rossello <[email protected]>
> wrote:
>
>> I will try to open a bug. An obvious fix is to only make 1 call to
>> getCannonicalPath for the same file. That would halve the time.
>>
>> After that I guess is tomcat team decission.... maybe emitting a warning
>> that allowLinking=false in windows is very slow for jsf development ... or
>> they may have more ideas
>>
>> El mar, 31 oct 2023, 14:20, Jens Zurawski <[email protected]> escribió:
>>
>>> Ok, after 4 hours of bisecting, checking out, building and testing (I've
>>> needed three bisect sessions, because the first one wasn't successful
>>> due to build failures of some revisions and I had to manually find some
>>> other revisions to bisect) I can definitely identify the commit which
>>> introduces the DevMode performance issue. It is:
>>>
>>> 0325d91 TOMEE-3773 - Update Tomcat to 9.0.50
>>>
>>> I've cross checked with the immediate commit before (277fc71) and it's
>>> clear:
>>> 277fc71 good
>>> 0325d91 bad
>>>
>>> So, indeed, tomcat is the root cause of the problem. But, I don't think
>>> it will be successful to create an issue in tomcat. A far as I can see
>>> in the diffs of tomcat 9.0.48 to 9.0.50, I assume, it already was a bug
>>> fix in /java/org/apache/catalina/webresources/DirResourceSet.java. In
>>> that class new code was inserted to skip symbolic links in
>>> ServletContext.getResourcePaths(), which, I think, is important as a
>>> security measure. Therefore, most likely they will not be willing to
>>> revert that (I wouldn't recommend that, either)
>>>
>>> Long story short: It's not a bug it's a feature ;-)
>>>
>>> I guess, JSF in DevMode is doing a lot more calls to getResourcePaths()
>>> hence suffering from this fix. Because ProdMode is not affected by this
>>> I can live with it. Development environments are special in any case,
>>> and to allow the dev tomcat following symlinks in that environment is
>>> ok, from my pov. Just enable the allowLinking="true" and it works.
>>>
>>> At least my "academic problem" is solved and my "inner monk" is
>>> satisfied and I don't think I will walk down this route any further.
>>>
>>> Many thanks to all of you who have helped me on this issue.
>>>
>>> cu
>>> Jens
>>>
>>> Am 28.10.2023 um 15:17 schrieb Jens Zurawski:
>>>> Yes, this may be one of the next steps here. But, I'm afraid, I have
>>>> not enough info for them right now.
>>>> Neither do I have a small test case to reproduce the problem, nor can
>>>> I point them exact enough to what the problem might be. Also, maybe
>>>> it's only coincidence, and the real problem is somewhere inside
>>>> myfaces. The fact that ProdMode is not affected at all (at least not
>>>> enough to measure any difference) and it only arises in JSF DevMode
>>>> could point in that direction.
>>>>
>>>> So, before I go and open an issue on Tomcat, I want to try to narrow
>>>> down it more. At least to the point where I can say: look, this commit
>>>> in TomEE introduced it. And even better: here is a small test case to
>>>> reproduce it.
>>>>
>>>> cu
>>>> Jens
>>>>
>>>>
>>>> Am 28.10.2023 um 12:55 schrieb Richard Zowalla:
>>>>> Cool. Thanks for going down the rabbit hole ;-)
>>>>>
>>>>> Given that there is a lot of information/benchmarks etc. collected in
>>>>> this thread, what do you think about opening an issue in Tomcat with
>>>>> a reference to this thread?
>>>>>
>>>>> They might take a look.
>>>>>
>>>>> Gruß
>>>>> Richard
>>>>>
>>>>> Am 28. Oktober 2023 12:22:12 MESZ schrieb Jens Zurawski
>>>>> <[email protected]>:
>>>>>> For all who are interested I've made some quick benchmarks, to see
>>>>>> the impact.
>>>>>> I've taken one of my biggest views which is making a small AJAX poll
>>>>>> on the same view every 30s to be able to get some balanced average
>>>>>> values for the response times. The payload of the poll is small
>>>>>> (around 500 to 1000 bytes) but because it's the same view, the
>>>>>> component tree is big.
>>>>>>
>>>>>> Windows (same machine localhost, it is an 8 core Ryzen-7 with 64GB
>>>>>> of RAM and SSD, so the machine is not the limiting factor)
>>>>>> ====================================================
>>>>>> ~ 12000 ms DevMode plain
>>>>>> ~ 600 ms DevMode with <Resources archiveIndexStrategy="bloom"
>>>>>> allowLinking="true"/>
>>>>>> ~ 100 ms ProdMode plain
>>>>>> ~ 100 ms ProdMode with <Resources archiveIndexStrategy="bloom"
>>>>>> allowLinking="true"/>
>>>>>>
>>>>>> Linux (customer site over Internet VPN, it is a 6 core Intel i5 with
>>>>>> 16GB of RAM and SSD)
>>>>>> ====================================================
>>>>>> ~ 700 ms DevMode plain
>>>>>> ~ 350 ms DevMode with <Resources archiveIndexStrategy="bloom"
>>>>>> allowLinking="true"/>
>>>>>> ~ 130 ms ProdMode plain
>>>>>> ~ 130 ms ProdMode with <Resources archiveIndexStrategy="bloom"
>>>>>> allowLinking="true"/>
>>>>>>
>>>>>> No, the 12000 ms is _not_ a typo ;-)
>>>>>>
>>>>>> My conclusions from these figures are:
>>>>>> - ProdMode is not affected by this issue
>>>>>> - On Windows the problem is very significant and renders the DevMode
>>>>>> unusable
>>>>>> - On Linux the problem is not that dramatic, so one can say "well,
>>>>>> it's dev mode, deal with it", but it is also affected in doubling
>>>>>> the response times. Maybe worth enough to also look into this issue
>>>>>> even if one is Linux only.
>>>>>>
>>>>>> cu
>>>>>> Jens
>>>>>>
>>>>>>
>>>>>>
>>>>>> Am 28.10.2023 um 11:43 schrieb Jens Zurawski:
>>>>>>> I can confirm, that this setting also solves the problem of the
>>>>>>> slow dev mode. Thank you for the tip.
>>>>>>>
>>>>>>> So, either this or the canonCache solves this issue for me on my
>>>>>>> development environment. But, of course, both of them should be
>>>>>>> avoided on production systems. The chances that they slip from dev
>>>>>>> to prod by accident may be small (if one is using well known "good"
>>>>>>> development strategies and methods, like staging, testing Q&A,
>>>>>>> reviews, and the like) but still possible.
>>>>>>> And the fact, that it seems to only really matter in JSF dev mode
>>>>>>> is curious at the least.
>>>>>>>
>>>>>>> Am 28.10.2023 um 08:24 schrieb Vicente Rossello:
>>>>>>>> Sorry, that was not correct.
>>>>>>>>
>>>>>>>> The allowLinking is at the resources level. So, in the
>>>>>>>> META-INF/context.xml
>>>>>>>> file:
>>>>>>>>
>>>>>>>> <?xml version="1.0" encoding="UTF-8"?>
>>>>>>>> <Context allowCasualMultipartParsing="true" reloadable="false"
>>>>>>>>
>>> containerSciFilter="org.apache.tomcat.websocket.server.WsSci|org.apache.jasper.servlet.JasperInitializer"
>>>
>>>>>>>>             parallelAnnotationScanning="true"
>>>>>>>>             clearReferencesThreadLocals="false"
>>>>>>>> skipMemoryLeakChecksOnJvmShutdown="true">
>>>>>>>>        <Manager pathname=""/>
>>>>>>>>
>>>>>>>>        <Resources archiveIndexStrategy="bloom" allowLinking="true"/>
>>>>>>>> </Context>
>>>>>>>>
>>>>>>>>
>>>>>>>> BTW, the slowness is something between checking the canonicalPath
>>> too
>>>>>>>> many times and jdk12 that removed those canonCache by default. See
>>>>>>>> https://bugs.openjdk.org/browse/JDK-8258036
>>>>>>>>
>>>>>>>>
>>>