Ana Sayfa

Okuma Kilitleri Dostunuz Değil: Performans Beklentileri Nasıl Yanıltır?

1 dk okuma

Bir Rust projesinde yüksek performanslı bir Tensor Cache olan Redstone'u geliştirirken, yazma kilitleri ile ilgili bir darboğazla karşılaşan geliştirici, bu sorunu okuma kilitleriyle (RwLock) çözebileceğini düşünmüştür. Ancak yapılan testler, okuma ağırlıklı bir önbellek iş yükünde RwLock'un, Mutex'e kıyasla yaklaşık 5 kat daha yavaş olduğunu ortaya koymuştur. Geleneksel beklentilerin aksine, çoklu okuma erişiminin performansı artırması gerekirken, sonuçlar tam tersini göstermiştir.

Bu beklenmedik durumun temel nedeni, modern çok çekirdekli işlemcilerdeki "Cache Line Ping-Pong" fenomenidir. Bir RwLock'ta .read() fonksiyonu çağrılsa bile, donanım seviyesinde gizli bir yazma işlemi gerçekleşir. Bu, kiliti tutan okuyucu sayısını takip etmek için dahili bir atomik sayacın artırılmasını içerir. Bir çekirdek bu sayacı artırdığında, sayacı içeren önbellek hattının özel sahipliğini alır. Başka bir çekirdek kısa bir süre sonra kilidi okumaya çalıştığında, ilk çekirdek değişikliğini L3 önbelleğe/RAM'e yazmalı ve ikinci çekirdek bu önbellek hattını dahili veri yolu üzerinden çekmelidir. Bu durum, ilk çekirdeğin kopyasını geçersiz kılar.

Önbellek araması gibi son derece hızlı bir işlemde, iş parçacıkları kilitin dahili okuyucu sayacı değişkeninin sahipliği için mücadele etmekten, asıl işi yapmaktan daha fazla zaman harcarlar. Bu atomik çekişme ve önbellek hattı ping-pong'u, paylaşılan okuma erişiminin teorik faydalarını ortadan kaldırır. Sonuç olarak, Apple Silicon M4 gibi ticari donanımlarda, belirli yüksek çekişmeli, okuma ağırlıklı senaryolarda RwLock, basit bir Mutex'ten daha az verimli hale gelir.

İçgörü

Geleneksel performans optimizasyonları, modern çok çekirdekli işlemci mimarilerinde beklenmedik performans düşüşlerine yol açabilir.

Kaynak