I consigli di Arvid Norberg per la realizzazione di software ad alte prestazioni



Arvid Norberg, forte della lunga esperienza acquisita sulla sviluppo di uTorrent, ha stilato sul blog di libtorrent una interessante lista di principi per lo sviluppo di programmi ad alte prestazioni.

Li riassumo brevemente, e vi consiglio vivamente di leggere integralmente il post originale.


A suo dire, le due cause fondamentali di problemi di prestazioni sono:
  1. Latenza della memoria. Un grosso problema di prestazioni nei computer moderni è la latenza della SDRAM. La CPU resta parecchio tempo inattiva in attesa che l'operazione di lettura dalla RAM venga completata.
  2. Context Switching. Quando una CPU commuta contesto la memoria a cui accederà probabilmente non sara' correlata alla memoria del contesto precedente. Ciò comporta la necessita' di svuotare la cache precedente, obbligando il processo legato al nuovo context a caricare i relativi dati dalla RAM, rallentandone l'esecuzione.
Propone anche 7 regole per migliorare le prestazioni:
  1. Lavorare su logica batch. Evitare il Context Switching. Ad esempio, esistono versioni vettoriali di chiamate di sistema come writev() e readv() che operano in più di un elemento per ogni chiamata in modo da raggruppare il maggior numero di scritture possibili.
  2. Evitare i Magic Numbers. Non sono scalabili. Svegliare un thread ogni 100ms o quando 100 jobs sono in coda, oppure utilizzando buffer di dimensione fissa, mal si adatta al mutare delle circostanze.
  3. Allocare i buffer di memoria in anticipo, per evitare copie superflue e mantenere prevedibile l'utilizzo della memoria.
  4. Adattare organicamente le dimensioni delle code dei jobs per mantenere la granularità dello scheduler e il tempo necessario al risveglio del thread.
  5. Adattare le dimensioni del buffer di ricezione dei socket, evitando allo stesso tempo gli sconfinamenti di memoria out-of-the-kernel.
  6. Attendere sempre il completamento di tutti i lavori in coda di un thread prima di rimetterlo in sleep.
  7. Svegliare un thread solo quando il numero di jobs nella sua coda di lavoro passa da 0 a >0. Qualsiasi altro risveglio è ridondante e uno spreco di tempo.
Parte di questi concetti sono presenti anche in questa ottima presentazione (sempre di Norberg), intitolata Writing High-Performance Software:




Published: May 22 2014

  • category: