Optmierungsbedarf (server hängt sich auf)

apfelqoo

New Member
Hallo :)

ich bin in Besitz eines V-Servers bei Strato. Problem an dem gutem ist, dass er nur 128 MB Ram (+flex) hat. Nun kam es in den Vergangenen Wochen öffters dazu, dass sich Apache und der SQL Server scheinbar so voll fressen, dass mir selbst der Zugriff via SSH untersagt wurde. Ein paar mal erwischte es mich sogar, als ich gerade per SSH eingeloggt war.

Folgendes habe ich seitdem getan/versucht:
- beenden diverser nicht benötigter Dienste
- "anpassen" der conf. für Apache2 und Mysql (wobei ich es damit anfangs eher schlimmer als besser gemacht habe und am Ende die Standards per Notfallkonsole einspielen durfte.

Mir ist klar, dass es keine Universalkonfiguration für Apache2 und Mysql gibt - jedoch hoffe ich, dass Ihr mir ein paar Tips zur Optimierung geben könntet.

Ich habe noch ein Bild mit ein paar Informationen zum Server angehängt.
Vielen Dank für Eure Hilfe im Vorraus !!!
 

Attachments

  • Unbenannt.jpg
    Unbenannt.jpg
    120.2 KB · Views: 139
Last edited by a moderator:
Probiers doch mal mit lighttpd, ist bei dem geringen Ram deutlich sinnvoller ;)
Ansonsten poste einmal deine bisherige Apache-Config, vorallem den MPM Teil.


MfG Christian
 
Hallo und vielen Dank für deinen Vorschlag. Hier erstmal die beiden Konfigurationen:

apache2.conf
Code:
ServerRoot "/etc/apache2"

#
# The accept serialization lock file MUST BE STORED ON A LOCAL DISK.
#
#<IfModule !mpm_winnt.c>
#<IfModule !mpm_netware.c>
LockFile /var/lock/apache2/accept.lock
#</IfModule>
#</IfModule>

PidFile ${APACHE_PID_FILE}

Timeout 15

KeepAlive On

MaxKeepAliveRequests 500

KeepAliveTimeout 2

<IfModule mpm_prefork_module>
    StartServers          5
    MinSpareServers       5
    MaxSpareServers       10
    MaxClients            20
    MaxRequestsPerChild   1000
</IfModule>

<IfModule mpm_worker_module>
    StartServers         5
    MaxClients           100
    MinSpareThreads      10
    MaxSpareThreads      30 
    ThreadsPerChild      20
    MaxRequestsPerChild  1000
</IfModule>

# These need to be set in /etc/apache2/envvars
User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}

AccessFileName .htaccess

#
# The following lines prevent .htaccess and .htpasswd files from being 
# viewed by Web clients. 
#
<Files ~ "^\.ht">
    Order allow,deny
    Deny from all
</Files>

DefaultType text/plain


HostnameLookups Off

# ErrorLog: The location of the error log file.
# If you do not specify an ErrorLog directive within a <VirtualHost>
# container, error messages relating to that virtual host will be
# logged here.  If you *do* define an error logfile for a <VirtualHost>
# container, that host's errors will be logged there and not here.
#
#ErrorLog /var/log/apache2/error.log

#
# LogLevel: Control the number of messages logged to the error_log.
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
#
#LogLevel warn

