Performance tuning in Liferay - Part 1

Below are the main points to work on for a performance tuning engagement in Liferay - Part 1.

  • Firstly, we need to find out what is slow: Database, service calls, elastic search, memory is an issue, threads are blocked / waiting, how much memory is a module taking, logs are printing what, etc.

  • Check your configurations as per this post: How to debug Liferay? - Some pointers - Part 1 | LinkedIn

  • Install Glowroot if possible, in central pattern and check following sections in it: slow traces, errors, service calls, threads, heap, instrumentation, configurations and so on for the problem timeframe.

  • You can enable tracing in logs & Glowroot instrumentation on targets. You can also use plugins by Fabian Bouché like for fragment analysis or follow his blogs on www.liferay.dev/blogs for using Glowroot in upgrades.

  • The above will give you hints on what is slow. Especially open the FLAME graphs and threads along with heap dumps to analyze which threads are blocked or waiting, how much memory is allocated to what in slow traces of modules and so on.

  • Then run a load test in simulated environment after checking compatibility matrix to get latest statistics for various scenarios like web content on portlet or in fragment, API calls, integrations, heavy load on Elasticsearch and so on with experimentation on themes.

  • After getting the slow threads and details in flame graphs plus slow traces, if it's custom code or configuration or DB call or ES which is slow, optimize it like Hikari pool connections or if it's source code of Liferay, open the GITHUB repo for Liferay portal, check the source code and reach out of Customer Success / Global Services / Support with inferences depending on your engagement in account. Your Customer Success Manager or Sales can guide you on this.

  • GS / CS will work internally in Liferay to get you the best options and / or patches in case they already exist. Many a times this could also have been fixed in a Hot fix or Fix Pack already. Alternatively, configurations could also solve such problems many a times. To check these go to Liferay customer portal and check the changelog for fix packs. You can also refer to Liferay Learn and Help Center for help articles and tutorials.

  • Various areas of performance tuning exist: Database, HTTP calls, App server, ElasticSearch, Threads, Heap optimization, Caching and more. A good list of areas is to check in the deployment guide for your version.

 

  • Some Glowroot hints below:

  • The blue circle in Glowroot slow traces indicates that the transaction is still ongoing whereas yellow indicates it's completed. Red indicates there is an error.

  • You can change the JVM gauges as needed to see lot of different types of details of JVM

  • You can use instrumentation from configuration using type ahead drop down (AJAX style)

  • You can allocate specific cores to a JVM if need be using an argument on core allotment

  • You can see thread profiles and take heap dumps from Glowroot itself

  • Glowroot has sections on errors, queries and service calls

  • You can get Glowroot to sustain it's data through restarts using arguments

  • For frequent garbage collection, check if some queries, etc. are continuously filling up memory and any fine tuning on caching can help

  • It helps to follow these sections in no particular order and check them regularly: JVM - guages, MBeans (You can search your cache related things here - it's like seeing things in VisualVM), threads and more, transactions, slow traces (all three areas throughput/etc.), thread profiles (search "blocked" here), queries, service calls, errors, sorting options in transactions, instrumentation, etc.

  • Latest Glowroot works with Java 11 that is compatible with Liferay for customizations and product usage but not source code compile. This latest Glowroot gives lot many more options especially in transactions.

  • If you are using Java 8, check if your Glowroot version is compatible with it. Typically 0.13.6 and below are compatible with Java 8 as far as I know.

 

  • Thanks to Fabian Bouché David Nebinger and many more at Liferay Global Services / Support / Customer Success and Customer Support / Engineering due to which I am able to compile the above. Above is a compilation of work from many sources internally in Liferay via work with customers & externally which hopefully should help many of Liferay customers and partners. This also serves as a case study on performance tuning.