Solaris 11: cambiar dinámicamente la reserva de ZFS ARC cache

Antes de Solaris 11 (11.2), si queríamos modificar el tamaño de memoria disponible para la caché de ZFS ARC (Adaptive replacement cache), había que hacerlo de forma estática añadiendo el parámetro zfs_arc_max en /etc/system, lo que implicaba sí o sí, reiniciar el sistema.

Por suerte, en las nuevas versiones de Solaris 11 ya está disponible la forma de modificar la reserva de memoria dinámicamente sin necesidad de reiniciar el SO. Recordad, que por defecto no hay límite de memoria para la ZFS ARC cache, lo que puede provocar un uso muy elevado de RAM en el sistema y que esta no esté disponible inmediatamente para procesos de usuario (hay algo de latencia entre que se libera de la cache y pasa a estar libre. El uso del parámetro de kernel zfs_arc_max ya está obsoleto.

La forma de cambiar dinámicamente esta reserva es mediante el parámetro user_reserve_hint_pct, que define el porcentaje de memoria que reservamos para usuario, es decir, que no será utilizada para otras funciones como la ZFS ARC. Por defecto es del 0% así que siempre será recomendable ajustarlo según requerimientos.

Oracle facilita un script propio para aplicar el porcentaje de reserva de forma muy sencilla. El script set_user_reserve.sh se puede encontrar en la metalink de Oracle:»Memory Management Between ZFS and Applications in Oracle Solaris 11.2 (Doc ID 1663862.1)». El uso es tan sencillo como especificar mediante el parámetro -f el porcentaje a reservar:

~# ./set_user_reserve.sh -fp 80
Current user_reserve_hint_pct value is 0.
Adjusting user_reserve_hint_pct from 0 to 0

Adjustment of user_reserve_hint_pct to 80 successful.
Make the setting persistent across reboot by adding to /etc/system

* Tuning based on MOS note 1663862.1, script version 1.2
* added Tuesday, June  4, 2019 08:43:04 AM EST by system administrator : 
set user_reserve_hint_pct=80

En el ejemplo anterior hemos pasado de 0% a 80%, lo que implica que sólo un 20% de la memoria del sistema estará disponible para ZFS ARC. El script modifica el parámetro en caliente y también lo añade a /etc/system para que sea persistente tras reiniciar.

Tras aplicar el cambio, podréis ver el cambio de uso de RAM:

~# echo "::memstat" | mdb -k
Page Summary                            Pages             Bytes  %Tot
---------------------------- ----------------  ----------------  ----
Kernel                                 746345              5.6G    5%
Defdump prealloc                       237850              1.8G    2%
ZFS                                    660317              5.0G    4%
Anon                                  1830371             13.9G   12%
Exec and libs                           64977            507.6M    0%
Page cache                              64408            503.1M    0%
Free (cachelist)                      1283167              9.7G    8%
Free (freelist)                      10841205             82.7G   69%
Total                                15728640              120G