Stoc |
---|
...
Servoy supports both Java 5 7 and Java 6 8 (for the serverApplication Server, the clients Smart Client and developerServoy Developer). Java 6 has numerous performance improvements, so it is preferred over Java 5.When the hardware of the Servoy
If the hardware in which Servoy is running is 64bit, make sure to also run a 64 bit Java Virtual Machine. When in doubt which version is used, check the Servoy Admin page, under "Servoy Server Home" > "Servoy Server Status" > " > JVM Information":
Note |
---|
An 32 bit JVM will allow a max memory of 2 Gb in total, In order to run with larger heap sizes (over 2 Gb) you have to use 64 bit JVM on a 64 bit OS! |
...
Java has 2 distinct operating modes: client mode and server mode. When running in server mode, the startup of the Java process will take longer and initial execution of code will be slower, but after a while the application will perform faster. The server mode is best suited for the Servoy Application Server.
...
If the JVM supports servermode, it will automatically detect if the machine it is running on is a "'capable" ' machine and automatically run in server or client mode depending. The definition of "capable" may differ from Java version to Java version. For Java 5/6 this means a 2CPU, 2Gb memory machine.
Checking whether or not a Servoy Application Server runs in client or server mode can be seen on the Servoy Admin page, under "Servoy Server Home" > " > Servoy Server Status" > " > JVM Information":
...
In servoy_server.sh/bat:
Code Block |
---|
java -server -Djava.awt.headless=true .....
|
When using the Service wrapper for java7:
Code Block |
---|
# Java Additional Parameters wrapper.java.additional.1=-Djava.awt.headless=true wrapper.java.additional.2=-Duser.dir="C:\Users\pbakker\Desktop\tmp servoy\Servoy\application_server" wrapper.java.additional.3=-Djava.io.tmpdir="C:Servoy\application_server\server\work" wrapper.java.additional.4=-XX:MaxPermSize=200m wrapper.java.additional.5=-server |
server wrapper for java 8 (now has metaspace instead of perm space)
Code Block |
---|
# Java Additional Parameters wrapper.java.additional.1=-Djava.awt.headless=true wrapper.java.additional.2=-Duser.dir="C:\Servoy\application_server" wrapper.java.additional.3=-XX:MaxPermSize=128mDjava.io.tmpdir="C:Servoy\application_server\server\work" wrapper.java.additional.4=-XX:MetaspaceSize=200M wrapper.java.additional.5=-XX:MaxMetaspaceSize=200M wrapper.java.additional.6=-XX:MinMetaspaceFreeRatio=0 wrapper.java.additional.7=-XX:MaxMetaspaceFreeRatio=100 wrapper.java.additional.48=-server |
If you have a lot of plugins then maybe that max perm or metaspace is not enough (if you get out of perm size or metaspace exceptions after a while)
then you need to increase the 200M
Note | ||||
---|---|---|---|---|
| ||||
On Windows 32 bit environments, the Java Runtime Environment does not include support for server mode. In order to take advantage of server mode optimizations on 32 bit windows Windows systems, it is required to install Java Development Kit (JDK) |
Processes in Java, like See Memory Management
See Connection Pooling in the Database Connections chapter
In order to get the best possible performance, the communication between the Servoy Application Server , need to be told explicitly the maximum of memory they are allowed to use. This setting, the maximum heap size, is important to adjust to the load the Servoy Application Server is to handle.
The maximum heap size setting is set in {servoy_install}/application_server/servoy_server.sh/.bat, through the "Xmx" setting.
When the Application Server is started as a Service through the setting can be found in {servoy_install}/application_server/service/wrapper.conf, by the name of "wrapper.java.maxmemory".
By default the maximum heap size is set to 256MB. This setting should be changed when:
Databases have a max connection poolsize to prevent memory problems, but the default 10 can be too low when using many clients on 1 server.
As rule of thumb, if the active connection is > 70% of the max then set the max higher, its however not advised to have more then 30 connection max. (since databases them self have limits on how much they can handle, postgress for example default 40 max)
The idle connection parameter is just for efficient memory usage, when allow many idle more memory is occupied when idle, low idle means more connections have to be created (which is expensive time wise)
Note |
---|
When noticing performance problems also watch the "performance data" section. At all times the normal Servoy SQL should be below 0.5 seconds not including reporting or search queries. If this is not the case contact an database administrator for index creation. |
servoy.webclient.templates.use_local_ids
For the Web Client, Servoy generates HTML markup. In order for Servoy to dynamically update only parts of the UI through Ajax, each object in the HTML Markup receives a unique ID. This ID is also placed in the editable Web Client templates.
Servoy has 2 modes for generating the ID's:
The advantage of the local identifiers are that they are shorter in length, thus bring down the weight of the generated HTML markup. The advantage of the unique identifiers is that they are the same on any server where the solution is running.
If templates are used to modify the generated HTML markup for Web Clients, then the unique identifiers are to be used, in order to maintain the link between the identifiers in the edited templates and the identifiers used at runtime. Otherwise the local identifiers can be used.
By default a Servoy Application Server uses the unique identifiers. Enabling the use of local identifiers can be done by setting the servoy.webclient.templates.use_local_ids option on the Servoy Admin page to true (located under Servoy Settings > Web Client settings)
Content compressionand the database needs to be as fast as possible. The fastest option would be installing the database engine and the Servoy Application Server on the same machine, whether or not this is possible depends on the dimensions of the physical server and the resource requirements of both the database engine and the Servoy Application Server.
When opting for dedicated servers for both the database engine and the Servoy Application Server, the connection between them should be as fast as possible, preferably a direct 1Gb cable connection between the two machines.
When experiencing performance issues the 'Performance Data' page of the Servoy Admin page can be analysed to find slow performing SQL statements, or SLQ statements that are fired often.
The page provides an overview of all queries fired at the database. The performance data is sorted by the total time taken to perform the query, being the result of the average time * number of executions.
At any given time regular SQL statements (Type = Relation, Load foundset) should have an average execution time below 25 milliseconds.
Especially for SQL statements that are fired often and take up significant time it should be checked if it's possible to optimize the database, for example by creating the relevant indexes.
Servoy loads a foundset by first retrieving the PKs from the database. This retrieval is done in chunks: when the foundset is initialized, the first chunk is retrieved, consecutive chunks are retrieved when needed.
The actual record data is also retrieved from the database in chunks.
The size of the different chunks are controlled by 3 properties that can be set in the servoy.properties:
Setting | Default Value | Description |
---|---|---|
servoy.foundset.pkChunkSize | 200 | Chunk size for foundset PK retrieval |
servoy.foundset.chunkSize | 30 | Chunk size for record data retrieval |
servoy.foundset.initialRelatedChunkSize | 2 * servoy.foundset.chunkSize | Chunk size for related record retrieval |
The values can be modified in an attempt to increase performance. The optimal values differ per application, thus no guidelines are available for alternative values. Tuning needs to be done by altering the values and monitoring the performance afterwards. The defaults are set based on averages.
In order to minimize the size of the content that the browser has to download for the Web Client, it's possible to turn on compressionthe application server serving the content can compress the content. The Servoy Application Server is currently not configured to automatically compress the content.
Compression can be done by the Apache Tomcat instance that is part of the Servoy Application Server, or can be done by an HTTP server that is in front of the Servoy application Server, like an Apache HTTPD Server.
In order to enable compression in the Tomcat instance that is part of the Servoy Application Server, open the file "server.xml" located in {servoy_install}application_server\server\conf\. and locate the Connector:
Code Block |
---|
<Connector port="8080"
protocol="HTTP/1.1"
maxThreads="500" connectionTimeout="60000"
redirectPort="8443" useBodyEncodingForURI="true" /> |
and add the following atttributes:
so the connector is configured like this:
Code Block |
---|
<Connector port="8080"
protocol="HTTP/1.1"
maxThreads="500" connectionTimeout="60000"
redirectPort="8443" useBodyEncodingForURI="true"
compressableMimeType="text/html,text/xml,text/css,text/javascript,text/plain" compression="on"
compressionMinSize="2048"/> |
Save the edits and restart the Servoy Application Server to let the configuration changes take effect.
...
As of Servoy 6.0, the Tomcat compression configuration will be enabled by default
It is also possible to handle the compression outside of the Servoy Application Server, for example in an Apache HTTPD Server placed between the Servoy Application Server and the outside world. The advantage of this is that Tomcat's compression options are limited, so an external HTTP server offers more options.
...
Details on setting up mod_deflate on an Apache HTTPD server can be found here: http://httpd.apache.org/docs/2.0/mod/mod_deflate.html
...
When compression is handled by outside the Servoy Application Server, it is advised to turn of compression inside Servoy. This can be doen by modifying the server.xml file located in {servoy_install}application_server\server\conf\
. and locate the Connector:
Code Block |
---|
<Connector port="8080"
protocol="HTTP/1.1"
maxThreads="500" connectionTimeout="60000"
redirectPort="8443" useBodyEncodingForURI="true"
compressableMimeType="text/html,text/xml,text/css,text/javascript,text/plain" compression="on"
compressionMinSize="2048"/>
|
and removing the following atttributes:
Save the edits and restart the Servoy Application Server to let the configuration changes take effect.
At all times try to keep the Server log free from javascript application errors/excpetions, all application exceptions point to possible problems inside the application!.