[Python] thread o multiprocessing, vostra esperienza

Remo The Last py.remothelast a yahoo.it
Dom 18 Ago 2013 18:10:15 CEST



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.

Inoltre: se compilo il mio script in un binario, il binario rischia di ereditare la stessa limitazione (1000 th/sec) o forse l'OS lo gestisce meglio e posso spingere il mio scanner attuale a prestazioni superiori?


Grazie.
py.Re
-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: <http://lists.python.it/pipermail/python/attachments/20130818/77872155/attachment.html>


Maggiori informazioni sulla lista Python