Apache2 anfangs sehr langsam - nach erstem Seitenaufruf schneller...

van_haakonnen

Registered User
Hallo zusammen,

ich habe ein merkwürdiges Problem: Mein Apache2 auf einer Scientific Linux - RedHat Installation mit 4 Kernen und ebenfalls 4GB Arbeitsspeicher ist anfangs erschreckend langsam.

Installiert ist eine Software die unter PHP läuft - auf einem anderen System ist diese aber perfornanter. Es muss also eigentlich irgendwo an meinem Apache liegen.

Auf dem System läuft sonst nichts. Die Datenbank die von der Software verwendet wird liegt auf einem anderen Host. Die Verbindung zwischen den beiden ist GBit. Der Datenbankhost ist ebenfalls von der Hardware her oversized und stellt nicht den Flaschenhals dar.

Rufe ich also eine Seite auf, so muss ich Sekunden warten, bis die Seite dargestellt wird. Ist die Seite dann erstmal geladen kann ich auch andere Seiten öffnen und mich durch die Seiten navigieren ohne warten zu müssen.

Lasse ich dann einige Zeit verstreichen und rufe wieder eine Seite auf muss ich wieder viel zu lange warten... Folgeseiten werden wieder sofort dargestellt.

die httpd.conf habe ich (die interessanten Teile) angehangen:
Code:
Timeout 120
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 15

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

<IfModule worker.c>
StartServers         2
MaxClients         250
MinSpareThreads     25
MaxSpareThreads     75 
ThreadsPerChild     25
MaxRequestsPerChild  0
</IfModule>

LoadModule auth_basic_module modules/mod_auth_basic.so
#  LoadModule auth_digest_module modules/mod_auth_digest.so
#  LoadModule authn_file_module modules/mod_authn_file.so
#  LoadModule authn_alias_module modules/mod_authn_alias.so
#  LoadModule authn_anon_module modules/mod_authn_anon.so
#  LoadModule authn_dbm_module modules/mod_authn_dbm.so
LoadModule authn_default_module modules/mod_authn_default.so
LoadModule authz_host_module modules/mod_authz_host.so
LoadModule authz_user_module modules/mod_authz_user.so
#  LoadModule authz_owner_module modules/mod_authz_owner.so
#  LoadModule authz_groupfile_module modules/mod_authz_groupfile.so
#  LoadModule authz_dbm_module modules/mod_authz_dbm.so
#  LoadModule authz_default_module modules/mod_authz_default.so
#  LoadModule ldap_module modules/mod_ldap.so
#  LoadModule authnz_ldap_module modules/mod_authnz_ldap.so
#  LoadModule include_module modules/mod_include.so
LoadModule log_config_module modules/mod_log_config.so
#  LoadModule logio_module modules/mod_logio.so
#  LoadModule env_module modules/mod_env.so
#  LoadModule ext_filter_module modules/mod_ext_filter.so
LoadModule mime_magic_module modules/mod_mime_magic.so
LoadModule expires_module modules/mod_expires.so
LoadModule deflate_module modules/mod_deflate.so
#  LoadModule headers_module modules/mod_headers.so
#  LoadModule usertrack_module modules/mod_usertrack.so
LoadModule setenvif_module modules/mod_setenvif.so
LoadModule mime_module modules/mod_mime.so
#  LoadModule dav_module modules/mod_dav.so
#  LoadModule status_module modules/mod_status.so
LoadModule autoindex_module modules/mod_autoindex.so
#  LoadModule info_module modules/mod_info.so
#  LoadModule dav_fs_module modules/mod_dav_fs.so
LoadModule vhost_alias_module modules/mod_vhost_alias.so
LoadModule negotiation_module modules/mod_negotiation.so
LoadModule dir_module modules/mod_dir.so
#  LoadModule actions_module modules/mod_actions.so
#  LoadModule speling_module modules/mod_speling.so
#  LoadModule userdir_module modules/mod_userdir.so
LoadModule alias_module modules/mod_alias.so
LoadModule rewrite_module modules/mod_rewrite.so
#  LoadModule proxy_module modules/mod_proxy.so
#  LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
#  LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
#  LoadModule proxy_http_module modules/mod_proxy_http.so
#  LoadModule proxy_connect_module modules/mod_proxy_connect.so
#  LoadModule cache_module modules/mod_cache.so
#  LoadModule suexec_module modules/mod_suexec.so
#  LoadModule disk_cache_module modules/mod_disk_cache.so
#  LoadModule file_cache_module modules/mod_file_cache.so
#  LoadModule mem_cache_module modules/mod_mem_cache.so
#  LoadModule cgi_module modules/mod_cgi.so
#  LoadModule version_module modules/mod_version.so

# ExtendedStatus Off

In conf.d ist eigentlich nur PHP als Config-Datei aktviv.

Habt ihr eine Idee woran das liegen könnte?

Vielen Grüße

VanHaakonnen
 
Mir gehen unterschiedliche Ideen durch den Kopf die ggf. Erklärungen für das Verhalten sein könnten:
1. PHP-Cache/-Beschleuniger
2. PHP als FastCGI
3. Persistente Datenbank-Verbindungen
4. Schlechte PHP-Scripte

