Domanda

Ho un'applicazione web scritta usando CherryPy, che viene eseguita localmente su 127.0.0.1:4321 . Usiamo mod-rewrite e mod-proxy per far funzionare Apache come proxy inverso; Apache gestisce anche la nostra crittografia SSL e potrebbe eventualmente essere utilizzata per trasferire tutto il nostro contenuto statico.

Tutto funziona perfettamente per piccoli carichi di lavoro. Tuttavia, recentemente ho usato urllib2 per scrivere uno script di stress test che simulasse un carico di lavoro di 100 client. Dopo qualche tempo, ogni client riceve un errore 503 da Apache, indicando che Apache non può connettersi a 127.0.0.1:4321 . CherryPy funziona correttamente, ma il mio registro degli errori di Apache rivela linee come le seguenti:

[Gio 02 Ott 12:55:44 2008] [errore] (OS 10048) Normalmente è consentito un solo utilizzo di ciascun indirizzo socket (protocollo / indirizzo di rete / porta). : proxy: HTTP: tentativo di connessione a 127.0.0.1:4321 (*) non riuscito

Google cercando questo errore rivela che probabilmente Apache ha esaurito i descrittori di file socket. Dato che ho solo 100 client in esecuzione, ciò implica che le connessioni non vengono chiuse, né tra la mia connessione urllib2 e Apache (sto sicuramente chiamando .close () sul restituisce il valore di urlopen ) o tra Apache e CherryPy.

Ho confermato che la mia richiesta urllib2 sta inviando un header HTTP Connessione: chiudi , sebbene Apache sia configurato con KeepAlive On se quello questioni.

In caso di importanza, sto usando Python 2.5, Apache 2.2, CherryPy 3.0.3 e il server è in esecuzione su Windows Server 2003.

Qual è il mio prossimo passo per fermare questo problema?

È stato utile?

Soluzione

SetEnv proxy-nokeepalive 1 probabilmente ti dirà subito se il problema è keepalive tra Apache e CP. Vedi mod_proxy docs per maggiori informazioni.

Altri suggerimenti

Potresti eseguire il comando netstat e vedere se hai un gruppo di socket nello stato TIME_WAIT. A seconda dell'impostazione di MaxUserPort potresti essere fortemente limitato nel numero di porte disponibili per l'uso. Inoltre, TcpTimedWaitDelay è in genere impostato su 240 secondi, pertanto tutti i socket utilizzati non possono essere riutilizzati per quattro minuti.

Ci sono altre buone informazioni qui - > http://smallvoid.com/article/winnt-tcpip-max-limit.html

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top