Gli ingegneri di Facebook (vietata in RF) hanno pubblicato un rapporto sull'implementazione dell'anno scorso della tecnologia TMO (Transparent Memory Offloading), che consente di risparmiare notevolmente memoria operativa sui server trasferendo i dati secondari non necessari per l'esecuzione su unità di archiviazione più economiche, come i dischi NVMe SSD. Secondo Facebook, l'uso di TMO consente di risparmiare dal 20 al 32% di RAM su ogni server. La soluzione è progettata per essere utilizzata in infrastrutture in cui le applicazioni vengono eseguite in container isolati. I componenti di TMO in esecuzione lato kernel sono già inclusi nel kernel di Linux.
Lato kernel, il funzionamento della tecnologia è garantito dal sottosistema PSI (Pressure Stall Information), fornito a partire dalla versione 4.20. PSI è già utilizzato in vari gestori di mancanza di memoria e consente di analizzare le informazioni sui tempi di attesa per ottenere varie risorse (CPU, memoria, input/output). Grazie a PSI, i gestori nello spazio utente possono valutare con maggiore precisione il livello di carico del sistema e il tipo di rallentamento, il che consente di identificare deviazioni nella fase più precoce, quando esse non influiscono ancora visibilmente sulle prestazioni.
Nello spazio utente, il funzionamento di TMO è garantito dal componente Senpai, che attraverso cgroup2 corregge dinamicamente il limite di memoria per i container delle applicazioni basandosi sui dati ottenuti da PSI. Senpai analizza i segnali di inizio mancanza di risorse tramite PSI, valuta la sensibilità delle applicazioni al rallentamento dell'accesso alla memoria e cerca di determinare la dimensione minima di memoria necessaria al container, in cui i dati richiesti per il funzionamento rimangono in RAM, mentre i dati accessori, accumulati nella cache dei file o non utilizzati direttamente in quel momento, vengono trasferiti nella memoria virtuale.

Pertanto, l'essenza del TMO è quella di mantenere i processi a dieta rigorosa in termini di consumo di memoria, forzando il trasferimento delle pagine di memoria inutilizzate nell'area di swap, la cui rimozione non incide notevolmente sulle prestazioni (ad esempio, le pagine con codice utilizzato solo durante l'inizializzazione e i dati usati sporadicamente nella cache su disco). A differenza della rimozione delle informazioni nell'area di swap in risposta a una mancanza di memoria, nel TMO i dati vengono rimossi sulla base di previsioni proattive.
Uno dei criteri per la rimozione è l'assenza di accesso alla pagina di memoria per un periodo di 5 minuti. Tali pagine vengono definite fredde (cold memory page) e in media rappresentano circa il 35% della memoria delle applicazioni (a seconda del tipo di applicazione si osserva una variazione dal 19% al 65%). Durante la rimozione si tiene conto dell'attività legata alle pagine di memoria anonima (memoria allocata dall'applicazione) e della memoria utilizzata per la cache dei file (allocata dal kernel). In alcune applicazioni, il consumo principale è legato alla memoria anonima, ma in altre è significativa anche la cache dei file. Per evitare uno squilibrio nella rimozione della memoria nella cache, nel TMO viene applicato un nuovo algoritmo di swap che rimuove pagine anonime e pagine legate alla cache dei file in modo proporzionale.
La rimozione di pagine raramente utilizzate nella memoria più lenta non influisce molto sulle prestazioni, ma consente di ridurre significativamente i costi dell'hardware. I dati vengono spostati su unità SSD o in un'area di swap compressa nella memoria RAM. In termini di costo per byte di dati, l'uso di NVMe SSD è fino a 10 volte più economico dell'uso della compressione nella RAM.

Fonte: opennet.ru
