Apache2 für viele Zugriffe optimieren

bwar

Registered User
Hallo!

Ich betreibe einen Downloaddienst für onlinetvrecorder.

Das Problem ist, dass bei 190 gleichzeitigen Verbindungen der Server quasi "unbrauchbar" wird. Der Seitenaufbau ist sehr langsam.

Auf den beiden Servern läuft nur ein Apache2 mit php5. cBand zur Drosselung wird eingesetzt.

Es wird auch nur ein Skript eingesetzt. Es listet alle Dateien auf.



Es sei gesagt, dass bei 190 parallelen verbindungen nicht unbedingt nur Downloads laufen. Als verbindung zählt auch das Aufrufen des PHP-Skriptes.


TOP sagt wenig aus.
Die CPU-Last beträgt 10%, Swap wird noch nicht angefasst, Load bei 40 (recht hoch)


Hier ein kleiner Überblick über cBand:

Server1
Server2

Frage: Kann man etwas am Apache2 verändern, sodass er performanter läuft?

post scriptum: Ich nehme es auch hin, wenn jemand sagt, dass einfach Schicht im Schacht ist. :rolleyes: Manche ISPs knallen ja auch bis zu 1000 Confixx-Webs auf ihre Server.
 
Poste bitte mla die relevanten Teile deiner Apache-Config, insbendere interessiert, welches worker-Modul du geladen hast und wie das konfiguriert ist. Es riecht sehr danach, daß du zuwenig Connections gleichzeitig bedienen kannst (und man wartet, bis eine wieder frei ist).
 
Ja poste bitte mal die Apache Konfig, kann mich da dem Vorredner nur anschließen. Evtl. kann man so helfen.

Was anderes: ist diese Art Download-Service legal? Ich mein mich daran erinnern zu können, dass irgend ein Landgericht mal das verbreiten von Aufnahmen via Online Rekorder Service untersagt hat.
 
ist diese Art Download-Service legal?

Noch ist es legal. Man schützt sich vor Urheberrechtsverletzungen, in dem die Dateien verschlüsselt angeboten werden. Die Bedingung vom Gericht war, dass jemand nur das downloaden kann, was er auch vorher für die Aufnahme vorgesehen hat. Somit ist der Dienst ähnlich eines normalen Videorecorders, wo man zu Hause auch nur das Aufnimmt, was man vorher bestimmt.
Daher ist der Dienst eben noch legal.

Hier wäre die Config:

Code:
ServerRoot "/etc/apache2"

LockFile /var/lock/apache2/accept.lock


PidFile /var/run/apache2.pid

Timeout 300

KeepAlive On

MaxKeepAliveRequests 100

KeepAliveTimeout 15

<IfModule prefork.c>
StartServers         2
MinSpareServers      1
MaxSpareServers      5
MaxClients          10
ServerLimit	150
MaxRequestsPerChild  0
</IfModule>

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

<IfModule perchild.c>
NumServers           5
StartThreads         5
MinSpareThreads      5
MaxSpareThreads     10
MaxThreadsPerChild  20
MaxRequestsPerChild  0
AcceptMutex fcntl
</IfModule>

User www-data
Group www-data

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent


ErrorLog /var/log/apache2/error.log


