Comment dois-je régler apache lorsque je vois un processeur élevé, mais une faible utilisation de mémoire?

8

Mes nœuds Web CentOS (pile LAMP) connaissent une utilisation élevée du processeur mais une faible utilisation de la mémoire. Presque tous les processus sont apaches. Je sais que je pourrais simplement ajouter des nœuds Web supplémentaires jusqu'à ce que mon utilisation du processeur devienne raisonnable, mais j'imagine qu'il existe quelques conseils de réglage rapides qui pourraient aller très loin ici.

Le CPU rebondit entre 90 et 100%. Mysql rebondit entre 5% et 45%. Apache compose le reste.

Haut:

top - 21:15:49 up 46 days, 20:39,  4 users,  load average: 34.17, 44.62, 51.03
Tasks: 133 total,  32 running, 101 sleeping,   0 stopped,   0 zombie
Cpu(s): 90.4%us,  9.6%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.1%st
Mem:   8388608k total,  6116448k used,  2272160k free,    84160k buffers
Swap: 16777208k total,       68k used, 16777140k free,  3488044k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
15775 mysql     15   0  827m 153m 3712 S 43.7  1.9   0:55.04 mysqld
15911 apache    16   0  275m  10m 3872 S 24.1  0.1   0:03.15 httpd
15816 apache    16   0  288m  23m 4116 R 23.5  0.3   0:11.88 httpd
15807 apache    15   0  281m  17m 5028 S 21.5  0.2   0:11.71 httpd
15897 apache    16   0  277m  13m 4104 S 21.2  0.2   0:02.68 httpd
15834 apache    16   0  276m  11m 3916 S 20.6  0.1   0:05.22 httpd
15842 apache    16   0  275m  11m 4116 S 19.3  0.1   0:07.86 httpd
15870 apache    16   0  294m  30m 5044 R 17.4  0.4   0:06.36 httpd
15782 apache    15   0  278m  13m 4124 R 12.2  0.2   0:08.54 httpd
15819 apache    15   0  280m  17m 5016 S 11.6  0.2   0:07.01 httpd
15683 apache    16   0  288m  23m 4128 R 10.9  0.3   0:09.90 httpd
15876 apache    16   0  284m  19m 3880 R 10.6  0.2   0:04.35 httpd
15878 apache    15   0  276m  11m 4104 S 10.6  0.1   0:06.42 httpd
15913 apache    16   0  275m  10m 3920 R  9.6  0.1   0:07.98 httpd
15898 apache    16   0  280m  16m 4104 S  9.3  0.2   0:02.85 httpd
15817 apache    16   0  277m  13m 4108 S  9.0  0.2   0:05.55 httpd
15843 apache    16   0  280m  15m 4104 R  8.7  0.2   0:10.80 httpd
15812 apache    16   0  280m  16m 5012 R  8.0  0.2   0:05.18 httpd
15844 apache    16   0  281m  16m 4116 R  7.4  0.2   0:08.63 httpd
15833 apache    16   0  281m  18m 5036 R  7.1  0.2   0:04.76 httpd
15795 apache    16   0  280m  15m 3920 R  6.8  0.2   0:08.65 httpd
15704 apache    15   0  280m  16m 4096 S  6.4  0.2   0:09.06 httpd
15849 apache    16   0  280m  15m 4124 R  6.4  0.2   0:05.59 httpd
15806 apache    16   0  276m  11m 3876 S  6.1  0.1   0:10.33 httpd
15902 apache    16   0  280m  15m 3912 R  6.1  0.2   0:03.40 httpd
15688 apache    16   0  279m  14m 4116 R  5.8  0.2   0:06.07 httpd
15904 apache    16   0  280m  15m 3860 R  5.8  0.2   0:02.74 httpd
15703 apache    16   0  281m  17m 5048 R  5.1  0.2   0:03.86 httpd
15705 apache    16   0  281m  17m 5044 R  4.5  0.2   0:13.54 httpd
15821 apache    15   0  276m  11m 4072 S  4.5  0.1   0:04.24 httpd
15830 apache    16   0  278m  13m 4112 R  4.2  0.2   0:06.37 httpd
15850 apache    16   0  277m  12m 3872 R  3.9  0.2   0:04.64 httpd
15912 apache    15   0  276m  11m 3920 S  3.9  0.1   0:05.58 httpd
15804 apache    15   0  280m  15m 3932 R  3.5  0.2   0:09.13 httpd
15805 apache    16   0  281m  15m 3932 R  3.5  0.2   0:09.00 httpd
15899 apache    16   0  277m  12m 4104 R  2.6  0.2   0:03.26 httpd
15701 apache    16   0  277m  12m 3920 R  2.3  0.2   0:08.35 httpd
15781 apache    15   0  274m 9.8m 3924 S  1.9  0.1   0:10.48 httpd
15848 apache    15   0  276m  11m 3876 S  1.9  0.1   0:06.63 httpd
15901 apache    15   0  275m  10m 3916 S  1.9  0.1   0:02.18 httpd
15879 apache    16   0  280m  16m 4104 R  1.3  0.2   0:02.03 httpd
15820 apache    16   0  281m  17m 5260 R  1.0  0.2   0:05.24 httpd

