2013/8/18 Remo The Last <py.remothel...@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/
_______________________________________________ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python