Project

General

Profile

Actions

Bug #504

closed

Nenažraný stahující klient

Added by Pavel Kácha over 12 years ago. Updated about 12 years ago.

Status:
Closed
Priority:
Normal
Assignee:
Jan Soukal
Category:
-
Target version:
Start date:
06/22/2012
Due date:
08/22/2012
% Done:

0%

Estimated time:

Description

Bodík: pokud prijimaci kllient nejakou dobu stoji a pak se probudi tak prijem vyOOMuje ten perl
Bodík: to se mi stalo kdyz sem si bootstrapoval databazi
Bodík: ono je to logicky
Bodík: ja sem si schvalne posunul ID na 1
Bodík: a ten perlo to potom neprijme
pharook: je potřeba limit kolik toho klient může stáhnout najednou, aby to nesáčkoval do paměti
Bodík: tohle se stane kazdymu kdo si spatne zacachruje s IDckem nebo se odmlci natolik ze pro nej bude nachystano prilis mnoho dat nez dokaze najednou zpracovat
Bodík: limit sme chteli ale zatim se nejak neimplementoval

Actions #1

Updated by Tomáš Plesník over 12 years ago

Pavel Kácha wrote:

Bodík: pokud prijimaci kllient nejakou dobu stoji a pak se probudi tak prijem vyOOMuje ten perl
Bodík: to se mi stalo kdyz sem si bootstrapoval databazi
Bodík: ono je to logicky
Bodík: ja sem si schvalne posunul ID na 1
Bodík: a ten perlo to potom neprijme
pharook: je potřeba limit kolik toho klient může stáhnout najednou, aby to nesáčkoval do paměti
Bodík: tohle se stane kazdymu kdo si spatne zacachruje s IDckem nebo se odmlci natolik ze pro nej bude nachystano prilis mnoho dat nez dokaze najednou zpracovat
Bodík: limit sme chteli ale zatim se nejak neimplementoval

Pridame, ale az do nove verze klietna, ne do warden-client-2.0.

Actions #2

Updated by Pavel Kácha over 12 years ago

  • Due date set to 08/08/2012
  • Assignee set to Jan Soukal
  • Target version set to 2.1

Opět, nejprve návrh. Může souviset s #519.

Actions #3

Updated by Jan Soukal over 12 years ago

Návrh

Problém: Dlouho "spící" přijímající klient po probuzení stahuje nadměrnou dávku dat, na kterou nemá dostatek paměti

Řešení: Stahovat zprávy nikoliv vše najednou, ale po rozumných dávkách. V současné podobě architektury zasahuje do API jak mezi klientem a serverem tak i mezi klientskou knihovnou a klientskou aplikací.

