İçeriğe geç
Muhammet Şafak
en

Go'da mutex mi, kanal mı? Çekişme altında ölçüm

Go 1.27'de sync.Mutex ve kanalları üç senaryoda, farklı goroutine ve P sayılarında ölçtük: hangisinin hızlı olduğu G ve P'ye bağlı.

Tan, elinde bir planla

Go · Eşzamanlılık · Ölçüm

Go'da mutex mi, kanal mı?

Paylaşılan durumu korumanın iki yolu, çekişme altında üç senaryoda ölçüldü. Kısa cevap yok: sonuç goroutine (G) ve P sayısına göre değişiyor.

Muhammet Şafak

Önce bağlam

Ölçüm ortamı ve güven düzeyi

  • OrtamGo 1.27.1 linux/arm64; Docker Engine 29.8.0, 12 vCPU, Apple M4 Pro. P değerleri cpuset ile ayrılmış vCPU gruplarıdır; konteyner ağsız, salt okunur, 4 GiB.
  • Güven düşük845 hücrenin 518'i (%61,3) bayraklı; eşik %15. Hız ve gecikme oranları bayraksız hücrelerden; görselde anılan bayraklı hücre bayrağıyla işaretlendi.
  • GecikmeGecikme değerleri logaritmik kovaların üst sınırıdır, kesin ölçüm değildir.

5×

Senaryo 1 · G=64, P=4

mutex'in p99 gecikmesi, tek yönlü kanala göre

Mutex p99 491.519 ns, tek yönlü kanal 98.303 ns. Throughput'ta fark %3,2 ve gürültü içinde: 7,69 M'ye karşı 7,94 M işlem/sn.

Senaryo 1 · G=64, P=8

P artınca tablo dönüyor

milyon işlem/sn

  • Mutex15,96
  • Tek yönlü kanal6,65
  • İstek-cevaplı kanal3,97
Mutex tek yönlü kanaldan 2,40×, istek-cevaplı kanaldan 4,02× hızlı. P=4'ten P=8'e mutex 2,08 kat hızlandı, kanal 0,84 katına indi; nedeni ölçülmedi.

Senaryo 1 · G=10.000, P=8

Çok goroutine: hız ve adalet

Çok goroutine: hız ve adalet
Yöntemİşlem/snJain adalet indeksiBayrak
Mutex14.878.9580,8237 (kıyas dışı)fairness_unexplained
Tek yönlü kanal2.052.681 (7,25× yavaş)0,9999yok
İstek-cevaplı kanal1.778.745 (8,36× yavaş)1,0000yok

Adalet sonucunu okurken

Mutex'in adaletsizliği açıklanamadı

  • UyarıDoğru okuma “mutex daha adaletsiz” değil, “mutex hücresindeki adaletsizlik açıklanamıyor”. Hücre fairness_unexplained bayrağı taşıyor.
  • NotKaynağın tasarım kuralı gereği bu bayrağı taşıyan hücreler modeller arası adalet kıyasına girmez. Mutex hücresi yalnız adalet bayrağı taşır; hız oranı geçerlidir.

Senaryo 2 · G=64, P=4

Okuma ağırlıklı yük

Okuma ağırlıklı yük
Okuma oranıMutexSahip-goroutine kanalıFark
%509,86 M işlem/sn4,42 M işlem/snMutex 2,23× hızlı
%9012,23 M işlem/sn4,58 M işlem/snMutex 2,67× hızlı

Senaryo 3 · G=64, P=4

Üretici-tüketici kuyruğu

milyon işlem/sn

  • Tamponu 1 olan kanal6,91
  • Tamponsuz kanal5,41
  • sync.Cond'lu kuyruk (tampon 1.024)4,46
Tamponu 1 olan kanal tamponsuza göre 1,28×, sync.Cond'lu kuyruğa göre 1,55× hızlı. Tamponu 64 ve 1.024 olan kanal hücreleri bayraklı, dışarıda bırakıldı.

Bayraklı hücreler

Neyi iddiaya almadık

  • Senaryo 1P=1 ve P=2 hücreleri bayraklı; bu P değerleri için sonuç yazılmadı.
  • Senaryo 2%99 okuma hücresi bayraklı, oranı verilmedi. RWMutex hücreleri observer_effect bayrağı taşıyor.
  • Bayraklarfairness_unexplained 235, spread_p99 189, observer_effect 171, spread_throughput 125, calib_drift 72, spread_persistent 36.

Sınırlar

Bu ölçüm neyi söylemez

  • UyarıYük sentetik bir sayaçtır, üretim iş yükü değildir.
  • Notsync.Map ölçülmedi.
  • NotP değerleri sanal makine içindeki vCPU'lardır; fiziksel çekirdek değildir.
  • NotFarkların nedenleri ölçülmedi; görsel yalnız ne olduğunu gösterir.

Sonuç

“Hangisi daha hızlı?” sorusunun cevabı G ve P'ye bağlı.

Bu kayıt hangisinin daha hızlı olduğunu değil, hangisinin ne zaman hızlı olduğunu söylüyor. Nedenini bilmediğiniz bir davranışı üretimde varsaymayın, kendi P'nizde ölçün.

Paylaş ve indir

Sitede Ara

Yazı, proje ve sayfalarda arama yapmak için yazmaya başlayın.

Escile kapatPagefind ile güçlendirildi