Rychlost paralelniho resolvovani (long)

Michal Krause michal na krause.cz
Neděle Leden 14 18:54:48 CET 2001


On 14/01/2001, Jaroslav Gratz wrote:

> Je vubec gethostbyaddr_r() v Linuxu reentrantni? Ja bych rekl ze ne, i
> kdyz by mela byt. Jenoduchy test:
> 
> ipchains -A input -p TCP -d 0.0.0.0/0 53 -j DENY
> ipchains -A input -p UDP -d 0.0.0.0/0 53 -j DENY
> 
> Pak zavolam gethostbyaddr_r() a samozrejme nic nezresolvuje a po 75
> vterinach to zabali (nejaky timeout). Kdyz zavolam gethostbyaddr_r()
> 2x, je to celkem 150 vterin. Kdyz zavolam gethostbyaddr_r soucasne ve
> dvou threadech, je to taky 150 vterin, takze s tou reentrantnosti bych
> to videl cerne.

Reentrantni AFAIK neznamena, ze dvoji zavolani jeden z threadu docasne
nezablokuje, ale to, ze nemuze dojit ke kolapsu nebo zmateni ci
poskozeni predavanych dat. Takze reentrantni je, ale kriticke casti jsou
nejspis jenom obklicene mutexem, misto nejakeho inteligentnejsiho
reseni.

> Blbej napad, co s tim delat: V kazdem threadu spustit nslookup a
> nechat jej prevadet IP adresy na jmena. Mam dojem, ze nslookup nevola
> gethostby*() a rovnou posila pakety nameserveru. Ale je to dost velka
> rezie navic. No ja rikal, ze je to blbej napad :)

To je skutecne dost blby napad, zejmena ve svetle existence veci, jako
je jiz zminovany adns, djbdns a nebo (panbuh s nami zly pryc :)
"obycejny" resolver (man resolver) :))

Zatim nejperspektivnejsi se mi jevi metoda pouzita v adns, protoze je s
nim mozne poslat vice soubeznych query, nez se Vam za normalnich
okolnosti podari s thready (v prilozenem prikladu je limit nastaven na
64 tisic, ale to jsem radeji nezkousel :)

S pozdravem
-- 
Michal Krause                                                       /\
ICQ: 7665279            Informace (nejenom) ze sveta Linuxu      /\/  \
email: michal na krause.cz _______ http://www.root.cz/ _______ NAVRCHOLU.cz

Vseci by chceli byt van Goghmi, ale odrezat si ucho ani jeden.
                                                  J. Raz ve filmu Rabaka


Další informace o konferenci Linux