Delle nuove patch Linux, attualmente in fase di revisione, consentono di utilizzare un’istruzione AMD, introdotta con l’architettura Zen 3, che consente di invalidare le voci TLB per una serie di pagine con broadcast. In precedenza però, l’uso di queste istruzioni era limitato, poiché non supportate dai processori Intel. La nuova serie di patch consente ora di riutilizzarli, a tutto vantaggio delle prestazioni, anche di processori meno recenti.
Linux: nuove patch consentono di utilizzare un’istruzione AMD precedentemente limitata
L’istruzione INVLPGB che potrà ora essere utilizzata grazie alle nuove patch Linux, è compatibile sia con le CPU con architettura Zen 3 che, ovviamente, anche le più recenti Zen 4 e 5. Sebbene esistesse già il supporto per tale istruzione nel compilatore GCC (GNU Compiler Collection), insieme a un utilizzo limitato da parte del codice KVM, il kernel non ha mai ampiamente utilizzato l’istruzione, la quale avrebbe già in passato consentito di beneficiare di un grosso aumento prestazionale, in parte perché gli ingegneri Intel eseguono la maggior parte delle nuove ottimizzazioni x86 direttamente all’interno del kernel.
A partire da oggi, tuttavia, uno sviluppatore open source ne ha reso possibile l’utilizzo completo grazie a 10 patch, con cui è possibile invalidare le voci TLB su CPU remote senza dover inviare IPI, nonché attendere che i processori remoti gestiscano tali interruzioni. Inoltre, l’istruzione comporta anche una minore interruzione per qualsiasi carico di lavoro in esecuzione sulle CPU interessate.
Ovviamente, ciò che più c’è di interessante sono i vantaggi prestazionali per gli utenti Linux, come anche spiegato nel dettaglio nella patch:
“Insieme alla rimozione delle chiamate lru_add_drain non necessarie (vedere https://lkml.org/lkml/2024/12/19/1388), questo si traduce in un bel miglioramento delle prestazioni per il test tlb_flush2_threads will-it-scale su un sistema AMD Milan con 36 core:
– kernel vanilla: 527k loop/secondo
– rimozione lru_add_drain: 731k loop/secondo
– solo INVLPGB: 527k loop/secondo
– lru_add_drain + INVLPGB: 1157k loop/secondo
La profilazione con solo le modifiche INVLPGB ha mostrato che mentre l’invalidazione TLB è scesa dal 40% del tempo CPU totale a solo circa il 4% del tempo CPU, la contesa si è semplicemente spostata sul blocco LRU.
Correggendo entrambi contemporaneamente si raddoppia circa il numero di iterazioni al secondo da questo caso.”
Si tratta di benefici che impattano direttamente la produttività, dove le prestazioni sono praticamente raddoppiate. La patch per Linux abilita anche Translation Cache Extensions (TCE), mentre i flush TLB locali vengono ora usati nei processi a thread singolo.