Algo nuevo que hacer … nuevos tiempos, otras cosas

23Ene/087

Transformaciones XSL (III): No es oro todo lo que reluce.

Una vez escuche a alguien decir, que todo proyecto informático que se precie de cierta complejidad "tiene gato encerrado", está esperándote y cuando menos te lo esperas .... salta a por ti :-(

Pues bien, el uso de Translets no es una excepción.

El problema

En una situación de producción con elevada concurrencia (el caso aquí descrito se produjo en un entorno real cuando más de 2.000 usuarios estaban conectados de forma simultánea), según de que forma se haga uso de las transformaciones proporcionadas con XALAN se produce un colapso del sistema, que lleva la CPU de las máquinas al 100% de uso y estoy hablando de equipos dimensionados para alcanzar cargas muy superiores, del orden de 10 ~ 20.000 usuarios concurrentes.

El diagnostico

Después de laboriosos estudios del entorno de producción y de muchas horas de "laboratorio" se logró reproducir la incidencia. Para ello , simulando al máximo posible la situación real, se realizaron de forma concurrente un gran número de transformaciones XSL, que a su vez hiciesen uso de otros includes XSL. Veamos el siguiente fragmento de código:

threadInfo.thread = (new Thread() {
	public void run() {
		try {
			xslt.doTransform(chooseRandomXSL(), xmlFileName, outFileName);
		} catch (IOException e) {
			e.printStackTrace();
		}
    }
});
 
threadInfo.thread.start();

Cuando el número de transformaciones XSLT es muy elevado (durante las pruebas de laboratorio a partir de un valor de 150), se produce una progresiva situación de colapso similar a la vista en el entorno de producción (ver siguientes imágenes).

Colapso transformación concurrente de XSL Colapso de threads durante la transformacion XSL

Durante el estudio de esta situación se obtuvieron los siguientes datos:

  • Los bloqueos se producen cuando coinciden transformaciones XSL que hacen uso un mismo fichero de include. En la primera de las dos imágenes mostradas se observa como los ficheros quedan abiertos de forma indefinida.
  • En determinadas ocasiones (como se ve en la segunda de las imágenes) se sigue produciendo el bloqueo aun cuando todos los ficheros hayan ya cerrados.
  • En los casos en los que la prueba llegó a finalizar (cuando el nivel concurrencia simulado no había alcanzado el umbral), a medida que este valor aumentaba, el tiempo empleado durante las transformaciones se volvía inaceptable.
  • Esta situación sólo se produce si el documento XSL no ha sido compilado anteriormente. Si los Translets ya han sido generados de manera previa a la ejecución, la concurrencia de transformaciones simultáneas tiene por único límite la capacidad del equipo en el que se realiza: En laboratorio, y un equipo muy modesto en cuanto a prestaciones se refiere, se han logrado ejecutar más de 700 transformaciones de manera simultánea.

A continuación, con el objetivo de confirmar hasta qué punto el uso de includes es un factor determinante para que se produzcan las situaciones de bloqueo descritas, se realizó una versión de las plantillas XSL que no usasen includes pero que realizaran idéntica función.

El resultado de esta prueba fue que, si bien el número de compilaciones simultáneas debe ser mayor (fue necesario incrementar el valor hasta 400, frente a las 150 anteriores), el problema se acaba reproduciendo igualmente.

La conclusión

El compilador de XALAN tiene un grave problema de rendimiento cuando concurren múltiples transformaciones XSL que necesitan realizar la compilación de Translets. Esta situación se agrava aún más, cuando se hacen uso de includes en los documentos XSL.

La solución

Según se ha visto hasta el momento, para resolver las situaciones descritas existen varias soluciones posibles:

  1. Haciendo uso de las capacidades que XALAN proporciona, es factible compilar todas las XSL de manera previa a la ejecución de la aplicación.
  2. Si se limitan el número de compilaciones simultaneas que XALAN realiza, el problema también desaparece.

Si bien la opción primera soluciona el problema por sí sola, se ha optado por implantar la segunda acción y poder garantizar de esta manera una total escalabilidad y estabilidad del sistema.

Veamos a continuación un extracto de la solución aplicada:

 
private static HashMap templatesCache = new HashMap();
 
public Templates getTemplates(String xslFile)
		throws TransformerConfigurationException {
	Templates templates = null;
 
	// El acceso al HashMap no está sincronizado, esta región de exclusión
	// mutua garantiza el mejor rendimiento y continua siendo "thread safe"
	templates = (Templates) templatesCache.get(xslFile);
	synchronized (templatesCache) {
		if (templates == null) {
			templates = super.getTemplates(xslFile);
			templatesCache.put(xslFile, templates);
		}
	}
	return templates;
}

Esta manera de gestionar los procesos de transformación XSL limita el número de compilaciones que el sistema realiza a la vez que garantiza un acceso inmediato la transformación XSL dado que la plantilla se carga en memoria una sola vez, las transformaciones se realizan de una forma mucho más eficiente.

Por el contrario, si bien se consideran mínimas en su impacto, hay que reseñar que este enfoque tiene dos "debilidades" principales:

  • De igual manera a como se hace con las páginas JSP, el primer acceso que se haga a una plantilla XSL, será algo más lento (< 1 segundo) al ser necesario realizar el proceso de compilación.
  • Para lograr una mayor eficiencia del sistema se cargan en memoria todas las transformaciones XSL a medida que se van usando.
  • email
  • Facebook
  • Twitter
  • BarraPunto
  • del.icio.us
  • Meneame
Imprimir este artículo Imprimir este artículo
Comentarios (7) Trackbacks (0)
  1. Me encanta el código fuente que has puesto de “getTemplates(String xslFile)”, sin duda hecho por la mano de un genio…

    :-P

    Un abrazo, monstruo!

  2. Soy un mero aprendiz, me limité a copiar lo que otro hizo :-) …¡maestro!

  3. La verdad que parece super . soy nuevo con java, con xsl y en el blog…intento reproducirlo y tengo serios problemas en mi conversión : consumo de procesador y lentitud.. tengo que intentar convertir a razon de 50.000 documentos por hora…se puede conceguir alguna ayuda en el blog ? Gracias amigos

  4. Zamba, lo cierto es que el objetivo de 50.000 documentos hora es muy ambicioso: ¡¡¡¡14 transformaciones por segundo!!!

    Para poderte ayudar necesitaría algún dato mas:

    - Tamaño de los XML a transformar
    - Tamaño de la XSL a usar
    - ¿Se trata de un flujo constante de peticiones o por el contrario tienes picos de mas demanda?

    Un saludo

  5. Cmaj, primero y principal gracias por responderme, eres muy amable…te cuento estoy metido en un embrollo hace mas de 20 dias que estoy con esto y no puedo avanzar un apice….
    primero intente compilar el xsl como dijistes y me tira el error (sundesasl sgcv10 dsgcedes) /sgcv10/software/OpenCM/server/Templates> java org.a
    pache.xalan.xslt.Process -in 45484_4.0.xml -xsl 91.xsl -xsltc

    (Location of error unknown)XSLT Error (java.lang.IllegalAccessError): class org.apache.xml.dtm.ref.sax2dtm.SAX2DTM2.AncestorIterator cannot access its superclas
    s org.apache.xml.dtm.ref.DTMDefaultBaseIterators$InternalAxisIteratorBase

    a continuacion intento incluir parte de tu codigo en lo que tengo, pero nada pasa….
    la xsl a usar siempre es la misma y su tamaño es de 64 k y los xml varian 17-18 k ..
    el flujo de peticiones es constante seria en un proceso tipo batch…
    cualquier ayuda seria genial..mil gracias amigo

  6. Curioso error :-) aunque supongo que tu estas hasta el gorro de él.

    ¿Existe la posibilidad de que hagas una pequeña prueba de concepto reproduciendo el error en el menor trozo de código posible y me la hagas llegar?

    No te prometo nada, pero al menos lo intentaré. Envíamelo a xsltdoctor@gmail.com

    Por cierto, no se si será relevante, pero ¿Que entorno usas? SO, JDK, versión Xalan, etc.

  7. Por cierto, en la web de XALAN (http://xml.apache.org/xalan-j/faq.html) he encontrado este comentario:

    jakarta-tomcat 4.1.* is packed with an old version of xercesImpl.jar. Based on the Endorsed Standards Override Mechanism, you should replace it with the newer xercesImpl.jar. You should add a newer xalan.jar and serializer.jar to Tomcat as well. Read the FAQ about Issues running Xalan-Java on JDK/JRE 1.4 or higher. Place the xalan.jar, serializer.jar, and xercesImpl.jar in the \common\endorsed directory, where is where the Tomcat application server is installed.

    ¿Es posible que te pase algo parecido, que tengas dos Xalan en el CLASSPATH?

    Salu2


Leave a comment

(required)

Aún no hay trackbacks.

  • Buy Cheap levitra or viagra Now Pharmacy Store. Pharmacy At The Best Price!
  • Buy Cheapest cheap viagra without prescription Online Best Online. Online Medical Shop.
  • Buy Cheapest generic cialis price Online Free Viagra Pills! Top Online Pharmacy.
  • Buy Cheap levitra experiences Online Online Medical Shop. Top Online Pharmacy.
  • Buy Cheap cialis usa pharmacy Now No Prescription Needed. Pharmacy Store.
  • Buy Cheap levitra on line Now No Prescription Needed. Best Drugstore.
  • Buy Cheap buy viagra in england Now 24/Internet)(safe Pharmacy. Best Internet.
  • Buy Cheap what is viagra Now Guaranteed Shipping. Online Prices For what is viagra!
  • Buy Cheap young men cialis Now Order Cheap Meds Without Rx. Low Prices.
  • mail order viagra Online Without Prescription Pharmacy Store. Low Prices.
  • Buy Cheapest generic cialis shipped overnight Now Low Prices. Internet Prices For generic cialis shipped overnight!
  • Buy Cheapest cost viagra cialis Now Internet Prices For cost viagra cialis! Best Internet.
  • Buy Cheap viagra cialis on line Now Pharmacy At The Best Price! Best Prices.
  • Buy Cheapest cialis viagra levitra Now Cheap Pharmacy Online. Best Drugstore.
  • Buy Cheapest take levitra Now Order Cheap Meds Without Rx. Best Internet.
  • Buy Cheap lowest cost for cialis 20mm tablets Now Cheap Pharmacy Online. Guaranteed Shipping.
  • Buying Cheapest viagra for woman information. Mexican Pharmacy, Best Prices. Best Prices.
  • viagra australia Online Without Prescription Best Internet. Pharmacy Store.
  • Buying Cheap cialis in stock. Mexican Pharmacy, Best Prices. Pharmacy Store.
  • Buy viagra ejaculation Without Prescription Doctor. Best Online. Low Prices.
  • Buy Cheapest fast shipping viagra Online Guaranteed Shipping. Best Online.
  • Buy Cheap buy levitra on line Online Pharmacy Store. Special Prices For buy levitra on line!
  • Buy Cheap cialis magic Online Free Viagra Pills! Cheap Pharmacy Online.
  • Buy Cheap cheap viagra uk Online Cheap Online Pharmacy. Online Medical Shop.
  • Buy Cheapest buy vardenafil levitra Now Cheap Online Pharmacy. Best Drugstore.
  • Buy Cheapest cialis product Now Online Medical Shop. 24/Online Pharmacy.
  • Buy Cheap how viagra works Online The Largest Internet Pharmacy. Low Prices.
  • Buy Cheapest cialis 36 hours Online WorldWide Shipping. Best Internet.
  • Buy Cheapest viagra online shop Online 24/Online Pharmacy. Best Online.
  • Buy Cheap cialis mail order Now 24/Internet)(safe Pharmacy. Best Prices.
  • Buy Cheapest best levitra price Online Guaranteed Shipping. Free Viagra Pills!
  • Buy Cheapest lowest price for brand cialis Now Best Drugstore. Top Online Pharmacy.
  • Buy Cheapest cialis herbal Now Online Medical Shop. Cheap Pharmacy Online.
  • Buy Cheap natural herbal substitute for viagra Online Free Viagra Pills! Guaranteed Shipping.
  • Buy Cheap buy generic levitra Now 100% Satisfaction Guaranteed. Best Online.
  • Buy Cheap fda cialis Online Best Online. Discount Online Pharmacy.
  • Buy Cheap free samples viagra Now Cheap Prescription Drugs. WorldWide Shipping.
  • Buy Cheap india viagra Now Drugs, Health And Beauty. Pharmacy Store.
  • Buy Cheapest cialis testimonials Online Low Prices. Cheap Pharmacy Online.
  • Buy Cheap natural substitute for viagra Now Best Online. Cheap Meds Without Prescription.
  • Buy Cheap viagra propecia pain relief headache Now Online Medical Shop. Buy Medications Online.
  • Buy Cheap cialis brands Now Cheap Meds Without Prescription. Low Prices.
  • Buy Cheap cheap cialis find Online Cheap Online Pharmacy. Guaranteed Shipping.
  • Buy Cheapest cialis dosing Online Top Online Pharmacy. Best Drugstore.
  • Buy Cheapest cialis drug Now Best Prices. 24/Internet)(safe Pharmacy.
  • Buy Cheap cialis faq Now Pharmacy At The Best Price! Best Online.
  • Buy Cheap cialis soft tab description Now 24/Online Pharmacy. Buy Medications Online.
  • Buy Cheap order cheap viagra fas Now Pharmacy Store. Top Online Pharmacy Supplier.
  • Buy Cheapest buy cialis cheap Online Guaranteed Shipping. WorldWide Shipping.
  • Buy Cheapest cialis discounts Online Cheap Prescription Drugs. Best Online.
  • Buy Cheap how long does viagra last Online WorldWide Shipping. Buy Medications Online.
  • Buy Cheapest cialis in uk Online Free Viagra Pills! Best Internet.
  • Buy Cheap cheap generic viagra Now Online Medical Shop. Free Viagra Pills!
  • Buy Cheap ejaculation viagra Online Cheap Prescription Drugs. Best Internet.
  • viagra propecia buy online Online Without Prescription WorldWide Shipping. Best Online.
  • Buy Cheap viagra switzerland Now Internet Prices For viagra switzerland! Best Drugstore.
  • Buy Cheap viagra cialic levitra Online 24/Online Pharmacy. WorldWide Shipping.
  • Buy Cheapest sales cialis Online Best Internet. Buy Medications Online.
  • Buy Cheap phentermine viagra Now Top Online Pharmacy. Online Prices For phentermine viagra!
  • Buy Cheap cialis sales Now Best Prices. Special Prices For cialis sales!
  • Buy Cheap cost levitra low Online Low Prices. 100% Satisfaction Guaranteed.
  • Buy Cheap buy cialis without prescription Online Best Online. Buy Medications Online.
  • Buy Cheapest order super viagra Now Drugs, Health And Beauty. Low Prices.
  • Buy Cheap how to get levitra Online 24/Internet)(safe Pharmacy. Low Prices.
  • Buy Cheap buy cheap generic viagra Now Internet Prices For buy cheap generic viagra! Best Internet.
  • Buy Cheap internet viagra pharmacy Now 24/Online Pharmacy. Top Online Pharmacy.
  • Buying Cheapest cheap generic viagra. Offshore Pharmacy, Best Prices. Low Prices.
  • Buy Cheapest viagra sales Now Discount Online Pharmacy. Best Internet.
  • Buy Cheap special offers dose low viagra cialis Now Best Internet. Pharmacy At The Best Price!
  • Buy Cheapest viagra propecia buy online Online Get FDA Approved Prescription Medicines.
  • Buying Cheapest levitra drug classification. Offshore Pharmacy, Best Prices. Low Prices.
  • Buy Cheap cheapest viagra in uk Online Cheap Online Pharmacy. Guaranteed Shipping.
  • Buy Cheapest viagra contraindications Online Low Prices. No Prescription Needed.
  • Buy Cheap viagra shop uk Online Best Prices. 100% Satisfaction Guaranteed.
  • Buy Cheap buy cheap uk viagra Online Best Prices. Discount Pharmacy Online.
  • Buy Cheap levitra side effect Now Bonus Pills And Reorder Discounts! Low Prices.
  • Buy Cheap viagra best buy Now Low Prices. Drug Store Without A Prescription.
  • Buy Cheap levitra long intercourse Now Best Prices. All Medications Are Certificated!
  • Buy Cheap cialis profestional Now Pharmacy Store. Cheap Prescription Drugs.
  • Buy Cheapest viagra real mail Now Best Drugstore. Discount Pharmacy Online.
  • Buy Cheap best buy viagra Now Top Online Pharmacy. Online Prices For best buy viagra!
  • Buy Cheapest cialis line order Online Best Prices. Cheap Online Pharmacy.
  • Buy Cheap cialis the sex pill Online Discount Pharmacy Online. Best Drugstore.
  • Buy Cheap generic cialis vs brand cialis Now Top Online Pharmacy. No Prescription Needed.
  • Buy Cheap buying viagra Now Guaranteed Shipping. No Prescription Needed.
  • Buy Cheap cheap generic cialis Now Pharmacy Store. Discount Pharmacy Online.
  • Buy Cheapest buy cheapest cialis Online No Prescription Needed. Best Online.
  • Buy Cheapest cialis name brand cheap Online Pharmacy Store. No Prescription Needed.
  • Buy Cheapest viagra sublingual Now Discount Pharmacy Online. Best Internet.
  • Buy Cheap discount drug viagra Now Free Viagra Pills! Cheap Pharmacy Online.
  • Buy Cheap levitra side effects Now Buy Medications Online. Best Drugstore.
  • Buy Cheap effects of viagra on women Now No Prescription Needed. Free Viagra Pills!
  • Buy Cheapest free levitra sample Online Best Drugstore. Cheap Online Pharmacy.
  • Buy Cheap cialis versus viagra Now Low Prices. 24/Internet)(safe Pharmacy.
  • Buy Cheap cialis online pharmacist Online Order Cheap Meds Without Rx. Low Prices.
  • Buy Cheap compare levitra Now Discount Online Pharmacy. Online Medical Shop.
  • Buy Cheap cialis professional no prescription lowest price Online Guaranteed Shipping. WorldWide Shipping.
  • levitra discount presciptions Online Without Prescription Best Prices. WorldWide Shipping.
  • Buy Cheapest levitra cost Online Drugs, Health And Beauty. Best Prices.
  • Buy Cheap cialis drug information Online Top Online Pharmacy. Pharmacy Store.