Poznámka: V tomto úkolu neřešíme problém "ochrany" serveru před nenažranými klienty (to řeší úkol #526). Zde jde o ochranu klientské aplikace před nechtěnou (mnohdy neočekávánou a výjimečnou) nadměrnou konzumací paměti i jiných zdrojů systému ze strany klientské knihovny. Pokud si uživatel záměrně nastaví a bude spouště klienta v "nenažraném" režimu, je to v zásadě jeho problém.

Klient-server API

Pravděpodobně není možné rozumně sdělit serveru, že klient požaduje omezené množství zpráv, jinak, než rozšířením současného API.

Varianty s rozšířením počtu atributů při registraci na Warden server o položku "max. počet zpráv najednou" neuvažuji. HW nároky představují problém na straně klienta a mohou se měnit v čase bez ohledu na stav registrace a klienta vůči serveru vůbec, proto je vhodné ponechat.

Nabízí se rozšířit volání serverové funkce getNewEvents, resp. objekt $request_data (SOAP::Data) o atribut MAX_EVENTS_TO_RECEIVE (vedle existujících REQUESTED_TYPE a LAST_ID). Server poté předá klientovi maximálně tolik zpráv, kolik je uvedeno v této hodnotě.

Zpětná kompatibilita

Nebude-li hodnota MAX_EVENTS_TO_RECEIVE uvedena (bude-li undef), lze klienta považovat za starou verzi, případně za klienta, kterému velké dávky zpráv nevadí. V takovém případě vrací server maximum možných zpráv (resp. menší z hodnot: počet nových zpráv, limit serveru pro velikost jedné dávky nových zpráv. viz #526)

API mezi klientskou aplikací a knihovnou

Úzce se dotýká #519.

TODO

Statické nastavení velikosti dávky

MAX_EVENTS_TO_RECEIVE v konfiguráku

TODO

Dynamické nastavení velikosti dávky

Dynamický atribut při voláni WardenClientReceive::getNewEvents

TODO

Actions #4

Updated by Jan Soukal over 12 years ago

API mezi klientskou aplikací a knihovnou

Návratové hodnoty

Úzce se dotýká #519. Je třeba vyřešit, jakým způsobem sdělit nadřazené aplikaci, zda byla stažena všechna data nebo byl vyčerpán limit a je vhodné spustit stahování znovu.

Lze řešit prostřednictvím rozšířené struktury návratových hodnot (řeší se v #519) - např. MAX_EVENTS_LIMIT_REACHED = true/false v hashi, kterou klientská funkce bude vracet.

Statické nastavení velikosti dávky

MAX_EVENTS_TO_RECEIVE v konfiguráku.

Dynamické nastavení velikosti dávky

Atribut v hashi při voláni WardenClientReceive::getNewEvents. (Opět souvisí s #519 a rozhraním funkcí).

Je-li atribut přítomný dynamicky při volání, neřeší se už hodnota nastavená v konfiguráku.

Actions #5

Updated by Pavel Kácha over 12 years ago

  • Due date changed from 08/08/2012 to 08/15/2012

Viz #519, komentář 3.

A z mailů:

Zatim zahrnu nacitani MAX_EVENTS_TO_RECEIVE automaticky z konfiguraku. Myslim, ze nez se dohodneme na (pripadne) zmene rozhrani (hashe, pole, objekty, ...), neni treba MAX_EVENTS_TO_RECEIVE resit jako dynamicky parametr pri volani funkce.

V #526 Tom v serverové konfiguraci zvolil MAX_EVENT_LIMIT, zvolil bych něco podobného (např. MAX_RECV_EVENTS_LIMIT, 'limit' je v konfiguracích poměrně obvyklý - postfix, dovecot, ulimit).

Actions #6

Updated by Tomáš Plesník over 12 years ago

Do serveru jsem pridal podporu pro $MAX_RCV_EVENTS_LIMIT viz revize 47e20d2e a posleze i 4422a2b2. Pokud klient neprijde s zadnym limitem, je pouzit limit serveru (zpetna kompatibilita), pokud prijde s limitem vyssim nez je limit serveru, tak je ignorovan a je pouzit limit serveru a pokud prijde s limitem, ktery je nizsi nez limit serveru, tak je konecne pouzit tento klientsky limit.

Actions #7

Updated by Jan Soukal over 12 years ago

Do klienta jsem pridal moznost nastavit v konfiguraku maximalni pocet udalosti, ktery muze klient v jedne davce (v jednom zavolani fce getNewEvents) maximalne obdrzet (revize 8165af3e).

#-------------------------------------------------------------------------------
# MAX_RCV_EVENTS_LIMIT - maximum number of events the client is allowed to get
#                        from the Warden server in one batch
#-------------------------------------------------------------------------------
$MAX_RCV_EVENTS_LIMIT = 50;

Neni v teto chvili nijak testovano (na strane klienta), zda je hodnota v konfiguraku uvedena nebo ne. Neni-li, na server se odesle undef. (Stejne tak zatim klient nijak nekontroluje format/tvar promenne)

TODO:
  • doplnit do changelogu, readme
  • zvazit, zda a jakou hodnotu nastavovat do konfiguraku implicitne pri instalaci (pripadne zda nabidnout uzivateli moznost si pri instalaci zvolit hodnotu parametrem) \
  • zvazit, zda vubec na klientske strane provadet nejake kontroly vstupu pri cteni z konfiguraku
Actions #8

Updated by Pavel Kácha over 12 years ago

  • Due date changed from 08/15/2012 to 08/22/2012

Do changelogu/readme rozhodně. Konfiguráky zatím nekontrolujeme nijak, a teď bych se do toho nepouštěl.

Jakou hodnotu - otestuj jaká plus mínus hodnota MAX_RCV_EVENTS_LIMIT generuje pro triviální proces, čtoucí ze serveru, paměťový peak cca čtvrt giga (v topu položka VIRT). Pak ji nějak vhodně zaokrouhlíme a použijeme jako default do konfiguráku. Za čas se poptáme, co si s ní udělali uživatelé a případně změníme.

Actions #9

Updated by Jan Soukal over 12 years ago

Upravil jsme v konfiguraku implicitni hodnotu $MAX_RCV_EVENTS_LIMIT na 6000. Tato hodnota mi generovala cca ctvrt giga peak.

Meril jsem:
  • primo ve skriptu (vzdy tesne pred vracenim davky funkci getNewEvents):
     #memory test
      my $memusage = `ps h -o vsz $$`;
      print "events received: " . scalar @events . "\nmemory used: $memusage\n";
    
    • ukazkovy vypis (memory used v KiB):
      events received: 6000
      memory used: 224052
      +------------------------------------------------------------------------------------------------------------------------------------------+
      events received: 6000
      memory used: 243416
      +------------------------------------------------------------------------------------------------------------------------------------------+
      events received: 6000
      memory used: 246912
      +------------------------------------------------------------------------------------------------------------------------------------------+
      events received: 1293
      memory used: 247208
      +------------------------------------------------------------------------------------------------------------------------------------------+
      events received: 0
      memory used: 247208
      
  • paralelne jsem kontroloval v topu a taky:
    cat /proc/13376/status | grep VmPeak
    
  • hodnoty pro meho testovaciho klienta (typ portscan) pri prijimani 6000 zprav byly tesne pod hranici 250 MB. U narocnejsich zprav (napr. phishing jako IODEF/IDMEF v poznamce) bude urcite potreba nastavit individualni prah)
Actions #10

Updated by Jan Soukal over 12 years ago

Aktualizoval jsem CHANGELOG a README o informace o davkovem prijimani udalosti a $MAX_RCV_EVENTS_LIMIT hodnote v konfiguraku (revize 6ead5f66). Implicitni hodnota 6000 do konfiguraku pridana v revizi 1a7634b1.

Actions #11

Updated by Pavel Kácha over 12 years ago

  • Status changed from New to Resolved

Jen doplnění - čtvrt giga je "zahleděný" odhad, stroje s méně než půl giga paměti snad nikdo na Warden používat nebude, takže rezerva je i v paměti, i případně ve swapu. A zkušení si ji upraví podle svých potřeb.

Actions #12

Updated by Pavel Kácha about 12 years ago

  • Status changed from Resolved to Closed
Actions

Also available in: Atom PDF