Include /etc/apache2/mods-enabled/*.load
Include /etc/apache2/mods-enabled/*.conf


Include /etc/apache2/httpd.conf

Include /etc/apache2/ports.conf

Include /etc/apache2/conf.d/[^.#]*

Alias /icons/ "/usr/share/apache2/icons/"
<Directory "/usr/share/apache2/icons">
    Options Indexes MultiViews
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>


<IfModule mod_negotiation.c>
<IfModule mod_include.c>
    Alias /error/ "/usr/share/apache2/error/"

    <Directory "/usr/share/apache2/error">
        AllowOverride None
        Options IncludesNoExec
        AddOutputFilter Includes html
        AddHandler type-map var
        Order allow,deny
        Allow from all
        LanguagePriority en es de fr
        ForceLanguagePriority Prefer Fallback
    </Directory>

    ErrorDocument 400 /error/HTTP_BAD_REQUEST.html.var
    ErrorDocument 401 /error/HTTP_UNAUTHORIZED.html.var
    ErrorDocument 403 /error/HTTP_FORBIDDEN.html.var
    ErrorDocument 404 /error/HTTP_NOT_FOUND.html.var
    ErrorDocument 405 /error/HTTP_METHOD_NOT_ALLOWED.html.var
    ErrorDocument 408 /error/HTTP_REQUEST_TIME_OUT.html.var
    ErrorDocument 410 /error/HTTP_GONE.html.var
    ErrorDocument 411 /error/HTTP_LENGTH_REQUIRED.html.var
    ErrorDocument 412 /error/HTTP_PRECONDITION_FAILED.html.var
    ErrorDocument 413 /error/HTTP_REQUEST_ENTITY_TOO_LARGE.html.var
    ErrorDocument 414 /error/HTTP_REQUEST_URI_TOO_LARGE.html.var
    ErrorDocument 415 /error/HTTP_SERVICE_UNAVAILABLE.html.var
    ErrorDocument 500 /error/HTTP_INTERNAL_SERVER_ERROR.html.var
    ErrorDocument 501 /error/HTTP_NOT_IMPLEMENTED.html.var
    ErrorDocument 502 /error/HTTP_BAD_GATEWAY.html.var
    ErrorDocument 503 /error/HTTP_SERVICE_UNAVAILABLE.html.var
    ErrorDocument 506 /error/HTTP_VARIANT_ALSO_VARIES.html.var

</IfModule>
</IfModule>

DirectoryIndex index.html index.shtml index.cgi index.pl index.php index.xhtml

AccessFileName .htaccess

<Files ~ "^\.ht">
    Options None Includes
    Order allow,deny
    Deny from all
</Files>

EnableSendfile off
ListenBacklog	10
UseCanonicalName Off

TypesConfig /etc/mime.types
DefaultType text/plain

HostnameLookups Off

IndexOptions FancyIndexing VersionSort

AddIconByEncoding (CMP,/icons/compressed.gif) x-compress x-gzip

AddIconByType (TXT,/icons/text.gif) text/*
AddIconByType (IMG,/icons/image2.gif) image/*
AddIconByType (SND,/icons/sound2.gif) audio/*
AddIconByType (VID,/icons/movie.gif) video/*


AddIcon /icons/binary.gif .bin .exe
AddIcon /icons/binhex.gif .hqx
AddIcon /icons/tar.gif .tar
AddIcon /icons/world2.gif .wrl .wrl.gz .vrml .vrm .iv
AddIcon /icons/compressed.gif .Z .z .tgz .gz .zip
AddIcon /icons/a.gif .ps .ai .eps
AddIcon /icons/layout.gif .html .shtml .htm .pdf
AddIcon /icons/text.gif .txt
AddIcon /icons/c.gif .c
AddIcon /icons/p.gif .pl .py
AddIcon /icons/f.gif .for
AddIcon /icons/dvi.gif .dvi
AddIcon /icons/uuencoded.gif .uu
AddIcon /icons/script.gif .conf .sh .shar .csh .ksh .tcl
AddIcon /icons/tex.gif .tex
AddIcon /icons/bomb.gif core

AddIcon /icons/back.gif ..
AddIcon /icons/hand.right.gif README
AddIcon /icons/folder.gif ^^DIRECTORY^^
AddIcon /icons/blank.gif ^^BLANKICON^^

DefaultIcon /icons/unknown.gif

ReadmeName README.html
HeaderName HEADER.html

IndexIgnore .??* *~ *# HEADER* RCS CVS *,t

AddEncoding x-compress Z
AddEncoding x-gzip gz tgz

AddLanguage da .dk
AddLanguage nl .nl
AddLanguage en .en
AddLanguage et .et
AddLanguage fr .fr
AddLanguage de .de
AddLanguage el .el
AddLanguage it .it
AddLanguage ja .ja
AddLanguage pl .po
AddLanguage ko .ko
AddLanguage pt .pt
AddLanguage no .no
AddLanguage pt-br .pt-br
AddLanguage ltz .ltz
AddLanguage ca .ca
AddLanguage es .es
AddLanguage sv .se
AddLanguage cz .cz
AddLanguage ru .ru
AddLanguage tw .tw
AddLanguage zh-tw .tw

LanguagePriority en da nl et fr de el it ja ko no pl pt pt-br ltz ca es sv tw



AddCharset ISO-8859-1  .iso8859-1  .latin1
AddCharset ISO-8859-2  .iso8859-2  .latin2 .cen
AddCharset ISO-8859-3  .iso8859-3  .latin3
AddCharset ISO-8859-4  .iso8859-4  .latin4
AddCharset ISO-8859-5  .iso8859-5  .latin5 .cyr .iso-ru
AddCharset ISO-8859-6  .iso8859-6  .latin6 .arb
AddCharset ISO-8859-7  .iso8859-7  .latin7 .grk
AddCharset ISO-8859-8  .iso8859-8  .latin8 .heb	
AddCharset ISO-8859-9  .iso8859-9  .latin9 .trk
AddCharset ISO-2022-JP .iso2022-jp .jis
AddCharset ISO-2022-KR .iso2022-kr .kis
AddCharset ISO-2022-CN .iso2022-cn .cis
AddCharset Big5        .Big5       .big5
# For russian, more than one charset is used (depends on client, mostly):
AddCharset WINDOWS-1251 .cp-1251   .win-1251
AddCharset CP866       .cp866
AddCharset KOI8-r      .koi8-r .koi8-ru
AddCharset KOI8-ru     .koi8-uk .ua
AddCharset ISO-10646-UCS-2 .ucs2
AddCharset ISO-10646-UCS-4 .ucs4
AddCharset UTF-8       .utf8

AddCharset GB2312      .gb2312 .gb 
AddCharset utf-7       .utf7
AddCharset utf-8       .utf8
AddCharset big5	       .big5 .b5
AddCharset EUC-TW      .euc-tw	
AddCharset EUC-JP      .euc-jp
AddCharset EUC-KR      .euc-kr
AddCharset shift_jis   .sjis

AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps

AddType application/x-tar .tgz
AddType application/x-otrkey .otrkey
AddType text/html .shtml

<FilesMatch "\.shtml(\..+)?$">
    SetOutputFilter INCLUDES
</FilesMatch>


BrowserMatch "Mozilla/2" nokeepalive
BrowserMatch "MSIE 4\.0b2;" nokeepalive downgrade-1.0 force-response-1.0
BrowserMatch "RealPlayer 4\.0" force-response-1.0
BrowserMatch "Java/1\.0" force-response-1.0
BrowserMatch "JDK/1\.0" force-response-1.0

BrowserMatch "Microsoft Data Access Internet Publishing Provider" redirect-carefully
BrowserMatch "^WebDrive" redirect-carefully
BrowserMatch "^gnome-vfs" redirect-carefully 
BrowserMatch "^WebDAVFS/1.[012]" redirect-carefully




Include /etc/apache2/sites-enabled/[^.#]*

CBandScoreFlushPeriod 1
CBandRandomPulse On


NameVirtualHost server1.holidayload.de

<VirtualHost server1.holidayload.de>
#    ServerAdmin webmaster@host.some_domain.com
    DocumentRoot /home/load/
    ServerName server1.holidayload.de
#    ErrorLog logs/host.some_domain.com-error.log
#    CustomLog logs/host.some_domain.com-access.log common
#CBandSpeed 100000000 100 300
CBandRemoteSpeed 1600kb/s 3 2

</VirtualHost>
 
Jetzt müssten wir nur noch wissen, für welches MPM Modell du dich beim apache entschieden hast.
Bei debian kommt es darauf an, welches Paket du installiert hast. Die verschiedenen Varianten heissen apache2-mpm-*
Unter Gentoo legst du das mittels USE Flags des apache ebuilds fest.

Wobei es beim ersten Blick auf die Config relativ egal ist, die Werte da sind doch ziemlich mager ;)


Falls bei dir nicht schon standart, würde ich auf alle Fälle zum mpm-worker raten. Ist gut für High traffic server.
Und dann solltest du den passenden Abschnitt der Konfig anpassen (den <IfModule worker.c> - Teil)

Du hast
ThreadsPerChild 25
MaxSpareThreads 75

25 * 75 = 1875

Du solltest also
MaxClients 1875
setzen.

Nur mal so als Grob-Tuning
 
Last edited by a moderator:
Code:
Timeout 300
würde ich auf 30 setzen und
Code:
KeepAliveTimeout 15
auf 4

Dann schauen ob es besser wird. Zurücksetzen kann man immer noch :rolleyes:

Pro Verbindung wird ja nur eine MovieDatei .wmv o.ä. geladen oder? evtl. sollte man KeepAlive=Off verwenden. KeepAlive=On macht sich positiv bemerkbar wenn pro Verbindung sehr viele Dateien z.B. .jpg .gif geladen werden müssen.

Wenn KeepAlive=On dann muss KeepAliveTimeout sehr kurz sein z.B. 4

Beispiel CJ TGP Site:

Solche Seiten haben ~ 100 .jpg Dateien und eine .php. KeepAlive=On bedeutet die Verbindung zum Client wird offen gehalten bis alle 101 Requests (Dateien) versendet wurden. Das dauerd keine Sekunde. KeepAliveTimeout=4 beendet die Verbindung nach 4 Sekunden.

Bei KeepAlive=Off wird für jede! .jpg Datei ein extra Verbindung benötigt.

Quelle


Hier ein Bericht von einem Admin der 400 gleichzeitige Verbindungen hatte.

Timeout wurde auf 30 gesenkt und KeepAliveTimeout auf 3, MaxClients auf 30 d.h. alle 3 Sekunden konnten 30 Clients die Seite laden.

Noch ein Guide über Performance Tuning

KeepAliveTimeout könnte man ausrechnen indem man Seitengrösse in KB durch Downstream Client teilt. Als Durchnsittsclient habe ich DSL 1000 angenommen. Das sind ~ 125 KB Downsream. Die Webseite hat komplett ~ 300 KB : 125 KB = 2,4 Sekunden. KeepAliveTimeout 4 sollte ausreichend sein damit der Client die Seite innerhalb einer offenen Verbindung laden kann. Der User klickt ja nicht sofort auf einen Link sondern schaut sich erstmal um. Apache hat die Verbindunng längst beendet und Prozess einem anderen Clienten zur Verfügung gestellt.

?
Könnte auch am Netzwerk liegen oder? Angenommen 120 Clients saugen Movie mit 100 KB = 12.000 KB = 10 MB. Netzwerkkarte hat 12,5 MB. Für den Seitenaufruf bleiben dann noch 500 KB übrig. Das sind 500 KB : 30 Clients (bei max 150 - 120) = ~ 15 KB/s
 
Last edited by a moderator:
Back
Top