This page last changed on May 28, 2009 by rosie@atlassian.com.

If JIRA is not responding as quickly as a previous version or is taking a while to perform certain tasks, please follow the instructions on this page.

Tune JIRA

There are quite a few performance tips that can help JIRA to run quicker and may in fact solve your issues.

Gather information

If tuning JIRA did not help, you will need to find exactly what is slow and what is causing it to run slow.

Profiling

Lets find out where JIRA is spending its time.
JIRA comes with its own built-in Profiling Tool. It allows us to see how long JIRA spends doing individual requests and where that time is being taken.
The tool logs a tree of the time spent in certain methods with the output looking like:

[Filter: profiling] Turning filter on [jira_profile=on]
[116ms] - /secure/Dashboard.jspa
  [5ms] - IssueManager.execute()
    [5ms] - IssueManager.execute()
      [5ms] - Searching Issues
  [29ms] - IssueManager.execute()
    [29ms] - IssueManager.execute()
      [29ms] - Searching Issues
        [28ms] - Lucene Query
          [23ms] - Lucene Search

Thread Dumps

If JIRA is taking a long time to execute a specific operation (E.g. Creating an issue), it can be useful to get a complete thread dump of the JVM to find out exactly what is being executed.
For example, if Create Issue is taking a long time, execute the create issue and while you are waiting for it to return, execute a thread dump every few seconds. (for a 20 second operation, 5 thread dumps would be useful).

What is the machine doing?

It is usually useful to find out how you machine is coping at the time of the slowness. In particular, the CPU usage and the memory swapping.
In *nix these can be done by using the command:

vmstat 1 > vmstat.log

This will put all the results into a file called vmstat.log.
Make sure you turn this off after, otherwise the file will consume your hard disk.

On Windows, you can use a third party tool or try and get a rough idea from the System Properties window. It is also possible to generate a log of system resources and their use with the Windows Performance Manager.

Garbage Collection

Verbose garbage collection will generate log statements that indicate when java is collecting garbage, how long it takes, and how much memory has been freed. You can enable verbose garbage collection by specifying the -verbose:gc jvm option. To have the garbage collection logs written to a file, use -Xloggc:<filename>

Database Connection Pooling

It is possible that your instance of JIRA maybe running low, or out of connections, this can cause JIRA to hang or perform very slowly. The best way to see this type of behaviour is via a thread dump, below is a sample snippet of a thread dump showing this problem:

"Thread-4" prio=6 tid=0x16d85988 nid=0xe20 in Object.wait() [0x17d9f000..0x17d9fce8]
        at java.lang.Object.wait(Native Method)
        - waiting on <0x04139d18> (a org.apache.tomcat.dbcp.pool.impl.GenericObjectPool)
        at java.lang.Object.wait(Object.java:474)
        at org.apache.tomcat.dbcp.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:748)
        - locked <0x04139d18> (a org.apache.tomcat.dbcp.pool.impl.GenericObjectPool)
        at org.apache.tomcat.dbcp.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:95)
        at org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:540)
        at org.ofbiz.core.entity.transaction.JNDIFactory.getJndiConnection(JNDIFactory.java:168)
        at org.ofbiz.core.entity.transaction.JNDIFactory.getConnection(JNDIFactory.java:140)
        at org.ofbiz.core.entity.TransactionFactory.getConnection(TransactionFactory.java:99)
        at org.ofbiz.core.entity.ConnectionFactory.getConnection(ConnectionFactory.java:53)
        at com.atlassian.jira.upgrade.ConnectionKeeper.openConnections(ConnectionKeeper.java:106)
        at com.atlassian.jira.upgrade.ConnectionKeeper.run(ConnectionKeeper.java:87)

The lines that indicate this problem are the following:

        - locked <0x04139d18> (a org.apache.tomcat.dbcp.pool.impl.GenericObjectPool)
        at org.apache.tomcat.dbcp.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:95)

To help alleviate this you can increase your connection pool size. Information on performing this is application server specific, but if you are running Apache Tomcat or JIRA standalone (which uses Apache Tomcat), you can follow the following documentation to adjust the connection pool size.

Get Help

We are the first to admit we are not experts in everything and, more often than not, there are other customers who have similar set ups and face similar issues. You should ask about your issues on the user forums as you are more than likely to get a quick and knowledgable response.
If you still have not got it resolved (even though Atlassians lurk on the forums continuously), please create a Support Request attaching all the information you gathered above with a detailed description of what operation is slow and your environment:

  1. Number and speed of CPU's.
  2. Is JIRA on the same machine as the Database?
  3. What are the ping times from the App server to the Database (if it is on a seperate machine)
  4. Is the inedx location on the same machine?
  5. How much data do you have? (This can be found from ADMINISTRATION -> System -> System Info)
  6. Cut and copy the contents of the Environment data from ADMINISTRATION -> System -> System Info
  7. Attach the log file (location of this can be found in ADMINISTRATION -> System -> System Info)
  8. What actions are slow to perform? Is it a specific page?
  9. Do you have any 3rd party plugins installed?
Document generated by Confluence on Oct 06, 2009 00:26