2010-11-03 13 views
7

Ho fatto alcuni esperimenti usando Apache Bench per profilare i tempi di risposta del mio codice, e non genera abbastanza il giusto tipo di dati per me. Spero che le persone buone qui abbiano idee.Alternative a ApacheBench per profilare la mia velocità di codice

In particolare, ho bisogno di uno strumento che

  • Does richieste HTTP sulla rete (non ha bisogno di fare qualcosa molto di fantasia)
  • Records tempi di risposta più accuratamente possibile (almeno per un pochi millisecondi)
  • Scrive i dati in tempo di risposta ad un file senza ulteriori elaborazioni (o fornisce al mio codice, se una libreria)

so di ab -e, che stampa i dati su un file. Il problema è che questo stampa solo i dati quantili, che è utile, ma non quello di cui ho bisogno. L'opzione ab -g funzionerebbe, tranne che non stampa i dati inferiori al secondo, il che significa che non ho la risoluzione di cui ho bisogno.

Ho scritto alcune righe di Python per farlo, ma l'httplib è orribilmente inefficiente e quindi i risultati erano inutili. In generale, ho bisogno di una precisione migliore di quella fornita da Python puro. Se qualcuno ha suggerimenti per una libreria utilizzabile da Python, sono tutto orecchie.

Ho bisogno di qualcosa che sia ad alte prestazioni, ripetibile e affidabile.

So che metà delle mie risposte saranno sulla falsariga di "la latenza di Internet rende quel tipo di misurazioni dettagliate prive di significato". Nel mio particolare caso d'uso, questo non è vero. Ho bisogno di dettagli di temporizzazione ad alta risoluzione. Qualcosa che ha effettivamente utilizzato il mio hardware HPET sarebbe fantastico.

Lanciare una taglia qui a causa del basso numero di risposte e visualizzazioni.

+1

Ho finito per creare uno strumento personalizzato per eseguire le mie misurazioni utilizzando una combinazione di Python e libcurl. libcurl fornisce buone misurazioni della tempistica di risoluzione per ciascuna parte del processo di richiesta/risposta http, permettendomi di ottenere le misure precise di cui avevo bisogno. –

risposta

1

Ho fatto questo in due modi.

Con "loadrunner" che è un prodotto meraviglioso ma piuttosto costoso (penso che HP in questi giorni).

Con combinazione perl/php e pacchetto Curl. Ho trovato l'API CURL leggermente più facile da usare da PHP. È piuttosto facile eseguire le tue richieste GET e PUT. Raccomanderei inoltre di eseguire manualmente alcune richieste di esempio con Firefox e il componente aggiuntivo LiveHttpHeaders per captare il formato esatto delle richieste http necessarie.

+0

Loadrunner suona come un grande software. Sicuramente fuori dal mio budget (e overkill - sto facendo statistiche principalmente qui). In realtà, ho solo bisogno di fare richieste HEAD, ma l'idea di usare curl come libreria sembra buona. –

+0

Sai se il ricciolo può essere convinto a fare il cronometraggio per le sessioni keep-alive? –

+0

Solo un seguito qui - Curl (libcurl in Python, in realtà) ha fornito una grande quantità di informazioni direttamente correlate ai punti che volevo indagare. Credo che costruire i miei strumenti per il mio problema sia la risposta giusta a volte. Come bonus, libcurl è molto più efficiente di qualsiasi codice di rete che potrei scrivere io stesso. –

1

JMeter è molto utile. Ha una GUI da cui è possibile impostare richieste e threadpool e può anche essere eseguito dalla riga di comando.

+0

Sembra uno strumento utile. Un po 'eccessivo per quello che mi serve qui, ma terrò a mente per altri progetti. Quanto è preciso? La mia preoccupazione per gli strumenti più grandi come questo è che la GUI e tutte le "altre cose" potrebbero aggiungere rumore ai miei risultati (Certo, sto cercando risultati più precisi di quanto la maggior parte degli strumenti di benchmark web siano progettati per fornire). –

+0

Per quanto riguarda la precisione, esegui un test di prova con ApacheBench (o qualsiasi altra cosa ti fidi) e un'altra con JMeter. Se il tuo server è coerente in termini di prestazioni, dovresti ottenere risultati vicini da entrambe le esecuzioni. In questo modo è possibile garantire l'eventuale sovraccarico della GUI. – mindas

+0

@mindas Ho bisogno di una precisione molto maggiore di quella che un test del genere rivelerà. –

1

Se è possibile programmare in Java, è possibile esaminare la combinazione di JUnitPerf + HttpUnit.

Lo svantaggio è che dovrete fare più cose da soli. Ma al prezzo di questo si otterrà flessibilità illimitata e probabilmente più precisione rispetto agli strumenti della GUI, per non parlare dell'analisi HTML, dell'esecuzione di JavaScript, ecc.

C'è anche un altro progetto chiamato Grinder che sembra essere finalizzato per un'attività simile ma non ho alcuna esperienza con esso.

+0

Sì ... ma non ho bisogno di parsing HTML, javascript, ecc. Ho solo bisogno del tempo necessario per una richiesta di lasciare la mia macchina e per farmi ricominciare da capo una richiesta HEAD. JUnitPerf è probabilmente un po 'più alto di quello che mi serve, ma lo darò un'occhiata. –

+0

Ho dato un'occhiata a The Grinder. Sembra essere più vicino a quello che sto cercando, ma ha ancora alcune inefficienze che mi preoccupano. Ad esempio, "HTTPClient invia un POST come due PDU ... Questa è una conseguenza dell'implementazione conservativa del pipelining HTTP/1.1 in HTTPClient." –

0

ho usato uno script per guidare 10 scatole sullo stesso switch per generare carico "rigiocando" le richieste a 1 server. Ho avuto il tempo di risposta della registrazione della mia app Web (solo server) per la granularità di cui avevo bisogno, ma non mi importava del tempo di risposta al client. Non sono sicuro che ti interessi includere il viaggio da e verso il cliente nei tuoi calcoli, ma se lo facessi non dovrebbe essere difficile da programmare. Ho quindi elaborato il mio log con uno script che ha estratto i tempi per url e ha fatto grafici di grafici di dispersione e grafici di tendenza in base al carico.

soddisfatto questo le mie esigenze che erano:

  • distribuzione mondiale reale delle chiamate verso URL diversi.
  • Prestazioni di tendenza in base al carico.
  • Non influenzare l'app Web eseguendo altri opercenti intensivi nella stessa casella.

Ho eseguito il controller come script di shell che foreach ha avviato un processo in background per eseguire il loop su tutti gli URL in un file che chiama arricciamento su ognuno. Ho scritto il processore di log in Perl poiché stavo facendo più perl in quel momento.

1

httperf è molto potente.

+0

Ha incluso la parte essenziale - il nome dello strumento. – mmlac

Problemi correlati