Sto leggendo sul pacchetto go "runtime" e vedo che posso tra l'altro (func GOMAXPROCS (n int)) impostare il numero di unità CPU che possono essere utilizzate per eseguire il mio programma. Posso forzare una goroutine per essere eseguita su una CPU specifica di mia scelta?è possibile forzare una routine di go da eseguire su una CPU specifica?
risposta
Nel moderno Go, non vorrei bloccare le goroutine ai thread per l'efficienza. Vai 1.5 added goroutine scheduling affinity, to minimize how often goroutines switch between OS threads. E qualsiasi costo delle migrazioni rimanenti tra le CPU deve essere valutato rispetto al vantaggio del programma di pianificazione in modalità utente, evitando gli switch di contesto in modalità kernel. Infine, quando i costi di commutazione sono un problema reale, a volte una migliore messa a fuoco sta cambiando la logica del programma in modo che debba passare meno, come comunicando lotti di lavoro anziché singoli elementi di lavoro.
Ma anche considerando tutto questo, a volte devi semplicemente bloccare una goroutine, come quando l'API C lo richiede, e presumo che sia il caso qui sotto.
Se l'intero programma viene eseguito con GOMAXPROCS=1
, poi it's relatively simple to set a CPU affinity by calling out to the taskset utility from the schedutils package.
Avevo pensato che fossi sfortunato se GOMAXPROCS > 1
perché poi goroutines are migrated between OS threads at runtime. Infatti, James Henstridge sottolinea che è possibile utilizzare runtime.LockOSThread()
per impedire la migrazione della goroutine. Tuttavia, non conosco alcuna funzione Go stdlib per impostare l'affinità della CPU del thread corrente dopo aver bloccato una goroutine. Potresti essere in grado di utilizzare cgo e chiamare pthread_setaffinity_np
, poiché apparentemente Go uses pthreads in cgo mode. Dato che stiamo parlando di chiamate di sistema, i dettagli variano a seconda del sistema operativo.
(Se il vostro intero programma è puro Go (senza C collegata in), si può lavorare per chiamare sched_setaffinity
con un parametro pari a zero pid
tramite il modulo syscall
. Ma che sta per essere difficile.)
Puoi bloccare una goroutine su un particolare thread del sistema operativo con 'runtime.LockOSThread'. Questo potrebbe essere usato insieme alle routine di affinità della CPU OS sottostante per raggiungere l'obiettivo. –
Oh, grazie! In aggiornamento. – twotwotwo
dipende dalla vostra carico di lavoro, ma a volte è utile avviare un processo di go per CPU, impostare gomaxprocs su 1 e collegare il processo alla CPU con tasket. Ecco un estratto su questo argomento dalla libreria fasthttp impressionante:
- Usa reuseport ascoltatore.
- Eseguire un'istanza server separata per core CPU con GOMAXPROCS = 1.
- Pin ogni istanza del server su un core CPU separato utilizzando taskset.
- Verificare che gli interrupt della scheda di rete multiqueue siano equamente distribuiti tra i core della CPU. Vedi this article per i dettagli di .
- Utilizzare Go 1.6 in quanto fornisce alcuni notevoli miglioramenti delle prestazioni.
Fonte: https://github.com/valyala/fasthttp#performance-optimization-tips-for-multi-core-systems
- 1. forzare EventListener javascript da eseguire una volta?
- 2. È possibile accedere al collegamento solo da una pagina specifica?
- 3. È possibile eseguire una sequenza di assemblaggio x86 da C#?
- 4. Come posso scorrere su una stringa da rune in Go?
- 5. È possibile eseguire BitBlt direttamente da una bitmap GDI +?
- 6. È possibile eseguire una riduzione su un array con openmp?
- 7. HQL: è possibile eseguire un JOIN INTERNO su una sottoquery?
- 8. è possibile eseguire una funzione eseguire codice da una stringa nello stack?
- 9. Scorrimento di una vista testo su una linea specifica
- 10. È possibile eseguire una corrispondenza di stringa parziale su una chiave di stringa del dizionario?
- 11. È possibile eseguire una stringa in MySQL?
- 12. È possibile eseguire una sottoquery con Sequelize.js?
- 13. Come eseguire il servizio WCF su una porta specifica
- 14. È possibile noleggiare cicli della CPU?
- 15. È possibile misurare errori di previsione delle branch su una CPU Intel Core moderna?
- 16. Come eseguire una classe Main specifica da un jar
- 17. È possibile eseguire il rendering di script Android su GPU?
- 18. Come posso suggerire dinamicamente una diramazione su una CPU x64?
- 19. Forza una localizzazione specifica da utilizzare per una destinazione
- 20. È possibile eseguire contemporaneamente due processi su un core della CPU?
- 21. Cosa succede in una routine di servizio di interrupt?
- 22. È possibile eseguire UPnP Discovery da Javascript?
- 23. Rimuovere una parola specifica da una stringa
- 24. È possibile utilizzare una lingua diversa da VBScript per eseguire a livello di codice test QTP?
- 25. Forzare NSLocalizedString per utilizzare una lingua specifica utilizzando Swift
- 26. dati Unmarshal JSON in una struttura specifica in Go
- 27. È possibile eseguire una convalida "dry run" dei file?
- 28. È possibile eseguire CUDA su GPU AMD?
- 29. È possibile creare una tabella temporanea su un server collegato?
- 30. Esiste una routine veloce GetToken per Delphi?
FWIW andare 1,5 si dice che abbia un "scheduler intelligente" che CPU in modo più accurato per evitare di cache misses corso tra le routine go. Immagino che sia un po 'come l'affinità della CPU ... – rogerdpack