Note | ||
---|---|---|
| ||
Viewing restricted to WSO2 users. |
The default distribution of WSO2 BPS The Business Process profile of WSO2 Enterprise Integrator (WSO2 EI) comes with an embedded H2 database as the BPEL engine's persistence storage, along with other settings configurations suitable for a development environment. However, it It is recommended that some of these configurations be changed when moving to production. The configuration setting may change , depending on the number of requests BPS the Business Process profile is going to handle per second, your auditing and monitoring requirements, performance requirements and nature of your processes.
The following are sections describe some of the key points to note .when tuning the Business Process profile:
Table of Contents | ||||
---|---|---|---|---|
|
OS-level settings
To alter the number of allowed open files for system users, configure the following settings in
/etc/security/limits.conf
file of Linux (be sure to include the leading * character).Code Block * soft nofile 4096 * hard nofile 65535
Optimal values for these parameters depend on the environment.
To alter the maximum number of processes your user is allowed to run at a given time, configure the following settings in
/etc/security/limits.conf
file of Linux (be sure to include the leading * character). Each carbon server instance you run would require up to 1024 threads (with default thread pool configuration). Therefore, you need to increase the nproc value by 1024 per each carbon server (both hard and soft).Code Block * soft nproc 20000 * hard nproc 20000
JVM-level settings
...
If one or more worker nodes in a clustered deployment require access to the management console, you would need to increase the entity expansion limit as follows in the <BPS_HOME>/bin/wso2server.bat
file (for Windows) or the <BPS_HOME>/bin/wso2server.sh
file (for Linux/Solaris). The default entity expansion limit is 64000.
Code Block | ||
---|---|---|
| ||
-DentityExpansionLimit=100000 |
Tip |
---|
Tip: This is not included by default in the wso2server.sh file. You must add this in explicitly. |
...
|
External database
Configure an external database server such such as MySQL as the persistence storage instead of embedded H2 database. Although a slight performance gains gain can be experienced when using simple BPEL processes with H2 database, it cannot handle multiple concurrent requests and complex processes with the same efficiency.
JDBC connections
JDBC connections are useful when your application requires high throughput.
BPS The Business Process profile has three engines; Apache ODE BPEL processor, HumanTask engine and Activiti BPMN engine. These engines are tightly coupled with the database layer and their function is to persist instance data into the database. ThusTherefore, for BPS to the Business Process profile to function properly, you need to allocate enough database connections for datasource configurations.
...
Business Process profile datasource
Both Apache ODE BPEL processor and HumanTask engine share same BPS datasource Business Process profile datasource and database connections so . Therefore, we generally recommend allocating 50% of database connections for each engine for an application running with both BPEL and HumanTask.
For example, if you have a total 100 database connections for a BPEL and HumanTask application, you can use upto up to 50 database connections for the ODE engine and leave the rest of the database connections for HumanTask operations. If you have only BPEL in your application, you can allocate many more database connections for the ODE engine.
Configure the BPS datasource Business Process profile datasource by editing the <BPS<EI_HOME>/wso2/
repositorybusiness-process/conf/datasources/bps-datasources.xml
file and changing the maxActive
value .
Code Block | ||
---|---|---|
| ||
<datasources> <datasource> <name>BPS_DS</name> <description></description> <jndiConfig> <name>bpsds</name> </jndiConfig> <definition type="RDBMS"> <configuration> <url>jdbc:mysql://localhost:3306/bpsds</url> <username>root</username> <password>root</password> <driverClassName>com.mysql.jdbc.Driver</driverClassName> <testOnBorrow>true</testOnBorrow> <validationQuery>SELECT 1</validationQuery> <validationInterval>30000</validationInterval> <useDataSourceFactory>false</useDataSourceFactory> <defaultAutoCommit>true</defaultAutoCommit> <maxActive>100</maxActive> <maxIdle>20</maxIdle> <maxWait>10000</maxWait> </configuration> </definition> </datasource> </datasources> |
...
Activiti
...
Datasource
Execution of each BPMN process instance makes multiple database calls. Therefore, when executing multiple process instances by concurrent threads (i.e., users), multiple database connections are used. Accordingly, the database connection pool has to be configured to provide the required number of connections based on the expected maximum concurrent process executions. This can be configured by setting the maxActive
parameter of in the <BPS<EI_HOME>/wso2/repositorybusiness-process/conf/datasources/activiti-datasource.xml
file. To avoid failures that may occur due to the congestion for db connections, maxActive
should be equal to the expected number of concurrent process executions. However, lesser number of connections may be sufficient depending on the properties of executed process models (i.e., number/type of tasks) and the behavior of processes (i.e. presence of timer events, reaction time of process participants). If db the database connection pool size (i.e., maxActive
) has to be reduced, it has to be done based on load tests with actual process models and expected process behaviorsbehaviours.
Maximum allowed connections for the database connection pool (i.e., maxActive
) should not exceed the maximum allowed connections (i.e., DB sessions) for the database server. In addition, if the database server is shared with the BPEL runtime or other server, make sure sufficient number of sessions are available for all shared servers. For example, if BPMN connection pool needs 100 connections and BPEL connection pool needs 50 connections, and if it is expected to have peak BPMN and BPEL loads at the same time, the number of database sessions should be at least 150.
Configure the Activiti datasource by editing the <BPS<EI_HOME>/wso2/repositorybusiness-process/conf/datasources/activiti-datasources.xml
file file and changing the following.
Code Block | ||
---|---|---|
| ||
<datasources> <datasource> <name>ACTIVITI_DB</name> <description>The datasource used for activiti engine</description> <jndiConfig> <name>jdbc/ActivitiDB</name> </jndiConfig> <definition type="RDBMS"> <configuration> <url>jdbc:mysql://localhost:3306/activitiDS</url> <username>root</username> <password>root</password> <driverClassName>com.mysql.jdbc.Driver</driverClassName> <maxActive>50</maxActive> <maxWait>60000</maxWait> <testOnBorrow>true</testOnBorrow> <validationQuery>SELECT 1</validationQuery> <validationInterval>30000</validationInterval> </configuration> </definition> </datasource> </datasources> |
Note |
---|
Also note that, even if you have allocated higher number of database connections for datasources, the performance may might not increase as expected. One reason for this could be that there are not enough database sessions from the database side. If that is the case, you need to increase the number of database sessions from the database side. |
ODE scheduler threads
ODE scheduler threads are useful when your application requires high throughput.
...
Configure this by adding the following to the <BPS<EI_HOME>/wso2/repositorybusiness-process/conf/bps.xml
file if it isn't there is not specified already.
Code Block |
---|
<tns:ODESchedulerThreadPoolSize>50</tns:ODESchedulerThreadPoolSize> |
Multi-threaded HTTP connection manager
Configure multi-threaded HTTP connection manager connection pool settings to suit your BPEL processes. Typically, the HTTP connection manager should be configured to be in sync with the concurrent HTTP connections in BPSthe Business Process profile. This is necessary when you have a lot of internal or external service invocations.
There are two configurations in HTTP connection manager. One is 'max total connections' maxTotalConnections
and the other is 'max total connection per host'. These settings maxConnectionsPerHost
. The values for these depend on the number of concurrent requests BPS that the Business Process profile needs to handle, and the number of external service calls per process instance. Also, if your processes do a lot of service invocation to localhost (or a particular host), then it is necessary to increase the maxConnectionsPerHost
configuration value.
Configure the <BPS<EI_HOME>/wso2/repositorybusiness-process/conf/bps.xml
file to set specific values as shown below.
Code Block | ||
---|---|---|
| ||
<tns:WSO2BPS xmlns:tns="http://wso2.org/bps/config"> ... <tns:MultithreadedHttpConnectionManagerConfig> <tns:maxConnectionsPerHost value="100"/> <tns:maxTotalConnections value="200"/> </tns:MultithreadedHttpConnectionManagerConfig> ... </tns:WSO2BPS> |
...
Timeouts
This configuration is relevant when partner services take more time to responserespond. When partner services are slow or take more time to responserespond, the callee BPEL process's invoke activity fails due to message exchange timeout. By increasing time will You can increase the timeout values to avoid these kind of failures. Also note that, slow partner services will slow down the entire BPEL process. This will cause to timeout the causes client application . Thus it is required increase timeout. Therefore, you need to increase the timeout interval for client applicationapplications. To do this, configure the <BPS<EI_HOME>/wso2/repositorybusiness-process/conf/bps.xml
file and the <BPS<EI_HOME>/wso2/repositorybusiness-process/conf/axis2/axis2.xml
file as shown below.
...
Here you must increase the default values for message exchange timeout and external service invocation timeout. Also set the SO_TIMEOUT
parameter and CONNECTION_TIMEOUT
parameter in HttpSender. Increase the timeout value from the default value to 10 minutes.
HumanTask caching
HumanTask caching is important when you have to deal with a large user store. HumanTasks are tightly coupled with users and user roles/groups. Because of this, BPS does lot of the Business Process profile does many user store lookups for HumanTask operations. These user store calls can take a considerable amount of time , if when the user store is large or located remotely. This degrades the performance of the entire HumanTask engine. Caching user and role lookup data at the BPS side will reduce Business Process profile side reduces these remote user store calls and improve improves the overall performance of the HumanTask engine.
Enable HumanTask caching in the <BPS<EI_HOME>/wso2/repositorybusiness-process/conf/humantask.xml
file.
Code Block | ||
---|---|---|
| ||
<cacheconfiguration> <enablecaching>true</enablecaching> </cacheconfiguration> |
Number of HumanTask scheduler threads
This is relevant when you are not using HumanTask deadline/escalation. HumanTask deadline and escalation are scheduled tasks that are executed by the HumanTask scheduler. By default, 50 threads are allocated for to the HumanTask scheduler. If you are not using deadline/escalations, you can configure this value to a lower value such as 5. This will utilize idle threads in BPS serverthe Business Process profile. Note that, you can't cannot set this to 0, because the HumanTask engine has several internal scheduled tasks to run.
Configure this value in the <BPS<EI_HOME>/wso2/repositorybusiness-process/conf/humantask.xml
file.
Code Block | ||
---|---|---|
| ||
<schedulerconfig> <maxthreadpoolsize>5</maxthreadpoolsize> </schedulerconfig> |
BPEL process persistence
Configuring BPEL process persistence is recommended. If a process is implemented in the request-response interaction model, use in-memory processes instead of persistence processes. This decision mainly depends on the specific business use-case.
Process-to-process communication
Use process-to-process communication. This reduces the overhead introduced by additional network calls, when calling one BPEL process from another deployed in the same BPS Business Process profile instance.
Event filtering
Configure event-filtering at process and scope level. A lot of database resources can be saved by reducing the number of events generated.
Non-visualized environments
Take precaution when deploying WSO2 BPS in virtualized the Business Process profile in virtualised environments. Random increases in network latencies and performance degradation degradations have been observed when running BPS the Business Process profile on VMs.
Process hydration and dehydration
One technique to reduce memory utilization of the BPS engine Business Process profile is to process hydration and dehydration. User You can configure the hydration/dehydration policy in the <BPS<EI_HOME>/wso2/repositorybusiness-process/conf/bps.xml
file or define a custom hydration/dehydration policy.
...
Code Block | ||
---|---|---|
| ||
<tns:ProcessDehydration maxCount="100" value="true"><tns:MaxAge value="300000"/></tns:ProcessDehydration> |
MaxAge value
: Sets the The maximum age of a process before it is dehydrated.- ProcessDehydration
maxCount
:The
maximum
deployed
process
count
that
can
exist
in
memory
at
a
particular
time.
In-memory execution
For performance purposes, a process can be defines as being executed only defined to execute only as in-memory. This greatly reduces the amount of generated queries and puts far results in less load on the database. Both persistent and non-persistent processes can cohabit in WSO2 BPSthe Business Process profile.
Shown below Following is an example of declaring a process as in-memory simply by adding an in-memory element in the deploy.xml
file.
Code Block | ||
---|---|---|
| ||
<process name="pns:HelloWorld2"> <in-memory>true</in-memory> <provide partnerLink="helloPartnerLink"> <service name="wns:HelloService" port="HelloPort"/> </provide> </process> |
Info |
---|
In-memory executions put result in restrictions on the process and the process instances cannot be queried using the BPS Business Process Management API. Also, the process definition can only include a single receive activity (the one that will trigger the instance creation). |
Info |
---|
Configuration details for these optimizations vary in older BPS versions. Also, these optimizations optimisations are supported by Apache ODE, but configuration is different from the WSO2 BPSEI Business Process profile. |
BPMN performance tuning
The BPMN runtime frequently accesses the database for persisting and retrieving process instance states. Therefore, performance of BPMN processes depends heavily on the database server. In order to get best performance, it is recommended to have a high speed network connection between BPS instances and the database server.
BPMN runtime uses a database based ID generator for allocating IDs for all persisted entities. In a highly loaded clustered scenario (i.e., multiple BPS Business Process profile instances with a shared database), database transaction failures may occur if two BPS instances Business Process profile instances try to allocate IDs at the same time. This can be mitigated by increasing the number of IDs allocated in a single transaction by setting the "idBlockSize
" property. Default value of ID block size is 2500. This can be increased by adding the following property to the processEngineConfiguration
bean in the <BPS<EI_HOME>/wso2/repositorybusiness-process/conf/activiti.xml
file.
Code Block | ||
---|---|---|
| ||
<propertyproperty name="idBlockSize" value="5000" /> |
...
Another option is to configure the StrongUuidGenerator
instead of using database based ID generator by adding the following property to the processEngineConfiguration
bean in the <BPS<EI_HOME>/wso2/repositorybusiness-process/conf/activiti.xml
file.
Code Block | ||
---|---|---|
| ||
<property name="idGenerator"> <bean class="org.activiti.engine.impl.persistence.StrongUuidGenerator" /> </property> |