SORU
26 ŞUBAT 2012, Pazar


Neden daha büyük bir havuzu kullanmak yerine uyumsuz ister?

Bu Techdays burada Hollanda'da sırasında Steve Sanderson C#5, ASP.NET MVC 4, and asynchronous Web. hakkında bir sunum yaptı

İstekleri bitirmek için uzun bir zaman alabilir, havuzu tüm konuları meşgul olmak ve yeni istekleri beklemek zorunda olduğunu açıkladı. Sunucu yükü kaldıramaz ve her şey yavaşlar.

O zaman uyumsuz webrequests kullanımı bu iş için başka bir iş parçacığı sonra temsilci olduğu için performansını nasıl geliştirdiğini ve havuzu hızla yeni gelen isteklere yanıt verebilir gösterdi. Hatta bu ve 50 eşzamanlı istekleri 50 * 1-yalnızca 1,2 olarak uyumsuz davranış ile toplam s ilk aldıkları belirlenmiştir demoed.

Ama bunu gördükten sonra hala bazı sorularım var.

  1. Neden daha büyük bir havuzu kullanabilir mi? Kullanarak başka bir iş parçacığı yavaş sonra baştan havuzu artırılması getirmek için bekliyor/uyumsuz değil mi? Ünlü sunucu birden fazla iş parçacığı veya bir şey almak gibi değil mi?

  2. Kullanıcı isteği hala zaman uyumsuz iş parçacığı için bekleyen. Eğer havuzu iş parçacığı başka bir iş yapıyor ise, nasıl '' konu meşgul etti? UI. Steve bir şey söz hakkında bir şeyler bittiğinde bilen akıllı bir çekirdek'. Nasıl oluyor bu iş?

CEVAP
27 ŞUBAT 2012, PAZARTESİ


Bu çok iyi bir soru ve bunu anlamak neden asenkron IO kadar önemli olduğunu anlamak için anahtardır. Yeni zaman uyumsuz/bekliyor özelliğini C# 5.0 eklendi sebebi asenkron kod yazma basitleştirmek için. Sunucu üzerinde zaman uyumsuz işleme desteği yeni değildir, ASP.NET 2.0 beri var.

Steve gösterdiğin gibi, senkron işleme ASP.NET (XML) her isteği iş parçacığı havuzu, bir iş parçacığı alır. O demoed sorunu bilinen bir sorun " deniriş parçacığı havuzu açlık". Eğer sunucuda senkron IO yaparsanız, iş parçacığı havuzu iş parçacığı bloke (hiçbir şey yapmadan) IO süresi için kalır. Beri orada bir sınır sayısı iş parçacığı, iş parçacığı havuzu, yük altında, bu yol açabilir bu durumda tüm iş parçacığı havuzu iş parçacığı vardır engellendiğini bekliyorum IO ve istekleri başlar olmaktan sıraya, neden artışa tepki süresi. Tüm konuları bir IO için tamamlamak için bekliyor beri, CPU işgal %0'a yakın tepki süreleri tavan olsa bile) göreceksiniz.

Ne soruyorsun (Neden daha büyük bir havuzu kullanabilir mi?çok güzel bir soru. Aslına bakarsanız, bu insanların çoğu şu ana kadar iş parçacığı havuzu açlık sorununu çözmek için nasıl: sadece iş parçacığı havuzu üzerinde. daha fazla konu var Microsoft bazı belgeleri bile iplik açlık havuzu durumlar için bir düzeltme oluşabilir gösterir. Bu kabul edilebilir bir çözümdür, ve kadar C# 5.0, çok daha kolay, kodunuzu yeniden yazmak daha tam olarak zaman uyumsuz olduğunu.

Bu yaklaşım olsa ile birkaç sorun vardır:

  • Tüm durumlarda çalışan değeri yoktur: ihtiyacımız olacak iş parçacığı havuzu iş parçacığı sayısı doğrusal IO süresi ve sunucu üzerindeki yükü bağlıdır. Ne yazık ki, IO gecikme çoğunlukla önceden kestirilemez. İşte bir örnek: Hadi 2 saniye tamamlamak için hangi ASP.NET uygulamanızın üçüncü parti bir web hizmeti için HTTP isteklerini yapmak demek. Senin için iş parçacığı havuzu boyutunu artırmak için karar, bu nedenle iş parçacığı havuzu açlık karşılaşma, diyelim ki 200 iş parçacığı, ve sonra daha iyi çalışmaya başlıyor. Sorun belki de gelecek hafta, web hizmeti 10 saniye tepki süresi artar, teknik sorunlar var. Ani, iş parçacığı havuzu açlıktan bütün konuları 5 kat daha uzun engellendiği için geri döndü, şimdi 5 kat sayısını artırmak için 1,000 konuları çok ihtiyacım var.

  • Ölçülebilirlik ve performansİkinci sorun eğer bunu yaparsanız, yine de istek başına bir iş parçacığı kullanır. Konuları pahalı bir kaynaktır. Her bir iş başardı .NET yığını için 1 MB bir bellek ayırma gerektirir. Bir web sayfası yapma IO son 5 saniye, ve bir sürü 500 istekleri saniyede gerekir 2,500 iş parçacığı iş parçacığı havuzu anlamına gelir 2.5 GB bellek yığınlarının konuları olacak oturup hiç bir şey yapmayacak. O zaman senin makine (makine üzerindeki tüm hizmetler web uygulama etkileyen) performansı üzerinde ağır bir bedel alacak bağlam geçişi meselesi var. Windows görmezden bekleyen iş de oldukça iyi bir iş yok olsa bile, ipler gibi çok sayıda işlemek için tasarlanmış değildir. En yüksek verimlilikte çalışan iş parçacığı sayısı makinede mantıksal CPU sayısı (16'dan fazla genellikle) eşit olduğunda elde edilir unutmayın.

Bu yüzden artan boyutu parçacığı havuzu bir çözüm, ve insanların neler yaptınız bunun için on yıl (hatta Microsoft'un kendi ürünleri), sadece daha az ölçekli ve verimli, açısından bellek ve CPU kullanımı, ve sen her zaman rahmet ani bir artış IO gecikme olmasına neden olacak açlık. Ana kadar C# 5.0 asenkron kod karmaşıklığı pek çok insan için değmeyeceğini. zaman uyumsuz/değişiklikler şimdi, asenkron IO ölçülebilirlik yararlanabilir ve basit bir kod yazarken her şeyi, aynı anda bekliyor.

Daha fazla bilgi: http://msdn.microsoft.com/en-us/library/ff647787.aspx "Aramalar zaman uyumsuz Web hizmeti çağrısı devam ederken, ek paralel işlem gerçekleştirmek için bir fırsat olduğunda, Web Hizmetleri veya uzak nesneleri çağırmak için kullanın. Mümkünse, (engelleme) senkron aramaları giden Web hizmeti çağrıları ASP.NET iş parçacığı havuzu iş parçacığı kullanılarak yapılır çünkü Hizmetleri Web önlemek için. Aramalar engelleme diğer gelen istekleri işlemek için kullanılabilir iş parçacığı sayısını azaltmak."

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • celebrateubuntu

    celebrateubu

    23 Mayıs 2011
  • Dylan Brenan

    Dylan Brenan

    22 Aralık 2009
  • MikeyMacintosh

    MikeyM

    28 Aralık 2009