Paylaşılan durum performansı neden düşürüyor?


19

Eşzamanlı programlamanın paylaşım-hiçbir şey prensibi altında çalışıyorum. Esasen, tüm işçi iş parçacıklarım, aralarında hiç paylaşılmayan ( hatta referans olarak bile olsa ) aynı durumun değişmez salt okunur kopyalarına sahiptir . Genel olarak, bu gerçekten iyi çalıştı.

Şimdi, birisi tüm iş parçacıklarının aynı anda eriştiği kilitsiz tekli önbellek ( örneğin, statik bir sözlük ) tanıttı . Başlangıçtan sonra sözlük hiçbir zaman değiştirilmediğinden kilit yoktur. Herhangi bir İş Parçacığı Güvenliği sorunu olmadı, ancak şimdi performans düşüşü var.

Soru şu ki ... kilit yok, çünkü bu singletonun tanıtımı neden bir performans isabeti yaratıyor? Bunu açıklayabilecek kapakların altında tam olarak neler oluyor?

Onaylamak için, bu yeni singleton'a erişmek tek değişikliktir ve bunu sadece önbellek çağrısını yorumlayarak güvenilir bir şekilde yeniden oluşturabilirim.


8
Kodda bir profil oluşturucuyu işaret ettiniz mi?
Timo Geusch

2
Profilleme, CLR ve muhtemelen windows çekirdeğini profillemediğiniz sürece (ortalama programcı için kolay bir görev değil) bu soruya cevap vermesi olası değildir.
Igby Largeman

1
@JoeGeeky Tamam o zaman, sanırım burada benim için yapılacak tek şey +1 ve favoridir! Her ikisi de sonuçta aynı dolaylı seviyede olduğu ve yine de işlemci önbelleğine sığması gerektiği için garip görünüyor ...
Max

2
FWIT Birkaç konu açtım ve bazı zamanlayıcılar çalıştırdım. Bir sınıf, singleton, lockedSingleton ve <string, string> dict başlattım. Her birinin ilk somutlaştırılmasından sonra, herhangi bir nesne için ardışık çalışmalar yaklaşık 2000ns sürdü. Sözlük 2x daha yavaş koştu, yapıcı kodu neden olabilir ... tek başına kilitlemekten daha yavaştır. Tüm GC, işletim sistemi iş parçacığı kuyruğu ve diğer ek yükü göz önüne alındığında ... bu soruya gerçekten cevap verebileceğinden emin değilim. Ancak, sonuçlarımdan, sorunun Singletons ile ilgili olduğuna inanmıyorum. MSDN'de olduğu gibi uygulanmaz. Derleyici optimizasyonlarını içerir.
P.Brian.Mackey

1
@JoeGeeky - başka bir düşünce: önbellek kullanarak bir miktar dolaylılık ekliyor mu? Sık erişilirse, fazladan bir işaretçi deref (veya MSIL eşdeğerini) izlemek yerel daha az dolaylı bir kopyaya biraz zaman ekleyebilir.
sdg

Yanıtlar:


8

Değişmez durumun değişebilir bir şeyle bir önbellek hattı paylaşması olabilir. Bu durumda, yakınlardaki değişken durumuna bir değişiklik olabilir performans yavaşlatabilir çekirdek genelinde bu önbellek hattının, bir Resynch zorlama etkisi yaratır.


3
Bu false sharingsizin tanımladığınız bir senaryo gibi geliyor . Bunu izole etmek için L2 Önbellek profilini ihtiyacım olacak. Ne yazık ki, bunlar referans tipleridir, bu yüzden gerçekten olan şey bu ise, arabellek alanı eklemek bir seçenek olmayacaktır.
JoeGeeky

3

Sözlüğe anahtar olarak kullandığınız nesnelerin Equals()ve GetHashCode()yöntemlerinin, beklenmeyen, iş parçacığı dostu olmayan yan etkileri olmadığından emin olurum . Profil oluşturma burada çok yardımcı olacaktır.

Herhangi bir şans eseri anahtarlarınız dize ise, belki de orada var: söylentiler değişmez nesneler gibi davranır, ancak belirli optimizasyonlar uğruna dahili olarak uygulanabilir bir şekilde uygulanırlar, bunun çok iş parçacığına ilişkin olarak her şeyi içerir .

Sorunun paylaşılan veya sözlük tekilliği ile ilgili olup olmadığını görmek için tek bir yerine normal bir referans olarak kullanan iş parçacığı sözlüğü geçmeye çalışacağım. (Olası nedenleri ortadan kaldırmak.)

Kullanımının bazı şaşırtıcı sonuçlar vermesi durumunda, ConcurrentDictionarynormal yerine de denerdim Dictionary. ConcurrentDictionaryNormalden çok daha iyi veya daha kötü bir performans ortaya çıkarsa, eldeki sorun hakkında spekülasyon yapılması gereken birçok şey vardır Dictionary.

Yukarıdakilerin hiçbiri soruna işaret etmiyorsa, o zaman bozuk performansın, çöp toplayıcı iş parçacığı ve iş parçacıklarınızın geri kalanı arasındaki garip bir çekişmeden kaynaklandığını tahmin ediyorum. sözlüğünüzdeki nesnelerin iş parçacıklarınız tarafından erişilirken atılması veya atılmaması gerekir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.