2012-11-30 10 views
5

Tomcat e appache2 sono connessi tramite AJP. Ho queste configurazioni per Tomcat e Apache:Tomcat Conteggio thread corrente

<Connector port="8009" protocol="AJP/1.3" 
      URIEncoding="UTF-8" 
      redirectPort="8443" 
      connectionTimeout="20000" 
      maxThreads="512" /> 


<IfModule mpm_event_module> 
    StartServers   5 
    MinSpareThreads  25 
    MaxSpareThreads  75 
    ThreadLimit   64 
    ThreadsPerChild  25 
    ServerLimit  1024 
    MaxClients   512 
    MaxRequestsPerChild 0 
</IfModule> 

Quando vado al manager di Tomcat, vedo:

"ajp-bio-8009" 
Max threads: 512 Current thread count: 256 Current thread busy: 231 

Il thread corrente occupato a volte raggiunge 256. Perché non è l'attuale set di numero di thread a 512?

risposta

2

Il thread corrente viene gestito in modo dinamico da apache.

da worker.c nel codice sorgente di apache: thread avviato come necessario. di seguito è riportato il flusso principale per iniziare il thread di lavoro.

static int worker_run(apr_pool_t *_pconf, apr_pool_t *plog, server_rec *s) 
    startup_children(remaining_children_to_start); //server/mpm/worker/worker.c 
    if (make_child(ap_server_conf, i) < 0) {  //server/mpm/worker/worker.c 
     child_main(slot);       //server/mpm/worker/worker.c 
     rv = apr_thread_create(&start_thread_id, thread_attr, start_threads 
     rv = apr_thread_create(&threads[i], thread_attr, worker_thread, my_info, pchild);  

E quando thread inattivo> max_spare_threads, apache cercherà di ridurre il filo di riserva dal processo figlio uccisioni/filo per ridurre il conteggio dei thread inattivi.

if (idle_thread_count > max_spare_threads) { 
    /* Kill off one child */ 
    ap_worker_pod_signal(pod, TRUE); 
    retained->idle_spawn_rate = 1; 
} 

internamente apache gestire questi processo figlio, e utilizzando il segnale per comunicare con processo figlio per regolare fili come necessario. Tutti i thread sono gestiti in ap_scoreboard_image->servers[i][j];

apache controllerà il conteggio dei thread e utilizzando il socket invia per informare infoCollector. grosso modo dal seguente codice (sono stati cancellati linea non correlato)

./httpd/modules/cluster/mod_heartbeat.c 
    for (i = 0; i < ctx->server_limit; i++) { 
     .... 
      for (j = 0; j < ctx->thread_limit; j++) { 
       ws = &ap_scoreboard_image->servers[i][j]; 
       if (res == SERVER_READY && ps->generation == mpm_generation) { 
        ready++; 
       } 
      } 
     } 

    len = apr_snprintf(buf, sizeof(buf), "v=%u&ready=%u&busy=%u", MSG_VERSION, ready, busy); 
    ... 
    rv = apr_socket_sendto(sock, ctx->mcast_addr, 0, buf, &len); 

In Tomcat: queste informazioni filo vengono ricevuti da: ./tomcat/java/org/apache/catalina/ha/backend/CollectedInfo. java e visualizzati da: /Users/twer/lab/tomcat/java/org/apache/catalina/manager/StatusTransformer.java

writer.write(" currentThreadCount=\"" + mBeanServer.getAttribute(tpName, "currentThreadCount") + "\""); 

maggior parte del codice spettacolo qui sono flusso principale, linea di estranei vengono eliminati . scarica la fonte per saperne di più. scaricare apache src: http://www.apache.org/dist/httpd/?C=S;O=A scaricare tomcat src: http://tomcat.apache.org/download-70.cgi

+0

Grazie per la risposta, ma questo non risponde alla mia domanda. Sto scalando il mio server. Avevo un numero massimo di thread = 128 e la maggior parte di essi erano occupati. L'ho modificato in thread max = 256. Con questo numero, stavo lavorando a 200 thread. Ora sto ricevendo più colpi. Immagino che 400 thread dovrebbero essere occupati, quindi ho raddoppiato il numero di thread max a 512. Ma il server serve solo un massimo di 256 thread alla volta. Quindi la mia domanda è: cosa devo fare per fare in modo che il mio server usi più thread? – mossaab

+0

prova a utilizzare alcuni strumenti di test del carico web, consenti al server di ricevere più richieste, per vedere se è possibile fino a 512. http://stackoverflow.com/questions/5139953/web-server-load-testing-tool – whunmr