Apache antwortet nicht auf alle Anfragen

Apache antwortet nicht auf alle Anfragen

Setup: Ich habe über 1 Million Telefone, die auf meinen Server zugreifen.

Der Server sieht gut aus. Sowohl CPU als auch RAM sind ausreichend vorhanden - die CPU ist etwa 90% der Zeit im Leerlauf (1)

Die Datenbank wird nicht stark ausgelastet – weniger als 100 Anfragen pro Sekunde (2).

Wenn ich den Server über einen Apache-Proxy wie „Android Lost“ betrete, tritt ein Timeout auf.

Wenn ich den Anwendungsserver direkt über Port 8080 anspreche, erhalte ich sofort eine Antwort.

Was ich bisher getan habe, ist:

  1. Starten Sie alle Dienste, Datenbank, Apache, Jetty neu
  2. Den Server neugestartet
  3. Habe versucht, nginx statt Apache zu installieren (3)
  4. Habe versucht, Jetty auf Port 80 auszuführen und Apache zu überspringen
  5. Habe versucht, die Servereinstellungen zu optimieren (4)

Für mich klingt das so, als ob eine riesige Menge an Anfragen versucht, den Server zu erreichen, und irgendwo in Apache gibt es eine Drosselung, die eingestellt werden muss.

Ich wäre also für alle Hinweise und Vorschläge sehr dankbar.

Zu 1:

top - 20:44:33 up 44 min,  2 users,  load average: 2.44, 1.86, 2.80
Tasks: 165 total,   2 running, 163 sleeping,   0 stopped,   0 zombie
Cpu(s):  1.0%us,  0.4%sy,  0.0%ni, 90.6%id,  7.5%wa,  0.0%hi,  0.5%si,  0.0%st
Mem:  12296928k total, 12154152k used,   142776k free,    83228k buffers
Swap:  6287292k total,        0k used,  6287292k free, 10461776k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                               
  447 root      20   0 7587m 841m  14m S    9  7.0   0:39.81 java                                                                   
 1287 mongodb   20   0  120g 272m 247m S    3  2.3   1:38.12 mongod                                                                 
   10 root      20   0     0    0    0 S    0  0.0   0:07.57 rcu_sched                                                              
  364 root       0 -20     0    0    0 S    0  0.0   0:00.96 kworker/0:1H                                                           
  381 www-data  20   0 1966m 8188 2164 S    0  0.1   0:00.72 apache2                                                                
15562 root      20   0 7706m 105m  11m S    0  0.9   0:13.56 java                                                                   
32636 www-data  20   0 1966m 8012 2236 S    0  0.1   0:00.72 apache2   

Zu 2:

insert  query update delete getmore command flushes mapped  vsize    res faults locked % idx miss %     qr|qw   ar|aw  netIn netOut  conn       time 
     3     17      2      0       0       6       0  58.2g   120g   293m     11      1.7          0       0|0     0|0     3k     9k    43   20:49:40 
    11     46      8      0       0      24       0  58.2g   120g   295m      6      5.1          0       0|0     0|0    12k    21k    43   20:49:41 
    12     63     13      0       0      26       0  58.2g   120g   294m      3      1.3          0       0|0     0|0    17k    35k    43   20:49:42 
     5     45      6      0       0      12       0  58.2g   120g   296m      6      0.9          0       0|1     2|1    13k    22k    43   20:49:43 
     5     49      5      0       0      11       0  58.2g   120g   298m      5      0.1          0       0|0     0|0    13k    22k

Zu 3:

Aus dem Nginx-Fehlerprotokoll:

2014/05/12 19:45:51 [alert] 9800#0: 768 worker_connections are not enough
2014/05/12 19:45:51 [alert] 9800#0: 768 worker_connections are not enough
2014/05/12 19:45:51 [alert] 9800#0: 768 worker_connections are not enough
2014/05/12 19:45:51 [alert] 9800#0: 768 worker_connections are not enough
2014/05/12 19:45:51 [alert] 9800#0: 768 worker_connections are not enough
2014/05/12 19:45:51 [alert] 9800#0: 768 worker_connections are not enough
2014/05/12 19:45:51 [alert] 9800#0: 768 worker_connections are not enough
2014/05/12 19:45:51 [alert] 9800#0: 768 worker_connections are not enough
2014/05/12 19:45:51 [alert] 9800#0: 768 worker_connections are not enough

Zu 4:

http://www.eclipse.org/jetty/documentation/current/high-load.html#d0e14090

Antwort1

Dies liegt daran, dass nginx nicht genügend Worker-Verbindungen hat. Sie können es im nginx-Fehlerprotokoll sehen:

2014/05/12 19:45:51 [alert] 9800#0: 768 worker_connections are not enough 
2014/05/12 19:45:51 [alert] 9800#0: 768 worker_connections are not enough

Die maximale Anzahl an Clients, die Nginx bedienen kann, wird mit dieser Formel berechnet:

max_clients = worker_processes * worker_connections - keepalive connections

In nginx.confkönnen Sie die Menge von worker_processesund einstellen worker_connections. Dies steht normalerweise in der Hauptkonfigurationsdatei irgendwo oben (vor httpder Direktive):

worker_processes 1;
events {
    worker_connections 128
}

Sie haben diese höchstwahrscheinlich eingestellt. Ich empfehle, worker_processesdie Anzahl Ihrer CPU-Kerne einzustellen und den Wert zu erhöhen, worker_connectionwährend Sie die Leistung des Servers prüfen, bis Sie die Zahl gefunden haben, die Ihr Server verarbeiten kann/muss.

verwandte Informationen