# Configuration and User Guide

# Tuning the WLS-VE LiquidVM Kernel

With non-virtualized WLS you can tune your OS to improve the performance of your application. For information about tuning a standard OS for WLS, see Operating System Tuning in WebLogic Server Performance and Tuning.

The LiquidVM kernel was designed and developed to provide an optimized runtime for executing Java on the JRockit JVM, or more specifically, Java EE applications deployed on WLS on the JRockit JVM. The LiquidVM kernel is not a general purpose OS, and therefore, contains very few performance related configuration options.

However, there are certain system defaults which, for a given deployment, may be:

- Too conservative and therefore detrimental to performance
- Overzealous, resulting in (perhaps fatal) resource starvation

For the most part, such system defaults are set dynamically depending on a given load. Although, in certain circumstances, dynamic settings may be too slow to scale or may introduce unwanted indeterminism.

The following topics describe how the LiquidVM kernel can be tuned to improve the performance of WLS-VE applications:

- Tuning the LiquidVM Kernel Startup Options
- Comparing OS and LiquidVM Kernel Tuning

## Tuning the LiquidVM Kernel Startup Options

The LiquidVM startup options described in Table 9-1 can have an effect on performance and can be tuned as required.

Table 9-1 Tunable LiquidVM Startup Options
Option | Default | Description
--- | --- | ---
`netRcvBufSz` | 40KB | System default `SO_RCVBUF`. Describes the maximum amount of received data a socket may buffer. The TCP receive window is based upon the free buffer size. Individual sockets may set this number using `java.net.Socket.setReceiveBufferSize(int)` (see the API Javadoc, Java TM 2 Platform Standard Edition 5.0 API Specification, for more information). Generally speaking, the higher the better, the cost is that the amount of memory used potentially limits the maximum number of sockets.
`netSndBufSz` | Dynamic, max = 64KB | Static system default `SO_SNDBUF`. Describes the maximum amount of transmit data a socket may buffer. Individual sockets may set this number using `java.net.Socket.setSendBufferSize(int)` (see API Javadoc, Java TM 2 Platform Standard Edition 5.0 API Specification, for more information). Normally, the LiquidVM kernel dynamically sets this number based on memory pressure. Explicitly setting this option disables the dynamic configuration, and statically sets the system default. Generally speaking, the higher the better; the cost is that the amount of memory used potentially limits the maximum number of sockets.
`netTcpAto` | true | Delayed ACK feature. Delays lone ACK packets with the expectation that the user will reply to the received data, piggybacking the ACK on the next transmission. Disabling this feature results in ACK being scheduled for immediate transmission, meaning better latency at the cost of "badput" (needless transmission, costing CPU).

## Comparing OS and LiquidVM Kernel Tuning

Table 9-2 provides comparisons for basic OS tuning concepts between non-virtualized WLS and the LiquidVM kernel. For detailed information about OS tuning with non-virtualized WLS, see Operating System Tuning in WebLogic Server Performance and Tuning.

Table 9-3 lists common OS tunable parameters and their counterparts if they exist in the LiquidVM kernel. In many cases, these tunable parameters are not necessary for the LiquidVM kernel because it is a single-process, single-user operating environment designed to run one Java application most efficiently. Therefore, some of the tunable parameters in normal OSes can be completely eliminated. Tunable parameters that do not have counterparts in the LiquidVM kernel are listed as N/A.

Table 9-3 Tunable OS Parameters in the LiquidVM Kernel
OS Parameter | Relevance to LiquidVM Kernel
--- | ---
Solaris Tuning Parameters
`/dev/tcp tcp_time_wait_interval` | N/A. Dynamically estimate effective MSL for each socket. For more information, see Table 9-2.
`/dev/tcp tcp_conn_req_max_q` | N/A. LiquidVM kernel respects the accept backlog given by the user `listen(2`). Java JDK provides a default of 50.
`/dev/tcp tcp_conn_req_max_q0` | N/A. LiquidVM kernel respects the accept backlog given by the user `listen(2`). Java JDK provides a default of 50.
`/dev/tcp tcp_ip_abort_interval` | N/A.
`/dev/tcp tcp_keepalive_interval` | LiquidVM Kernel boot option "`netKeepAlive`"
`/dev/tcp tcp_rexmit_interval_initial` | N/A.
`/dev/tcp tcp_rexmit_interval_max` | N/A.
`/dev/tcp tcp_rexmit_interval_min` | N/A.
`/dev/tcp tcp_smallest_anon_port` | N/A. Smallest anonymous port is 1025.
`/dev/tcp tcp_xmit_hiwat` | LiquidVM Kernel boot option "`netSndBufSz`", else dynamically guided by memory pressure.
`/dev/tcp tcp_recv_hiwat` | LiquidVM Kernel boot option "`netRcvBufSz`"
`/dev/ce instance` | N/A.
`/dev/ce rx_intr_time` | N/A.
`set rlim_fd_cur` | N/A. LiquidVM has no such limitation; memory is the only restriction.
`set rlim_fd_max` | N/A. LiquidVM has no such limitation; memory is the only restriction.
`set tcp:tcp_conn_hash_size` | N/A.
`set shmsys:shminfo_shmmax` | N/A.
`set autoup` | N/A.
`set tune_t_fsflushr` | N/A.
Linux Tuning Parameters
`/sbin/ifconfig lo mtu` | N/A.
`kernel.msgmni` | N/A. SystemV IPC configuration.
`kernel.sem` | N/A. SystemV IPC configuration.
`kernel.shmmax` | N/A. SystemV IPC configuration.
`fs.file-max` | N/A. LiquidVM Kernel has no such limitation; memory is the only restriction.
`net.ipv4.tcp_max_syn_backlog` | N/A. LiquidVM Kernel has no such restriction, and abides by the user's accept backlog setting `(listen(2)`)
HP-UX Tuning Parameters
`tcp_conn_req_max` | N/A.
`tcp_xmit_hiwater_def` | LiquidVM Kernel boot option "`netSndBufSz`", else dynamically guided by memory pressure.
`tcp_ip_abort_interval` | LiquidVM Kernel boot option "`netRcvBufSz`"
`tcp_rexmit_interval_initial` | N/A
`tcp_keepalive_interval` | LiquidVM Kernel boot option "`netKeepAlive`"
Windows Tuning Parameters
`MaxUserPort` | N/A
`TcpTimedWaitDelay` | N/A. Dynamically estimate effective MSL for each socket.