2013-11-03 17 views
9

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ü?

+0

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

cevap

10

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.

+5

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. –

+0

Oh, teşekkürler! Güncelleniyor. – twotwotwo

1

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

İlgili konular