systemadmin.es > Kernel > swappiness: Regular la tendecia a usar swap del kernel de Linux

swappiness: Regular la tendecia a usar swap del kernel de Linux

Puede ser útil poder regular la tendencia que tiene Linux a pasar memoria a disco (swap). Mediante el sistema de ficheros proc es posible regularlo gracias al fichero /proc/sys/vm/swappiness.

En el código fuente de Linux, en el fichero mm/vmscan.c, se puede apreciar como funciona el parámetro swappiness. Si nos miramos la siguiente función encontramos la implementación del algoritmo:

/*
 * Determine we should try to reclaim mapped pages.
 * This is called only when sc->mem_cgroup is NULL.
 */
static int calc_reclaim_mapped(struct scan_control *sc, struct zone *zone,
                                int priority)
Así, la tendencia a hacer swapping se calcula mediante esta formula:
swap_tendency = mapped_ratio / 2 + distress + sc->swappiness;

Vamos a ver sus variables:

  • mapped_ratio: Indica más o menos el porcentaje de memoria que forma parte del espacio de un programa:
            /*
             * The point of this algorithm is to decide when to start
             * reclaiming mapped memory instead of just pagecache.  Work out
             * how much memory
             * is mapped.
             */
            if (scan_global_lru(sc))
                    mapped_ratio = ((global_page_state(NR_FILE_MAPPED) +
                                    global_page_state(NR_ANON_PAGES)) * 100) /
                                            vm_total_pages;
            else
                    mapped_ratio = mem_cgroup_calc_mapped_ratio(sc->mem_cgroup);
    
  • distress: Se tiene en cuenta como de "problemas" tiene el kernel para liberar memoria. Podemos ver en el código fuente:
            /*
             * `distress' is a measure of how much trouble we're having
             * reclaiming pages.  0 -> no problems.  100 -> great trouble.
             */
            if (scan_global_lru(sc))
                    prev_priority = zone->prev_priority;
            else
                    prev_priority = mem_cgroup_get_reclaim_priority(sc->mem_cgroup);
    
            distress = 100 >> min(prev_priority, priority);
    
  • sc->swappiness: Se trata del valor que podemos indicar mediante /proc/vm/swappiness. Por defecto esta en 60, aceptando valores de 0 a 100. Tal como se aprecia en el código fuente:
    /*
     * From 0 .. 100.  Higher means more swappy.
     */
    int vm_swappiness = 60;
    

    Valores tendiendo a 0 indica que intente evitar hacer swap mientras que tendiendo a 100 indica que intente mantener el máximo de memoria libre pasando a disco lo que no se use.

También se aplica una compensación al resultado para que si realmente necesita swap la use, aúnque los valores sean bajos. Tal como se comenta en el propio código, si el conjunto de memoria en uso por las aplicaciones es mucho mayor que el conjunto de memoria inactiva se debería ser algo más permisivo, reduciendo el efecto de esta compensación un poco para valores bajos de swappiness:

        /*
         * If there's huge imbalance between active and inactive
         * (think active 100 times larger than inactive) we should
         * become more permissive, or the system will take too much
         * cpu before it start swapping during memory pressure.
         * Distress is about avoiding early-oom, this is about
         * making swappiness graceful despite setting it to low
         * values.
         *
         * Avoid div by zero with nr_inactive+1, and max resulting
         * value is vm_total_pages.
         */
        if (scan_global_lru(sc)) {
                imbalance  = zone_page_state(zone, NR_ACTIVE);
                imbalance /= zone_page_state(zone, NR_INACTIVE) + 1;
        } else
                imbalance = mem_cgroup_reclaim_imbalance(sc->mem_cgroup);

        /*
         * Reduce the effect of imbalance if swappiness is low,
         * this means for a swappiness very low, the imbalance
         * must be much higher than 100 for this logic to make
         * the difference.
         *
         * Max temporary value is vm_total_pages*100.
         */
        imbalance *= (vm_swappiness + 1);
        imbalance /= 100;

        /*
         * If not much of the ram is mapped, makes the imbalance
         * less relevant, it's high priority we refill the inactive
         * list with mapped pages only in presence of high ratio of
         * mapped pages.
         *
         * Max temporary value is vm_total_pages*100.
         */
        imbalance *= mapped_ratio;
        imbalance /= 100;

        /* apply imbalance feedback to swap_tendency */
        swap_tendency += imbalance;

Finalmente, en el caso de que swap_tendency sea mayor que 100 empieza a usar swap:

        /*
         * Now use this metric to decide whether to start moving mapped
         * memory onto the inactive list.
         */
        if (swap_tendency >= 100)
                reclaim_mapped = 1;

Para usar el parámetro se puede hacer, como otros ficheros del proc, mediante un simple echo:

# echo 30 > /proc/sys/vm/swappiness

Para consultar su valor, simplemente con un cat lo podemos obtener:

# cat /proc/sys/vm/swappiness
30

Para realizar los cambios permanentes lo podemos hacer mediante el sysctl. Editamos el fichero /etc/sysctl.conf y añadimos:

vm.swappiness = 30

Lo cargamos con sysctl -p:

# sysctl -p
net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
(...)
vm.swappiness = 30

Repitiendo el cat a /proc/sys/vm/swappiness veremos que tras los reinicios el parámetro se conserva al valor indicado.

Evidentemente este parámetro resulta útil para evitar que caiga el rendimiento del sistema por el uso de swap, però reducir excesivamente swappiness tampoco es la solución. Si realmente la máquina hace swap por falta de memoria se debería pensar en una aplicación de RAM.

4 comments to “swappiness: Regular la tendecia a usar swap del kernel de Linux”

  1. Bien el contenido, pero fatal la ortografía!

  2. Por desgracia lo se. Si alguien sabe de un corrector para wordpress que vaya bien se lo agradecería yo y todos los que entren en esta pagina…

    He arreglado todo lo que GMail me ha dicho, si hay algo mas y me lo comentáis os lo agradeceré sinceramente!

  3. Notable artículo, muy completo, se te agradece el tiempo gastado.

  4. Genial artículo. Suscito, bien explicado y completo. Muchas gracias por el aporte.

Deja un comentario:

XHTML - Tags permitidos:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>