Gitme paketi "çalışma zamanı" hakkında bilgi alıyorum ve diğerlerinin arasında (func GOMAXPROCS (n int)) programımı çalıştırmak için kullanılabilecek CPU birimi sayısını ayarladığımı görüyorum. Seçtiğim belirli bir CPU üzerinde çalıştırılmak için bir goroutine zorlayabilir miyim?belirli bir CPU üzerinde çalıştırmak için bir go rutin zorlamak mümkün mü?
cevap
Modern Go'da, verimlilik için iş parçacıklarına goroutines kilitlenmez. 1.5 added goroutine scheduling affinity, to minimize how often goroutines switch between OS threads'a gidin. Ayrıca, CPU'lar arasındaki kalan geçişlerin maliyeti, kullanıcı modu zamanlayıcısının yararına karşı, bağlam anahtarlarının çekirdek moduna geçmesinden kaçınılmalıdır. Son olarak, anahtarlama maliyetleri gerçek bir problem olduğunda, program mantığınızı değiştirirken daha iyi odaklanmak, böylece bireysel çalışma öğeleri yerine işlerin toplu işlerini iletmek gibi daha az değişmek zorundadır.
Ancak, tüm bunları göz önünde bulundururken, bazen bir C API'sinin gerektirdiği gibi bir goroutini kilitlemek zorundasınız, ve bu durumun aşağıdaki gibi olduğunu varsayacağım.
tüm program daha sonra GOMAXPROCS=1
, it's relatively simple to set a CPU affinity by calling out to the taskset utility from the schedutils package ile çalışıyorsa.
GOMAXPROCS > 1
, o zaman goroutines are migrated between OS threads at runtime. Aslında, James Henstridge, goroutininizin geçişini önlemek için runtime.LockOSThread()
'u kullanabileceğinizi belirtiyor. Bununla birlikte, herhangi bir Go stdlib işlevini bilmiyorum, bununla birlikte geçerli bir iş parçacığının CPU benzeşimini ayarlamak için bir goroutine kilitledikten sonra. Görünüşe göre Go uses pthreads in cgo mode'dan beri cgo kullanabilir ve pthread_setaffinity_np
'u arayabilirsiniz. Sistem çağrılarından bahsettiğimizden, ayrıntılar OS'ye göre değişecektir.
Bir rutinini, belirli bir OS iş parçacığına 'runtime.LockOSThread' ile kilitleyebilirsiniz. Bu, hedefe ulaşmak için temel OS CPU afinite rutinleri ile birlikte kullanılabilir. –
Oh, teşekkürler! Güncelleniyor. – twotwotwo
Aşağıdaki yerlerde de bağlıdır (sizin tüm program saf Git (hayır C bağlantılı), bu syscall
modülü aracılığı ile sıfır pid
parametreyle sched_setaffinity
aramaya çalışabilir. Ama bu zor olacak. Eğer) iş yükü, ancak bazen CPU başına bir işlem başlatma, gomaxprocs'i 1'e ayarla ve işlemciyi CPU ile CPU'ya sabitlemede faydalıdır.
- Kullanım reuseport dinleyici: Burada müthiş fasthttp kitaplığından bu konuda bir alıntıdır.
- GOMAXPROCS = 1 ile CPU çekirdeği başına ayrı bir sunucu örneği çalıştırın.
- Her sunucu örneğini taskset kullanarak ayrı bir CPU çekirdeğine sabitleyin.
- Çok amaçlı ağ kartının kesintilerinin CPU çekirdeği arasında eşit olarak dağıtıldığından emin olun. ayrıntıları için this article ayrıntılarına bakın.
- Önemli performans iyileştirmeleri sağladığından, Go 1.6'yı kullanın.
Kaynak: https://github.com/valyala/fasthttp#performance-optimization-tips-for-multi-core-systems
- 1. ZeroMQ'yi bir Arduino üzerinde çalıştırmak mümkün mü
- 2. Bir "Herhangi bir CPU" derlenmiş uygulama 64bit işletim sistemi üzerinde 32bit modunda çalıştırmak için zorlamak için bir yolu var mı?
- 3. Simülatörde ARKit çalıştırmak mümkün mü?
- 4. ASP.NET'te bir oturum ayarlamak için uyumsuz çağrı çalıştırmak mümkün mü?
- 5. xUnit.net'de, testleri sırayla çalıştırmak mümkün mü?
- 6. Bir Windows XP ve .NET Framework uygulaması çalıştırmak mümkün mü
- 7. Bir TideSDK App içinde CodeIgniter çalıştırmak mümkün mü?
- 8. Linux PowerPC tabanlı Nodejs çalıştırmak mümkün mü?
- 9. Kubernet'leri bir docker kabı olarak çalıştırmak mümkün mü?
- 10. Bir maven fazına bağlı belirli bir hedefi tekilleştirmek ve çalıştırmak mümkün mü?
- 11. Bir bilgisayarda birden fazla jvm çalıştırmak mümkün mü?
- 12. mysqldump'ın belirli bir tablo için ekleri atlamasını sağlamak mümkün mü?
- 13. Yalnızca belirli bir özellik için bağlamayı işlemek mümkün mü?
- 14. Sadece belirli bir android sürümü için widget göstermek mümkün mü?
- 15. Bölüm için Rutin
- 16. VS2010'da tek bir dosyada stylecop'u çalıştırmak mümkün mü?
- 17. FindBug'leri yalnızca bir Java sınıfına karşı çalıştırmak mümkün mü?
- 18. Jupyter dizüstü bilgisayarında bir pypy çekirdeği çalıştırmak mümkün mü?
- 19. iPhone'un arka planında ivmeölçer çalıştırmak mümkün mü?
- 20. Windows XP'de CoreCLR'yi çalıştırmak mümkün mü?
- 21. XAML'deki bir TemplateBinding üzerinde bir dönüştürücü kullanmak mümkün mü?
- 22. PHP'de anonim bir dizinin belirli bir öğesine başvurmak mümkün mü?
- 23. Belirli bir satıra vim'de yeni bir sekme açmak mümkün mü?
- 24. Belirli bir IP'ye selenyum bağlama - Mümkün mü? Birçoğunuz gibi
- 25. Tüm DateTime özelliklerini DateTime2 olarak modellemeye zorlamak mümkün mü?
- 26. Ağ trafiğini Wifi veya TMobile ağı üzerinden zorlamak mümkün mü?
- 27. JavaScript'i kullanmadan önce değişkenleri bildirmeye zorlamak mümkün mü?
- 28. Tarayıcıyı aynı sayfayı hash ile yeniden yüklemeye zorlamak mümkün mü?
- 29. Go lang'deki CPU sayısını nasıl bulabilirim?
- 30. Highcarts'ı bir çizgi grafiğindeki tüm seriler için daire sembolünü kullanmaya zorlamak mümkün mü?
FWIW 1.5 önbellek gitmek rutinleri arasında gidip özlüyor önlemek için daha doğru bir "akıllı zamanlayıcı" CPU buna sahip olduğu söylenir gidin. Sanırım CPU çekiciliğine benziyor ... – rogerdpack