Saniyede 10000 TCP bağlantısını işleyecek bir sistem tasarlıyorum, hangi problemlerle karşılaşacağım?


18

CentOS çalıştıran nispeten yeni bir 8 çekirdekli kutum var. TCP kullanan bir istatistik sunucusu geliştirmek istiyorum. Çok basittir, bir TCP bağlantısını kabul eder, bir sayacı arttırır ve bağlantıyı kapatır. Yakalama, bunu en az saniyede 10k istek yapması gerektiğidir. CPU / Bellek sorun olmayacağından şüpheleniyorum, ancak bu tür bir hacme izin vermek için sunucumda yapılandırmanız gerekebilecek yapay sınırlarla (yarı açık bağlantılar gibi) daha fazla endişeliyim. Peki, bu mümkün mü? Hangi ayarlardan haberdar olmalıyım? NIC'im bunu kaldıramayacak mı?


1
gelen her bağlantı için konuları

1
Nihai sonuçlarınızı burada bildirdiğiniz için +1 :)
agsamek

Yanıtlar:


17

Bu yaygın olarak c10k problemi olarak bilinir . Bu sayfada karşılaşacağınız sorunlar hakkında birçok iyi bilgi var.


evet, iyi bağlantı!
sybreon

1
C10k sayfasında belirtilenlerden daha fazla / farklı problemler görmeyi beklerim. Saniyede 10k bağlantı kurmak ve kapatmak, 10k açık bağlantıya sahip olmaktan farklıdır. TIME_WAIT durumunda kalan bağlantılar bir olur, bir dinleme soketi için biriktirme listesi sınırına ulaşmak başka bir bağlantı olabilir. Ve bu use-case, çekirdek kodunda daha yaygın 10k açık bağlantılar durumundan daha fazla profil oluşturma / optimizasyon almadıysa şaşırmam.
cmeerw

2

bunu yapabilmelisiniz [bu muhtemelen kötü bir fikir olsa da].

ilgili reçine appserv i dört çekirdekli 2.6GHz Xeon'larda ~ 5k Tlp / sn alabilirsiniz. istekleri mysql'den 1 satır okuyan ve çok küçük xml yanıtı gönderen basit sunucu uygulamasını çağırır.

test ile yapıldı

ab -n 10000 -c 16 http://some/url/

Test sonuçları:

Concurrency Level:      16
Time taken for tests:   1.904 seconds
Complete requests:      10000
Failed requests:        0
Write errors:           0
Total transferred:      3190000 bytes
HTML transferred:       1850000 bytes
Requests per second:    5252.96 [#/sec] (mean)
Time per request:       3.046 [ms] (mean)
Time per request:       0.190 [ms] (mean, across all concurrent requests)
Transfer rate:          1636.42 [Kbytes/sec] received

ama bence her istek için yeni iplikler üretmeden, basit c programını kullanarak çok daha iyi olacaksınız. Greg Hewgill'in linki size bu konuda iyi fikir vermeli.

uzun süreli testler sırasında bile bağlantı ile ilgili herhangi bir sorun elde edemiyorum [bahsedilen yarı açık soketler]; test, gigabit ethernet üzerinden bağlanan iki linux kutusu arasında çalışır [her ne kadar bant genişliği bir darboğaz olmasa da].


OP'ler gibi her yanıttan sonra bağlantılarınız kapalı mı? Ab gönderme Bağlantı: başlığı kapatıyor mu?
Nate

1
@Nate http 1.0 - her http isteği için tek bağlantı.
pQd

1

Apache'yi yüklerken test ettiğim bir Linux çekirdek sınırı ile ilgilenebilirsiniz . Benim durumumda, çekirdek bazı yararlı hata mesajları üretti, bu yüzden tavsiyem programınızı yazmanız ve bir sınıra çarpıyor gibi görüyorsanız, çekirdek günlüklerine dikkat edin.


0

Mümkünse TCP yerine UDP kullanırdım. Daha hafif olmalı ve bu nedenle daha iyi ölçeklendirilmelidir.


Katılıyorum. UDP çok daha hafif olurdu
fpmurphy

1
UDP'nin gönderen ve teslimat doğrulamaları gibi dezavantajları vardır, bu nedenle üretimde UDP'yi kullanmadan önce bunları dikkate almak gerekir.
SaveTheRbtz

0

Nic'inizle başa çıkabilmeli, ancak saniyede 10k yeni TCP bağlantısına sahip olmanın tasarımını sorgularım; bu bağlantıları hızlı bir şekilde oluşturuyorsanız / yok ediyorsanız, a) daha uzun süre açık tutmanız veya b) bunun yerine UDP kullanmanız gerekir.

Zaman zaman bir sorgu yapması gereken, ancak yükün saniyede 10k çarpacağı 1M istemcileriniz varsa, UDP muhtemelen daha iyi bir seçimdir.

Sadece saniyede bir sorgu yapması gereken 10 bin istemcinizin olması durumunda, mevcut bağlantıları açık tutabilir ve yeniden kullanabilirler. Bu, işletim sistemi için çok daha nazik olacaktır ve her seferinde yeni bir el sıkışma gerektirmeyeceği için çok daha az gecikme üretecektir.

Saniyede 10 bin isteğiniz olduğunda, yine de bir ön uç yük dengeleyiciniz olduğunu düşünüyorum, bu yüzden bunu da test etmeniz gerekecek.

(Not: Bunun Stack Overflow'a ait olduğunu düşünüyorum)

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.