Tuning freePBX Kernel Virtual Memory Parameters

We migrated freePBX 2.5.1 to a freePBX 13 HA Cluster. The system only handles voicemail and IVRs for a large Cisco Call Manager installation. It has over 5000 extensions and voicemails and over 300 IVRs.

The legacy freePBX 2.51 handles about 200 concurrent calls on a 16 core system with 32G RAM, and has never had audio issues. Each node of the new freePBX 13 HA cluster has 32 cores and 64G RAM.

While load testing the system prior to roll out, we found that with a load over 100 calls we were getting audio artifact like stutter, static in playback, etc. Artifact worsened as call volume increased. This seemed quite odd as the new hardware was at lease twice the power of the legacy hardware. (All HP)

Using top, htop and nmon during the test showed that there was excessive page faults, swapping to VM and the system seemed to be thrashing which should not be the case with the resources available.

I found this Red Hat link “Tuning Virtual Memory”:

It is a little sparse on the topic, but I noted that Red Hat recommends VM paramters very different from defaults for “database workloads like Oracle.”

I was able to resolve (or at least significantly diminish) the audio artifact by tuning the following parameters:
vm.swappiness = 10 (default = 60)
vm.dirty_ratio = 15 (default = 20)
vm.dirty_background_ratio = 3 (default = 10)

These are set in /etc/sysctl.conf.

The freePBX 13 Distro ISO uses Red Hat defaults. After changing these as above, I could get to 200 calls with no artifact, and no swapping to disk.

I still get a bit of artifact over 200 concurrent calls, but haven’t found any other parameters that seem to effect it.

Has anyone increased throughput by tuning other parameters?