httpd.conf pertinent:

Timeout 120
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5

<IfModule prefork.c>
StartServers       8
MinSpareServers    5
MaxSpareServers   20
ServerLimit      256
MaxClients       256
MaxRequestsPerChild  4000
</IfModule>

<IfModule worker.c>
StartServers         2
MaxClients         150
MinSpareThreads     25
MaxSpareThreads     75
ThreadsPerChild     25
MaxRequestsPerChild  0
</IfModule>
Ryan
la source
Quelle est votre candidature? PHP? Utilisez-vous un cache d'opcode comme APC?
HTTP500
Oui, PHP. J'ai memcache et apc mais je n'utilise pas non plus pour le moment. Je crée un serveur memcache séparé pour éviter de le perdre lors du redémarrage d'un nœud.
Ryan
Il est possible que vos processus Apache attendent la réponse de MySQL et s'accumulent. Cela vous dérange de poster my.conf sur MySQL? De plus, avez-vous des journaux lents configurés dans MySQL? Que vous disent-ils, si vous en avez?
KM.
1
Travaillez-vous avec preforkou worker? Et rencontrez-vous de tels problèmes après une nouvelle version, des modifications de code, des mises à jour de serveur ou quelque chose comme ça?
grosshat

Réponses:

5

Il est probable que certains scripts PHP exécutés dans mod_php consomment trop de temps CPU. Les recommandations générales sont générales et chacune d'elles aura un certain avantage:

  • Installez le cache APC et vérifiez qu'il fonctionne vraiment (APC a fourni le fichier apc.php qui montre l'état APC et les occurrences et échecs du cache)
  • Installez nginx et installez-le en tant que proxy inverse devant apache - cela réduira la surcharge de traitement des fichiers statiques et laissera beaucoup plus de ressources CPU au contenu dynamique du serveur
  • Ajoutez CustomLog à apache avec les directives% t% T et examinez le journal - vous verrez quelles requêtes s'exécutent le plus de temps, consommant ainsi la plupart du CPU
  • optimiser / réécrire ces scripts
Andrei Mikhaltsov
la source
2
Le problème est certainement quelque chose qui s'exécute à l'intérieur du processus Apache mais n'est pas l'apache lui-même. C'est en mod_phpeffet la cause la plus probable. Vous devez profiler les scripts PHP que vous exécutez et comprendre ce que ceux-ci font pour gaspiller le CPU, mais ce n'est pas la base de données. Si la base de données est le goulot d'étranglement, vous verrez de nombreux processus Apache bloqués par les E / S en attente d'une réponse de la base de données. Le fait que les processus Apache / PHP mangent du CPU signifie qu'ils n'attendent pas d'E / S (sauf si vous exécutez des scripts qui utilisent des EO d'attente et non bloquantes, auquel cas vous en avez trouvé la cause).
Mikko Rantalainen
pouvez-vous me guider sur votre deuxième recommandation? un guide pratique?
mahyard