TCP stack pro miliony spojení

ondra.novacisko.cz

TCP stack pro miliony spojení
« kdy: 02. 10. 2010, 19:58:00 »
Zdravím.

Napadá někoho řešení subj.? Potřebuju rozběhat push server, na kterém by viselo mnoho (statisíce až miliony) spojení, které ale po většinu času nekomunikují, pouze jsou otevřená pro případnou zprávu. Je mi jasné, že sem tam se bude muset odeslat nějaké to keep alive (a při tolika spojení to bude docela slušný síťový provoz), ale omezení vidím většinou v možnostech operačního systému (linux).

Neznáte někdo nějaké řešení (knihovnu, ovladač do linuxu), kde by se něco takového řešilo? Pokud bych musel sáhnout po UDP, bylo by to bez problémů. Ale zadání je TCP protokol


whatever


Leoš

Re: TCP stack pro miliony spojení
« Odpověď #2 kdy: 04. 10. 2010, 10:21:46 »
Napadají mně dva možné přístupy: buď pomocí NPTL vytvořit pro správu každého spojení thread (nebojte se spousty threadů, NPTL je velmi efektivní), nebo použít menší množství threadů (možná i procesů) kde každý bude obsluhovat více spojení pomocí epoll. Já bych se tedy od takových low-level záležitostí oprostil programováním v Javě kde JVM jak NPTL thready tak epoll vyřeší za mě, ale to už je věc osobního vkusu...

x

Re: TCP stack pro miliony spojení
« Odpověď #3 kdy: 04. 10. 2010, 10:34:20 »
V prvni rade je nutna poradna sitovka, dale nastaveni mbufs (slab na Linuxu nebo jak to je), podle toho taky RAM, neit nepotrebne veci v systemu atd.

faha

Re: TCP stack pro miliony spojení
« Odpověď #4 kdy: 04. 10. 2010, 11:58:25 »
Diky, o NPTL jsem netusil, je to docela zajimave az "brutalni".
In tests, NPTL succeeded in starting 100,000 threads on a IA-32 in two seconds. In comparison, this test under a Linux kernel without NPTL would have taken around 15 minutes.

Napadají mně dva možné přístupy: buď pomocí NPTL vytvořit pro správu každého spojení thread (nebojte se spousty threadů, NPTL je velmi efektivní), nebo použít menší množství threadů (možná i procesů) kde každý bude obsluhovat více spojení pomocí epoll. Já bych se tedy od takových low-level záležitostí oprostil programováním v Javě kde JVM jak NPTL thready tak epoll vyřeší za mě, ale to už je věc osobního vkusu...


daniel

Re: TCP stack pro miliony spojení
« Odpověď #5 kdy: 04. 10. 2010, 12:51:16 »
ja bych pouzil spis mene threadu/procesu a epoll - rozhodne to bude mit mensi narocnost na pamet a pro pouziti jako cekajici spojeni to je vyhovujici..  tech 1M spojeni ma byt na jednom PC? To pri nejake akci bude mit lag minimalne 0.5sec (kdyz vezmeme 64B minimal payload na eth * 8 = 512 mbit dat). Takze pozor i na to co prenasime - v pripade 640B http head + body to je jiz 5 sec v idealnim pripade!

Re: TCP stack pro miliony spojení
« Odpověď #6 kdy: 04. 10. 2010, 13:22:20 »
riesim podobny problem, nakoniec na win, .net 4.0, SocketAsyncEventArgs

Tiez chcem  obyst http, overhead by bol niekolkonasobny.

ondra.novacisko.cz

Re: TCP stack pro miliony spojení
« Odpověď #7 kdy: 05. 10. 2010, 09:45:57 »
ja bych pouzil spis mene threadu/procesu a epoll - rozhodne to bude mit mensi narocnost na pamet a pro pouziti jako cekajici spojeni to je vyhovujici..  tech 1M spojeni ma byt na jednom PC? To pri nejake akci bude mit lag minimalne 0.5sec (kdyz vezmeme 64B minimal payload na eth * 8 = 512 mbit dat). Takze pozor i na to co prenasime - v pripade 640B http head + body to je jiz 5 sec v idealnim pripade!

No nebude to HTTP, chtěl jsem původně redukovat množství PC na minimum. Účelem je mít ta spojení otevřená, 99.9999% tam nebude žádný provoz.  Ale jde o to, že uživatel má po cestě všechny proxy, naty a buh ví jaký balast otevřený, takže mu mohu poslat zprávu kdykoliv, jako by uživatel sám byl aktiv... nemusí dělat pooling.

