Roman Gushchin () di Facebook ha presentato alla mailing list degli sviluppatori del kernel Linux un insieme di patch per l'implementazione di un nuovo controller di distribuzione della memoria (controller di memoria slab). Questo nuovo controller è notevole per il trasferimento del tracciamento delle slab dal livello delle pagine di memoria al livello degli oggetti del kernel, consentendo di riutilizzare le pagine slab tra diversi cgroup, invece di riservare cache slab separate per ogni cgroup.
L'approccio proposto permette di migliorare l'efficienza dell'uso delle slab, ridurre la dimensione della memoria utilizzata per le slab del 30-45% e diminuire significativamente il consumo complessivo di memoria da parte del kernel. La riduzione del numero di slab non spostabili porta a un effetto positivo nella riduzione della frammentazione della memoria. Il nuovo controller di memoria semplifica notevolmente il codice per il tracciamento delle slab e non richiede l'uso di algoritmi complessi per la creazione e l'eliminazione dinamica delle cache slab per ogni cgroup. Tutti i cgroup di memoria nella nuova implementazione utilizzano un set condiviso di cache slab, e la durata della vita delle cache slab non è più vincolata alla durata della vita stabilita tramite cgroup per l'uso della memoria.
Il tracciamento più preciso delle risorse nel nuovo controller slab dovrebbe teoricamente caricare di più la CPU, ma nella pratica le differenze si sono rivelate trascurabili. In particolare, il nuovo controller slab è già in uso da diversi mesi sui server di Facebook, gestendo vari tipi di carico, e non sono stati riscontrati regressi significativi. È stato invece osservato un notevole abbattimento del consumo di memoria: su alcuni host si è riusciti a risparmiare fino a 1 GB di memoria, ma questo valore dipende fortemente dalla natura del carico, dalla dimensione complessiva della RAM, dal numero di CPU e dalle caratteristiche del lavoro con la memoria. I test precedenti mostravano una riduzione del consumo di memoria di 650-700 MB (42% della memoria slab) sul front-end web, 750-800 MB (35%) su un server con cache DBMS e 700 MB (36%) su un server DNS.
Fonte: opennet.ru