# Include module configuration:
Include /etc/apache2/mods-enabled/*.load
Include /etc/apache2/mods-enabled/*.conf

# Include all the user configurations:
Include /etc/apache2/httpd.conf

# Include ports listing
Include /etc/apache2/ports.conf

#
# The following directives define some format nicknames for use with
# a CustomLog directive (see below).
# If you are behind a reverse proxy, you might want to change %h into %{X-Forwarded-For}i
#
#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

#
# ServerTokens
# This directive configures what you return as the Server HTTP response
# Header. The default is 'Full' which sends information about the OS-Type
# and compiled in modules.
# Set to one of:  Full | OS | Minor | Minimal | Major | Prod
# where Full conveys the most information, and Prod the least.
#
ServerTokens Full

#
# Optionally add a line containing the server version and virtual host
# name to server-generated pages (internal error documents, FTP directory 
# listings, mod_status and mod_info output etc., but not CGI generated 
# documents or custom error documents).
# Set to "EMail" to also include a mailto: link to the ServerAdmin.
# Set to one of:  On | Off | EMail
#
ServerSignature On



#
# Customizable error responses come in three flavors:
# 1) plain text 2) local redirects 3) external redirects
#
# Some examples:
#ErrorDocument 500 "The server made a boo boo."
#ErrorDocument 404 /missing.html
#ErrorDocument 404 "/cgi-bin/missing_handler.pl"
#ErrorDocument 402 http://www.example.com/subscription_info.html
#

#
# Putting this all together, we can internationalize error responses.
#
# We use Alias to redirect any /error/HTTP_<error>.html.var response to
# our collection of by-error message multi-language collections.  We use 
# includes to substitute the appropriate text.
#
# You can modify the messages' appearance without changing any of the
# default HTTP_<error>.html.var files by adding the line:
#
#   Alias /error/include/ "/your/include/path/"
#
# which allows you to create your own set of files by starting with the
# /usr/share/apache2/error/include/ files and copying them to /your/include/path/, 
# even on a per-VirtualHost basis.  The default include files will display
# your Apache version number and your ServerAdmin email address regardless
# of the setting of ServerSignature.
#
# The internationalized error documents require mod_alias, mod_include
# and mod_negotiation.  To activate them, uncomment the following 30 lines.

#    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 cs de es fr it nl sv pt-br ro
#        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_UNSUPPORTED_MEDIA_TYPE.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



# Include of directories ignores editors' and dpkg's backup files,
# see README.Debian for details.

# Include generic snippets of statements
Include /etc/apache2/conf.d/

# Include the virtual host configurations:
Include /etc/apache2/sites-enabled/
AddOutputFilter INCLUDES .shtml
AddType text/html .shtml
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps




MySQL (my.cnf)
Code:
[client]
port		= 3306
socket		= /var/run/mysqld/mysqld.sock

[mysqld_safe]
socket		= /var/run/mysqld/mysqld.sock
nice		= 0

[mysqld]
set-variable=local-infile=0

user		= mysql
pid-file	= /var/run/mysqld/mysqld.pid
socket		= /var/run/mysqld/mysqld.sock
port		= 3306
basedir		= /usr
datadir		= /var/lib/mysql
tmpdir		= /tmp
language	= /usr/share/mysql/english
skip-external-locking

key_buffer				= 20M
max_allowed_packet		= 20M
thread_stack			= 128K
thread_cache_size		= 8
max_connections    		= 50
table_cache         	= 600
#thread_concurrency     = 4

query_cache_limit       = 1M
query_cache_size        = 16M

#log		= /var/log/mysql/mysql.log
#log_slow_queries	= /var/log/mysql/mysql-slow.log
#long_query_time = 2
#log-queries-not-using-indexes


#server-id			= 1
#log_bin			= /var/log/mysql/mysql-bin.log
expire_logs_days	= 10
max_binlog_size     = 100M
#binlog_do_db		= include_database_name
#binlog_ignore_db	= include_database_name

skip-bdb

[mysqldump]
quick
quote-names
max_allowed_packet	= 8M

[mysql]
#no-auto-rehash	# faster start of mysql but no tab completition

[isamchk]
key_buffer		= 8M

!includedir /etc/mysql/conf.d/


Evtl (wahrscheinlich sogar) lässt sich dort einiges besser machen, als es derzeit ist. Leider fehlt mir in dieser Richtung etwas das knowhow.

Vielen Dank für Eure Hilfe!
 
Die CPU-Auslastung in dem geposteten Bild spricht eher für eine kleine Webseite. Aber für konkrete Tips fehlen noch ein paar Angaben:

Welche Art von Apache setzt Du denn ein? mpm-prefork oder mpm-worker?
Wie läuft bei Dir PHP? als CGI? als mod_PHP?

Für eine optimale Speicherauslastung würde ich eher zu fcgid + mpm-worker tendieren. Falls Du nicht auf Apache2 angewiesen bist - wäre in jedem Falle lighttpd oder vergleichbare besser geeignet. Weiterhin wären dann z.B. 3 Startserver vermutlich mehr als ausreichend.

Alternativ den Apache als mpm-worker selber kompilieren und dabei wirklich nur das einbinden was tatsächlich benötigt wird. Gleiches gilt für PHP. Das reduziert den Speicherbedarf generell etwas.
 
Das auftretende Problem klingt danach, dass der Arbeitsspeicher einfach nicht für den Betrieb deiner Webseite ausreichend ist. Anfragen werden daher nicht mehr angenommen und man kann nicht mehr auf den Server verbinden, diesen aber noch per Ping erreichen.

Lösung: Anderes Systemseitiges Handling der Anfragen, was nicht so speicherintensiv ist. z.B. die Nutzung von mod_php als PHP Handling oder RAM Upgrade.
 
Ersteinmal vielen Dank für die Antworten!

@IP-Projects.de:
Ein Ram Upgrade ist leider nur unter größerem Aufwand möglich (neuen Server bestellen, Seite und Einstellungen übertragen, Domains übertragen etc.) Was mod_php angeht werde ich mich mal einlesen.

@TerraX:
Es sind 3 Websiten - mit insgesammt 500 Klicks/Tag. Deine anderen Fragen kann ich leider nicht beantworten, da ich ehrlich gesagt weder die Unterschiede noch die Vor-und Nachteile kenne (ich habe kein Plan was ich habe und wie ich das rausfinde)
 
Vor dem gleichen Problem stehe ich auch - Strato bietet keine Möglichkeit, den vServer auf einen modernen "upzugraden" - nein, man muss einen neuen bestellen und den alten kündigen.

Hast du schon alle überflüssigen Apache-Module deaktiviert, die du nicht brauchst? Bei mir hat das hier:
a2dismod mod_python
a2dismod autoindex
a2dismod dir
a2dismod mime
einiges an RAM gebracht. Zwischen 30-40 MB ungefähr müssten das gewesen sein. Wenn du dann noch die Min-Server zurückfährst, dürftest du bestimmt 50-60 MB insgesamt "rausgeholt" haben, wenn nicht sogar mehr, weil du ja auch mehr Module deaktivieren kannst.

btw: Wofür sind eigentlich "mod_actions" und "mod_negotiation"?
 
Last edited by a moderator:
Benutze mal das Tuning-Primer Script um zu sehen wie es in Punkto MySQL Konfig aussieht:
http://www.day32.com/MySQL/

Je nachdem was für Engines du verwendest kannst du bei MySQL generell schon etwas an RAM einsparen indem du nicht genutzte Engines deaktivierst, kommt auch der Performance zugute.
Wenn alle deine Datenbanken z.B. ausschliesslich MyISAM nutzen kannst du Berkeley DB und INNODB deaktivieren:
Code:
skip-bdb
skip-innodb

Zudem wäre ein externer PHP Cache (wie z.B. eaccelerator) hilfreich um RAM- und CPU-Auslastung zu reduzieren, auch PHP selbst sollte optimiert werden wenn du dann schon mal in der php.ini bist...;)
 
Last edited by a moderator:
Wie findet man denn raus, welche SQL-Engines verwendet werden von den aktuellen Tabellen? Gibt's da irgend ein SQL-Statement, mit dem sich das realisieren/anzeigen lässt?
 
Für die furchtlosen SQL-Coder unter Euch:
Code:
SHOW VARIABLES LIKE '%inno%';
Insbesondere "have_inno" dürfte interessant sein.
Wer Plesk einsetzt: Plesk nutzt sowohl MyISAM als auch InnoDb für seine Tabellen.

huschi.
 
Back
Top