2011-12-19 11 views
5

sto scrivendo un servlet Java che sto pensando di distribuire su AWS Amazon Elastic Beanstalk che utilizzano. I miei test dimostrano che le cose funzionano bene usando un'istanza Small EC2 usando la loro scorta di Tomcat AMI utilizzata da Beanstalk.Allocazione un mucchio Java per Tomcat su un'istanza EC2

Sto cercando di capire come allocare correttamente spazio heap Java per questa configurazione. Una piccola istanza ha 1,7 GB di memoria, quindi penso che un heap da 1024 MB funzionerà correttamente. Mi rendo conto che la memoria sarà necessaria per altre cose anche se l'unico scopo "reale" di questa istanza è l'esecuzione di Tomcat. E so anche che c'è un certo punto con grandi heap in cui la JVM Sun/Oracle standard non funziona davvero.

È un modo ragionevole di allocare la memoria? Dovrei usare più o meno? Quali strumenti posso usare per aiutare a determinare la configurazione ottimale?

risposta

2

1024 sembra ok, forse un po 'troppo.

Non sono esattamente sicuro di ciò che sta facendo il servlet, ma per darti un'idea, ho un'applicazione di e-commerce con circa 1000 utenti giornalieri che eseguono su 2 piccole istanze di ec2. Il carico di Tomcat è distribuito tramite mod_jk.

non ho sintonizzare la JVM a tutti e tenuto le impostazioni predefinite. Sto anche usando il caching degli oggetti distribuiti in terracotta, e quel processo sembra consumare gran parte della memoria.

Stai distribuito su un Linux basata OS o Windows? IMO, Linux fa un lavoro migliore nella gestione della memoria disponibile.

Per quanto riguarda gli strumenti, vorrei suggerire la distribuzione dell'applicazione come è quello di un piccolo istanza EC2 e l'utilizzo di uno strumento come JMeter sottolineare testare l'applicazione. Durante lo stress test, è possibile avere la massima utilità aperta (supponendo che l'app sia su linux e top sia installata).

cercare di rompere l'applicazione per vedere quanto carico è in grado di gestire. Questa è la bellezza di ec2, puoi configurare un ambiente di test in pochi minuti e scartarlo subito dopo.

+0

Grazie per l'input. Non entrerò nei dettagli sulla nostra app. Permette agli utenti di visualizzare informazioni su diversi argomenti e quindi eventualmente aggiungere ulteriori informazioni a loro. Alcune informazioni sugli argomenti sono generate dinamicamente da un database, mentre la maggior parte di esse sono dati statici che vengono letti dai file all'avvio e sono contenuti nelle nostre strutture di dati sull'heap. Tutti insieme, sono circa 250-300 MB di dati. Immagino che quando saremo davvero in funzione avremo qualche decina di migliaia di utenti al giorno. –

+0

Nel mio precedente progetto AWS ho provato a controllare tutto. Per questo progetto ho deciso che dovevo passare più tempo sull'applicazione "reale" e su come commercializzarla e non su semplici lavori IT, quindi sto semplicemente utilizzando Beanstalk di serie. Ciò significa utilizzare l'AMI di serie che è Linux e Elastic Load Balancer. C'è qualche ragione per cui stai usando mod_jk per distribuire il carico al posto di ELB? Quindi, dato questo, perché pensi che il 1024 sia un po 'troppo? Ciò lascia 700 MB per tutto il resto, che in realtà non è altro che le normali attività del sistema operativo. Sto guardando correttamente? –

+0

@SanderSmith Sto ancora utilizzando l'ELB, ma lo sto usando per bilanciare tra 2 istanze di piccoli server web Apache. Quindi mod_jk viene utilizzato dalle istanze del mio server Web Apache per distribuire il carico alle istanze di tomcat. Apache è migliore nel servire le risorse statiche e gestisce meglio SSL, ecco perché li sto usando. Immagino che la cosa migliore che puoi fare è testare il carico e prendere le tue decisioni da lì. Se la tua applicazione è in attesa di ricevere 10k utenti al giorno, non credo che una piccola istanza di ec2 sarà sufficiente, non importa come si sintonizza la JVM –

0

Controllare newrelic per java per determinare il modello di utilizzo dell'heap.