2013-06-28 13 views
14

ben almak işlemek ve saniyede 50,000 TCP isteklerine yanıt verecektir kurumsal yazılım son derece yüksek performanslı parça, inşa ediyorum. Bu, bir dizi Amazon EC2 sunucusuna yayılacak, ancak olabildiğince saniyede binlerce istek gerçekleştirebilecek tek bir sunucu almak istiyorum (5k/sn için çekim). Büyük olasılıkla Amazon Linux çalıştıran m1.xlarge örneğini kullanacağım.En Verimli Yüksek Performanslı Sunucu Soket/Konu Tasarımı

Ben Boost ASIO ile C++ bu yazılımı inşa ediyorum ve ben yuva yönetimi mimarisi en verimli şekilde anlamaya çalışıyorum. örneklerle (http://www.boost.org/doc/libs/1_53_0/doc/html/boost_asio/examples.html) olarak biz çalışana birden vCPUs gerekecek beri "HTTP Sunucusu 2" taklit doğru eğilim.

birisi gerçekten orada her HTTP sunucusu örneğinin artıları/eksileri tarif edebilir ve bu birçok bağlantıları ile uğraşan, ben herhangi bir ek bilgi takdir gerçekten istiyorum (Boost priz ile ilgili olarak, ve/veya yüksek verimli EC2 yapılandırması).

Çok teşekkürler!

+2

Saniyede 50k ileti tam olarak kesilmese de, buna "aşırı derecede yüksek performans" demezdim. http://www.marketdatapeaks.com/ –

+0

Benim için aşırı derecede yüksek performans.Tabii ki borsa büyüklüğünde değil (tabii ki daha büyük hacimli başka şirketler de var), ancak bu 50k'lık taleplerin her biri arka plan üzerinde yapılacak iyi bir işlem miktarına sahip (sadece statik dosyaları değil) oldukça yoğun düşünün. Bunun gibi herhangi bir deneyiminiz var mı? Teşekkürler! – Harry

+0

Yaparım, ama maalesef, bahsettiğiniz örnekleri bilmiyorum. –

cevap

0
Sen nonblocking yuvaları içine bakmak ve ayrı parçacığı üzerinde giriş/çıkış/işleme yaymak isteyebilirsiniz

. Bin bağlantı başına 3 yeni giriş/çıkış/işlem ipliği oluşturabilir misiniz?

Bu yardımcı olur umarım.

3

bazı öneriler:

Sen sunucu yapıyor gibi ne olup bittiğini söz etmedi. Saniyede 50 bin yeni istek kabul edip kapatacak ya da sadece kurulu TCP bağlantılarından gelen mesajları (istekleri) karşılayacak. Bu yüzden tavsiyem biraz genel olmalı.

  1. C10K sorunu Oku: http://www.kegel.com/c10k.html

  2. Invest yerine ASIO soket bildirim çözümü olarak epoll kullanarak. epoll zor değil.

  3. parçacığı sabit sayıda (2-8) kullanılarak düşünün. Ya soket bağlantılarını bu dişler arasında yük dengeleyebilir ya da sadece soket dişinden ayrılan istek mesajlarını servis etmek için bir iş parçacığı havuzu kullanın. Birden fazla iş parçacığı için tasarlayın, ancak sadece 1 iş parçacığı kullanarak başlayın. Ardından tüm performans sorunlarını çözün. Tek dişli çözümün iyi çalıştığını ve performansın en üst seviyeye gelmesini sağladıktan sonra, iş parçacığı sayısının, diğer iş parçacıkları engellendiğinde, birden çok işlemin işlenmesini sağlayacak şekilde artırmayı düşünün.

  4. Şansı sunucunuzun performans sorunları soket tasarımı dışında olacağından çok yüksektir. Kodun zamanının çoğunu nerede geçirdiğini anlamak için sürekli olarak kıyaslama ve valgrind gibi araçları çalıştırın. Şanslar yüksek, en az beklediğiniz yer. Örneğin, sunucumda, zamanın çoğunun küçük geçici tamponlar için bellek ayırıp harcadığını harcadım. Bunu asla tahmin edemezdim. Ardından bellek tasarımını ön bellek ayırmak, yığın belleği kullanmak vb. Değiştirdim. Performansı değiştirdiğimde performans ikiye katlandı.

+0

Destek asus'u epoll kullanıyor olmalı, bkz http://stackoverflow.com/questions/3106304/boost-asio-on-linux-not-using-epoll – mark

+0

Şimdilik benim için C10K problemi yok, bu link de overrated .. Geçtiğimiz günlerde projemizi kendinden yazılan epol reaktörden ASIO'ya taşıdım. Şimdi, her zaman arabası müşterisine 10 kez daha fazla bağlantı kurabilir ve gecikmezler; TLS, manuel kütüphane kullanımında çok iyi çalışıyor; şimdi tüm sunucu zamanlayıcıları epoll versiyonuna (zamanlayıcılar hakkında hiçbir şeye sahip olmayan) karşılıksızdır. Bir uyumsuzluk uygulaması sadece epoll değildir; Sadece üretimde öğreneceğiniz zamanlayıcılar, yorucu müşteriler ve diğer birçok şey – PSIAlt

İlgili konular