Tuning the AIX file caches
Introduction
By default, AIX is tuned for a mixed workload, and will grow its VMM file cache up to 80% of physical RAM. While this may be great for an NFS server, SMTP relay or web server, it is very poor for running any application which does its own cache management. This includes most databases (Oracle, DB2, Sybase, PostgreSQL, MySQL using InnoDB tables, TSM) and some other software (eg. the Squid web cache).
Common symptoms include high paging (high pgspin and pgspout in topas), high system CPU time, the lrud kernel thread using CPU, slow overall system throughput, slow backups and slow process startup.
For most database systems, the ideal solution is to use raw logical volumes. If this is not acceptable, then direct I/O and concurrent I/O should be used. If for some reason this is not possible, then the last solution is to tune the AIX file caches to be less aggressive.
Parameters
The four main parameters that should be tuned are the three controlling the size of the persistent file cache (minperm% and maxperm%) used for JFS filesystems, and the client file cache (maxclient%) used by NFS, CDRFS and JFS2 filesystems, and also the lru_file_repage parameter, which influences what pages the VMM page stealing algorithm will steal (present in AIX 5.2 ML4+ and AIX 5.3 ML1+).
- numperm%
- Defines the current size of the persistent file cache.
- minperm%
- Defines the minimum amount of RAM the persistent file cache may occupy. If numperm% is less than or equal to minperm%, file pages will not be stolen when RAM is required.
- maxperm%
- Defines the maximum amount of RAM the persistent file cache may occupy before it is used as the sole source of new pages by the page stealing algorithm. By default, numperm% may exceed maxperm% if there is free memory available. The setting strict_maxperm may be set to one to change maxperm% into a hard limit, guaranteeing numperm% will never exceed maxperm%.
- strict_maxperm
- As above, if set to 1, changes maxperm% into a hard limit.
- numclient%
- Defines the current size of the client file cache.
- maxclient%
- Defines the hard maximum size of the client file cache.
- strict_maxclient
- Introduced in 5.2 ML4, allows the changing of maxclient% into a soft limit, similar to strict_maxperm.
- lru_file_repage
- Introduced in AIX 5.2 ML4 and AIX 5.3 ML1, this influences the VMM page stealing algorithm. If set to 0, the algorithm will strongly prefer stealing file pages to satisfy memory requests.
Note that maxclient% may never exceed maxperm%. In later versions of vmtune, this is enforced by changing both parameters if necessary.
Tuning for AIX 5.1 and Earlier
The tool to use is /usr/samples/kernel/vmtune, installed as part of the bos.adt.samples fileset. If run without options, it will display the currently configured tuneable values, and some of the current runtime values.
Note: vmtume may be used to set the current runtime parameters only. To have changes take effect on reboot, vmtune must be initiated as part of the system startups.
An example of a tuning command used on a system running Oracle may be:
# /usr/samples/kernel/vmtune -p 3 -P 5 -h 1 -t 5
Which sets minperm% to 3%, maxperm% and maxclient% to 5%, and enables strict_maxperm.
Tuning for AIX 5.2 and Later
Note: AIX 5.2 includes a compatibility version of vmtune. It is probably most wise to become familiar with the new tools, instead of relying on the backwards compatibility commands.
The main tool to use is /usr/sbin/vmo, installed as part of the bos.perf.tune fileset. To display current cache sizes (numperm% and numclient%) use vmstat -v.
vmo can change both persistent (reboot) values as well as runtime values, and so does not need to be present in the startups. It stores the persistent values in the /etc/tunables/nextboot file.
Current values and characteristics may be displayed using:
# vmo -L NAME CUR DEF BOOT MIN MAX UNIT TYPE DEPENDENCIES -------------------------------------------------------------------------------- memory_frames 512K 512K 4KB pages S -------------------------------------------------------------------------------- pinnable_frames 427718 427718 4KB pages S -------------------------------------------------------------------------------- maxfree 128 128 128 16 200K 4KB pages D minfree memory_frames ...
A similar example to the vmtune example above using vmo may be:
# vmo -p -o minperm%=3 -o maxperm%=5 -o strict_maxperm=1 -o maxclient%=5
And if making use of lru_file_repage:
# vmo -p -o minperm%=3 -o maxperm%=90 -o strict_maxperm=1 -o maxclient%=90 -o lru_file_repage=0
To check the current size of the persistent file cache and the client file cache, see the numperm and numclient values reported by vmstat -v:
$ vmstat -v 524288 memory pages 474939 lruable pages ... 10.0 minperm percentage 20.0 maxperm percentage 44.5 numperm percentage 211365 file pages ... 19.7 numclient percentage 20.0 maxclient percentage 94027 client pages