Příklad případu užití. Notifikátor došlé pošty... který informuje v okamžiku, kdy pošta dorazí do schránky, a nikoliv za nějakých X minut. Tím se mimojiné redukuje datový provoz, protože pooling je rozhodně náročnější na data a na výkon server, než push.

David Strejc

Re: TCP stack pro miliony spojení
« Odpověď #8 kdy: 05. 10. 2010, 11:05:13 »
Ja vim, ze programovani naprosto nerozumim, nevim jak se jmenuju a nevim proc co jak kdy ... Ale vo tom U - Nix - U jsem cetl v jedny knizce.

Co to udelat vobracene?

Co napsat do toho klienta, aby se dotazoval? Ne udrzovat ty spojeni votevreny ;o)

Re: TCP stack pro miliony spojení
« Odpověď #9 kdy: 05. 10. 2010, 16:02:15 »
David Strejc: a vyhody ? pripojit sa a odpojit je celkom slusny overhead.

Logik

  • *****
  • 993
    • Zobrazit profil
    • E-mail
Re: TCP stack pro miliony spojení
« Odpověď #10 kdy: 05. 10. 2010, 16:29:35 »
No, vzhledem k tomu, že se bude muset posílat každejch pět minut keepalive paket na milion serverů a přitom v 99.99999% nebudou potřeba posílat žádný data, tak je polling jednoznačně míň náročnej na zátěž linky....
 Jen udržování spojení stojí 1M počet spojení * 40B minimální velikost paketu * 2 odpověď = 80MB každejch pět minut).  To je přes 20GB denně...Samozřejmě, pokud by v těch samejch intervalech probíhal polling, tak je to lepší, ale jestli to je např. kvůli updatům aplikace, tak je taková četnost zbytečná...

Re: TCP stack pro miliony spojení
« Odpověď #11 kdy: 05. 10. 2010, 16:47:45 »
Jasne, zalezi od toho ci sa po linke bude posielat nieco 2x za den alebo kazdych par desiatok sec. Proste zalezi od vyuzitia. Pokial keepalive bude zasadne viac ako samotne data, straca to skoro zmysel.

push

Re: TCP stack pro miliony spojení
« Odpověď #12 kdy: 05. 10. 2010, 17:24:01 »
Napadá někoho řešení subj.? Potřebuju rozběhat push server, na kterém by viselo mnoho (statisíce až miliony) spojení, které ale po většinu času nekomunikují, pouze jsou otevřená pro případnou zprávu. Je mi jasné, že sem tam se bude muset odeslat nějaké to keep alive (a při tolika spojení to bude docela slušný síťový provoz), ale omezení vidím většinou v možnostech operačního systému (linux).

Neznáte někdo nějaké řešení (knihovnu, ovladač do linuxu), kde by se něco takového řešilo? Pokud bych musel sáhnout po UDP, bylo by to bez problémů. Ale zadání je TCP protokol

Já se vrátím na začátek - v čem konkrétně je problém a "ty omezení operačního systému (linux)" ? Udělal jste si aspoň nějaké benchmarky a testy, abyste lokalizoval potencionální slabá místa?

S miliónem spojení Linuxový kernel problémy mít nebude (samozřejmě předpokládám, že máte k dispozici adekvátní HW), zbytek je aplikační návrh. Takže za prvé první odstavec a následně zkuste být konkrétnější.

mat

Re: TCP stack pro miliony spojení
« Odpověď #13 kdy: 05. 10. 2010, 18:27:04 »
No pokud to půjde přes kernelový IP stack, tak např. limit počtu deskriptorů, pak limit paměti kernelu, dále je to čas procházení seznamu spojení (je to už přes hash nebo ne?) atd.

Zadání "TCP spojení"... Nedá se s tím zadáním něco dělat? To má být z mobilů? To bych kvůli baterii využil raději existujících standardních funkčních řešení (jak pro iP4 tak Android).

dvsdvsdv

Re: TCP stack pro miliony spojení
« Odpověď #14 kdy: 05. 10. 2010, 21:01:32 »
To je přes 20GB denně...Samozřejmě, pokud by v těch samejch intervalech probíhal polling, tak je to lepší, ale jestli to je např. kvůli updatům aplikace, tak je taková četnost zbytečná...
Nepocitam, ze pojde o updaty, skor o IM alebo podobnu interaktivnu komunikaciu; 20GB denne nikoho nezabije, aj ked v mnohom zalezi na houserovi / providerovi - niektori v pohode zvladaju aj 30krat viac, u inych by som si za to asi poriadne zaplatil.