Hello

i have already encounter this kind of problem, we solved it by using a
decorator to cache asset access with something like, it was for Tapestry
5.0.18 :

public class AssetSourceCacheDecorator implements AssetSource {

private final Map<MultiKey, *Asset*> cache =
CollectionFactory.newConcurrentMap();

private final AssetSource delegate;

public AssetSourceCacheDecorator(AssetSource delegate) { this.delegate =
delegate; }

public *Asset* getAsset(Resource baseResource, String path, Locale locale) {


MultiKey key = new MultiKey(path, locale); if (cache.get(key) == null) { *
Asset* *asset* = delegate.getAsset(baseResource, path, locale);
cache.put(key, *asset*); return *asset*; }

return cache.get(key); }

public *Asset* getClasspathAsset(String path) { return
this.getClasspathAsset(path, null); }

public *Asset* getClasspathAsset(String path, Locale locale) { return
this.getAsset(null, path, locale); }

}


Regards,

Christophe.


2009/10/29 Christiansen Merel <c.me...@otakeh.com>

> Hello out there,
>
> We're running a quite busy website with tapestry 5.0.18 and we're
> hitting a performance problem with the ClasspathResource class.
>
> We're using classpath asset and none of them is localised. For each
> hit on a page using a classpath asset, we end having 2 missed queries
> on the ClassLoader for potential localized version of the asset. It
> does not really slow down the application throughput but we end with
> an __huge__ CPU consumption.
>
> The javacore stack shows numerous threads scanning jar files:
>
> 3XMTHREADINFO      "[ACTIVE] ExecuteThread: '2' for queue:
> 'weblogic.kernel.Default (self-tuning)'" (TID:0x3700E400,
> sys_thread_t:0x3393D030, state:B, native ID:0x009AB0B3) prio=5
> 4XESTACKTRACE          at
> java/util/zip/ZipFile.getEntry(ZipFile.java:287(Compiled Code))
> 4XESTACKTRACE          at
> java/util/jar/JarFile.getEntry(JarFile.java:283(Compiled Code))
> 4XESTACKTRACE          at
> java/util/jar/JarFile.getJarEntry(JarFile.java:266(Compiled Code))
> 4XESTACKTRACE          at
> sun/misc/URLClassPath$JarLoader.getResource(URLClassPath.java:949(Compiled
> Code))
> 4XESTACKTRACE          at
> sun/misc/URLClassPath$JarLoader.findResource(URLClassPath.java:938(Compiled
> Code))
> 4XESTACKTRACE          at
> sun/misc/URLClassPath.findResource(URLClassPath.java:299(Compiled
> Code))
> 4XESTACKTRACE          at
> java/net/URLClassLoader$3.run(URLClassLoader.java:784(Compiled Code))
> 4XESTACKTRACE          at
> java/security/AccessController.doPrivileged(AccessController.java:219)
> 4XESTACKTRACE          at
> java/net/URLClassLoader.findResource(URLClassLoader.java:781(Compiled
> Code))
> 4XESTACKTRACE          at
> java/lang/ClassLoader.getResource(ClassLoader.java:420(Compiled Code))
> 4XESTACKTRACE          at
> java/lang/ClassLoader.getResource(ClassLoader.java:415(Compiled Code))
> 4XESTACKTRACE          at
> java/lang/ClassLoader.getResource(ClassLoader.java:415(Compiled Code))
> 4XESTACKTRACE          at
>
> weblogic/utils/classloaders/GenericClassLoader.getResourceInternal(GenericClassLoader.java:170(Compiled
> Code))
> 4XESTACKTRACE          at
>
> weblogic/utils/classloaders/GenericClassLoader.getResource(GenericClassLoader.java:187(Compiled
> Code))
> 4XESTACKTRACE          at
>
> weblogic/utils/classloaders/FilteringClassLoader.getResourceInternal(FilteringClassLoader.java:89(Compiled
> Code))
> 4XESTACKTRACE          at
>
> weblogic/utils/classloaders/GenericClassLoader.getResourceInternal(GenericClassLoader.java:155(Compiled
> Code))
> 4XESTACKTRACE          at
>
> weblogic/utils/classloaders/GenericClassLoader.getResource(GenericClassLoader.java:187(Compiled
> Code))
> 4XESTACKTRACE          at
> java/lang/ClassLoader.getResource(ClassLoader.java:415(Compiled Code))
> 4XESTACKTRACE          at
>
> weblogic/utils/classloaders/GenericClassLoader.getResource(GenericClassLoader.java:190(Compiled
> Code))
> 4XESTACKTRACE          at
>
> weblogic/utils/classloaders/ChangeAwareClassLoader.getResource(ChangeAwareClassLoader.java:118(Compiled
> Code))
> 4XESTACKTRACE          at
>
> org/apache/tapestry5/ioc/internal/util/ClasspathResource.toURL(ClasspathResource.java:59(Compiled
> Code))
> 4XESTACKTRACE          at
>
> org/apache/tapestry5/ioc/internal/util/AbstractResource.exists(AbstractResource.java:137(Compiled
> Code))
> 4XESTACKTRACE          at
>
> org/apache/tapestry5/ioc/internal/util/AbstractResource.forLocale(AbstractResource.java:100(Compiled
> Code))
> 4XESTACKTRACE          at
>
> org/apache/tapestry5/internal/services/AssetSourceImpl.findRelativeAsset(AssetSourceImpl.java:99(Compiled
> Code))
> 4XESTACKTRACE          at
>
> org/apache/tapestry5/internal/services/AssetSourceImpl.getAsset(AssetSourceImpl.java:93(Compiled
> Code))
> 4XESTACKTRACE          at
> $AssetSource_124955c0e4c.getAsset($AssetSource_124955c0e4c.java(Compiled
> Code))
> 4XESTACKTRACE          at
>
> org/apache/tapestry5/internal/transform/AbstractIncludeAssetWorker$1.perform(AbstractIncludeAssetWorker.java:79(Compiled
> Code))
> 4XESTACKTRACE          at
>
> fr/poleemploi/d2i/tapestry/navigation/unifiee/components/Bandeau.setupRender(Bandeau.java(Compiled
> Code))
>
> The stack comes from weblogic/aix run but the problem is the same on
> other platforms as well.
>
> Does anyone has ever experienced such problems ?
>
> The performance penalty seems to be located in the
> AbstractResource.forLocale() method, especially the potential.exists()
> call. This part of code haven't evolved with the 5.1.x version.
>
> Does anybody have any idea on how to get around this problem ?
>
> Thanks in advance
>
> --
> ChristianZen
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org
> For additional commands, e-mail: users-h...@tapestry.apache.org
>
>

Reply via email to