[Python] thread o multiprocessing, vostra esperienza

Giampaolo Rodola' g.rodola a gmail.com
Dom 25 Ago 2013 12:09:29 CEST


2013/8/18 Remo The Last <py.remothelast a yahoo.it>

>
> ciao a tutta la lista.
> Vorrei chiedere il seguente presentando la situazione.
>
> La nostra rete è cresciuta a dismisura e dobbiamo riorganìzzare i client
> con i vari punti di accesso.
> In pratica mi è stato chiesto (secondo alcune ragioni) di effettuare una
> scansione della sottorete 10.0.0.0/8 ed elencare gli IP privati attivi
> con alcuni loro servizi.
> Ebbene, mi sono subito rivolto al grandioso nmap che però ha un difetto:
> si 'pappa' tutte le risorse del nostro server mandandolo in crash se al
> server vengono richieste risorse aggiuntive. E ha crashato ben due volte.
> Il 'serverone' è un quad-core Xeon con OS Centos 5 che può richiedere - se
> vuole - risorse supplementari ad altre macchine sorelle. Ho lanciato nmap
> da una altro serverone con OS Centos 6 e ha crashato anch'esso.
> Ho dunque implementato uno scanner in python (utilizzando i thread) e ho
> vissuto un limite di python stesso: python non può creare più di circa 1000
> threads al secondo e esce dallo script con errore tipo "can't create a new
> thread". Da questo ho limitato il numero di thread/sec a 512 con una
> gestione massima di thread attivi a 2048 (per altro codice).
> Resta però che una sottorete 10/0 è immensa e anche se non ho fretta, 512
> thread al secondo sono pochi. E mi sono informato sul multiprocessing in
> python.
> Da qui la domanda per chi ha esperienza: se volessi implementare uno
> scanner utilizzando il multiprocessing di python invece che i thread, avrei
> lo stesso limite al numero di processi da creare di circa 1000/sec o posso
> creare un numero di processi superiore e dunque uscirmene più velocemente
> da questo dovere di scansione della 10/8?
>
> Per favore, che la risposta non sia "crea codice e testa il tutto" in
> quanto comunque sarebbe un impegno lungo e magari qualcuno ha già
> esperienza in tal senso ... e magari il problema del limite resta lo stesso
> anche utilizzando il multiprocessing.
>

Di preciso con lo script corrente come determini se una macchina è up?
La pinghi? Come di preciso? Utilizzando ICMP tramite un socket raw?
L'approccio asincrono è in genere la cosa più indicata per far scalare (di
molto) applicativi di questo tipo ma a questo livello (socket raw) forse
Twisted & co. non forniscono strumenti utili (potrei sbagliarmi).
In tal caso puoi usare direttamente epoll() (
http://docs.python.org/2/library/select.html#epoll-objects).

--- Giampaolo
https://code.google.com/p/pyftpdlib/
https://code.google.com/p/psutil/
https://code.google.com/p/pysendfile/
-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: <http://lists.python.it/pipermail/python/attachments/20130825/4c2dbade/attachment.html>


Maggiori informazioni sulla lista Python