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

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.
Ö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
Senaryo 1 · G=10.000, P=8
Çok goroutine: hız ve adalet
| Yöntem | İşlem/sn | Jain adalet indeksi | Bayrak |
|---|---|---|---|
| Mutex | 14.878.958 | 0,8237 (kıyas dışı) | fairness_unexplained |
| Tek yönlü kanal | 2.052.681 (7,25× yavaş) | 0,9999 | yok |
| İstek-cevaplı kanal | 1.778.745 (8,36× yavaş) | 1,0000 | yok |
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 oranı | Mutex | Sahip-goroutine kanalı | Fark |
|---|---|---|---|
| %50 | 9,86 M işlem/sn | 4,42 M işlem/sn | Mutex 2,23× hızlı |
| %90 | 12,23 M işlem/sn | 4,58 M işlem/sn | Mutex 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
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.