Ich würde ein paar Test-Scripte schreiben die nicht viel machen.
Wie z.B. simple Ausgabe, Schleife hochzählen, einfach Datenbank-Connection aufbauen, etc. pp.
Und jedesmal die Laufzeit des Scriptes messen.

Wichtige Infos für uns wären:
- PHP als Modul oder fcgi?
- Ist ein PHP-Accelerator installiert?
- Welches Apache MPM ist im Einsatz (Prefork oder Worker)?

huschi.
 
Hallo Huschi,

PHP 5.2.10 wird im Apache als Modul geladen. Es war bis eben noch kein PHP-Accelerator installiert. Die Idee war aber super - ich habe das eben nachgeholt. Installiert ist jetzt der eAccelerator in Version 0.9.6. Inwieweit das eine Verbesserung bringt muss ich noch beobachten.

Bei der Software handelt es sich um nichts selbstgeschriebenes... ich denke, dass diese nicht so schlecht programmiert ist. Hier würde ich das Problem eher nicht suchen :/

Jetzt muss ich mal die Hosen an der anderen Stelle runterlassen: Wie erkenne ich, ob mein Apache Prefork oder Worker ist? Ich habe einfach die Standard-Installation bei Redhat...
 
Entweder steht es in der globalen error.log oder in der Paket-Beschreibung oder sogar gibt es Prozesse mit dem Namen "httpd-prefork".

huschi.
 
Irgendwie finde ich nichts...

Code:
[Thu Apr 15 20:56:01 2010] [notice] Apache/2.2.3 (Scientific Linux) configured -- resuming normal operations

---

Loaded plugins: kernel-module
Installed Packages
Name       : httpd
Arch       : x86_64
Version    : 2.2.3
Release    : 31.sl5.4
Size       : 3.3 M
Repo       : installed
Summary    : Apache HTTP Server
URL        : http://httpd.apache.org/
License    : Apache Software License
Description: Der Apache HTTP Server ist ein leistungsfähiger, wirksamer und erweiterbarer
           : Web Server.

In den Prozessen heißt der Apache leider immer nur "httpd"...

Hostlookups ist deaktiviert :)


EDIT:
Hab etwas herausbekommen
Code:
/usr/sbin/httpd -M
Loaded Modules:
 core_module (static)
 mpm_prefork_module (static)
 http_module (static)
 so_module (static)
 auth_basic_module (shared)
 authn_default_module (shared)
 authz_host_module (shared)
 authz_user_module (shared)
 log_config_module (shared)
 mime_magic_module (shared)
 expires_module (shared)
 deflate_module (shared)
 setenvif_module (shared)
 mime_module (shared)
 autoindex_module (shared)
 vhost_alias_module (shared)
 negotiation_module (shared)
 dir_module (shared)
 alias_module (shared)
 rewrite_module (shared)
 php5_module (shared)
 ssl_module (shared)
Syntax OK

Dementsprechend müsste es prefork sein
 
Last edited by a moderator:
Bei der Software handelt es sich um nichts selbstgeschriebenes... ich denke, dass diese nicht so schlecht programmiert ist.
ox:Commerce und xt:Commerce sind zwar beliebt und oft eingesetzt. Dennoch ist es schlecht programmiert.

Du könntest z.B. mit mod_status und "ExtendedStatus On" nachsehen, wie Deine Scripts verarbeitet werden und wieviele parallele Request noch laufen.

Desweiteren denke ich, dass Deine MaxClients zu hoch sind. Sie könnten bei einer vollen Auslastung den Speicher überlaufen lassen und die Maschine lahm legen.

Falls Deine Domain nicht allzu geheim ist, dann wäre es gut wenn Du sie bekannt geben könntest. Denn 10 Leute sehen mit unterschiedlichen Test-Tools eher Probleme als nur ein unerfahrener Admin. ;)

huschi.
 
Sooo,

entschuldigt, dass die Antwort erst so spät erfolgt... Ich habe das Problem durch einiges Optimieren in der httpd.conf (u.a. Entfernen von nicht benötigten Modulen), eAccelerator, Tuning der MySQL-Datenbank, uvm.

Weiterhin werkelt jetzt ein Hardware-Loadbalancer der Firma Cisco davor... Läuft jetzt jedenfalls. Vielen Dank für die Hilfe soweit.

Eine Frage in eine sehr ähnliche Richtung habe ich noch:
Ich habe ein Problem mit einem Nutzer auf einem Server. Unter seinem Usernamen läuft über den Apache ausgeliefert ein PHP5 Script, dass unglaubliche Last verursacht. Leider sehe ich im top beispielsweise nur sowas:

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
11156 webxx 16 0 201m 15m 7760 S 63.7 0.2 0:00.87 php
8121 mysql 15 0 414m 67m 5576 S 1.3 0.8 2423:53 mysqld

Ich kann also sagen, welcher Benutzer "schuld" ist - hilfreich wäre es natürlich noch zu wissen, welches Script (also welche PHP-Datei) wirklich diese Last verursacht. Kann ich das heraufinden?

VanHaakonnen
 
Wenn es wirklich vom Apache ausgeführt wird, hilft auch hier mod_status mit "ExtendedStatus On".

huschi.
 
Back
Top