Överbelastning (MySQL och Apache2), vad göra?

Permalänk

Överbelastning (MySQL och Apache2), vad göra?

Tjena alla,

Behöver lite expertis-hjälp här.. Driver två feta forum på min server här hemma. Totalt är det cirka 1.200 användare varje sekund som browsar sidorna och detta äter förjävligt på systemet. Load average är 30.82 24.82 32.91 för tillfället. Vad ska man göra? Jag kör Linux och har försökt tweaka Apache2 och MySQL så gott det går men utan resultat.

Så här ser min my.cnf ut

# # The MySQL database server configuration file. # # You can copy this to one of: # - "/etc/mysql/my.cnf" to set global options, # - "~/.my.cnf" to set user-specific options. # # One can use all long options that the program supports. # Run program with --help to get a list of available options and with # --print-defaults to see which it would actually understand and use. # # For explanations see # http://dev.mysql.com/doc/mysql/en/server-system-variables.htm... # This will be passed to all mysql clients # It has been reported that passwords should be enclosed with ticks/quotes # escpecially if they contain "#" chars... # Remember to edit /etc/mysql/debian.cnf when changing the socket location. [client] port = 3306 socket = /var/run/mysqld/mysqld.sock # Here is entries for some specific programs # The following values assume you have at least 32M ram # This was formally known as [safe_mysqld]. Both versions are currently parsed. [mysqld_safe] socket = /var/run/mysqld/mysqld.sock nice = 0 [mysqld] # # * Basic Settings # 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 # # Instead of skip-networking the default is now to listen only on # localhost which is more compatible and is not less secure. bind-address = 127.0.0.1 # # * Fine Tuning # key_buffer = 16M max_allowed_packet = 16M thread_stack = 128K thread_cache_size = 8 # # * Query Cache Configuration # query_cache_limit = 1M query_cache_size = 16M # # * Logging and Replication # # Both location gets rotated by the cronjob. # Be aware that this log type is a performance killer. #log = /var/log/mysql/mysql.log # # # The following can be used as easy to replay backup logs or for replication. # note: if you are setting up a replication slave, see README.Debian about # other settings you may need to change. #server-id = 1 log_bin = /var/log/mysql/mysql-bin.log # WARNING: Using expire_logs_days without bin_log crashes the server! See README.Debian! expire_logs_days = 5 max_binlog_size = 50M # # * BerkeleyDB # # Using BerkeleyDB is now discouraged as its support will cease in 5.1.12. skip-bdb # # * InnoDB # # InnoDB is enabled by default with a 10MB datafile in /var/lib/mysql/. # Read the manual for more InnoDB related options. There are many! # You might want to disable InnoDB to shrink the mysqld process by circa 100MB. #skip-innodb # # * Security Features # # Read the manual, too, if you want chroot! # chroot = /var/lib/mysql/ # [mysqldump] quick quote-names max_allowed_packet = 16M [mysql] #no-auto-rehash [isamchk] key_buffer = 16M # # ADDITIONAL # old_passwords = false

Och så här för apache2.conf

# # Based upon the NCSA server configuration files originally by Rob McCool. # # This is the main Apache server configuration file. It contains the # configuration directives that give the server its instructions. # See http://httpd.apache.org/docs/2.2/ for detailed information about # the directives. # # Do NOT simply read the instructions in here without understanding # what they do. They're here only as hints or reminders. If you are unsure # consult the online docs. You have been warned. # # The configuration directives are grouped into three basic sections: # 1. Directives that control the operation of the Apache server process as a # whole (the 'global environment'). # 2. Directives that define the parameters of the 'main' or 'default' server, # which responds to requests that aren't handled by a virtual host. # These directives also provide default values for the settings # of all virtual hosts. # 3. Settings for virtual hosts, which allow Web requests to be sent to # different IP addresses or hostnames and have them handled by the # same Apache server process. # # Configuration and logfile names: If the filenames you specify for many # of the server's control files begin with "/" (or "drive:/" for Win32), the # server will use that explicit path. If the filenames do *not* begin # with "/", the value of ServerRoot is prepended -- so "/var/log/apache2/foo.log" # with ServerRoot set to "" will be interpreted by the # server as "//var/log/apache2/foo.log". # ### Section 1: Global Environment # # The directives in this section affect the overall operation of Apache, # such as the number of concurrent requests it can handle or where it # can find its configuration files. # # # ServerRoot: The top of the directory tree under which the server's # configuration, error, and log files are kept. # # NOTE! If you intend to place this on an NFS (or otherwise network) # mounted filesystem then please read the LockFile documentation (available # at <URL:http://httpd.apache.org/docs-2.1/mod/mpm_common.html#lockfile>); # you will save yourself a lot of trouble. # # Do NOT add a slash at the end of the directory path. # 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: The file in which the server should record its process # identification number when it starts. # PidFile /var/run/apache2.pid # # Timeout: The number of seconds before receives and sends time out. # Timeout 60 # # KeepAlive: Whether or not to allow persistent connections (more than # one request per connection). Set to "Off" to deactivate. # KeepAlive On # # MaxKeepAliveRequests: The maximum number of requests to allow # during a persistent connection. Set to 0 to allow an unlimited amount. # We recommend you leave this number high, for maximum performance. # MaxKeepAliveRequests 100 # # KeepAliveTimeout: Number of seconds to wait for the next request from the # same client on the same connection. # KeepAliveTimeout 5 ## ## Server-Pool Size Regulation (MPM specific) ## # prefork MPM # StartServers: number of server processes to start # MinSpareServers: minimum number of server processes which are kept spare # MaxSpareServers: maximum number of server processes which are kept spare # MaxClients: maximum number of server processes allowed to start # MaxRequestsPerChild: maximum number of requests a server process serves <IfModule mpm_prefork_module> StartServers 5 MinSpareServers 5 MaxSpareServers 10 MaxClients 150 MaxRequestsPerChild 0 </IfModule> # worker MPM # StartServers: initial number of server processes to start # MaxClients: maximum number of simultaneous client connections # MinSpareThreads: minimum number of worker threads which are kept spare # MaxSpareThreads: maximum number of worker threads which are kept spare # ThreadsPerChild: constant number of worker threads in each server process # MaxRequestsPerChild: maximum number of requests a server process serves <IfModule mpm_worker_module> StartServers 2 MaxClients 150 MinSpareThreads 25 MaxSpareThreads 75 ThreadsPerChild 25 MaxRequestsPerChild 0 </IfModule> User www-data Group www-data # # AccessFileName: The name of the file to look for in each directory # for additional configuration directives. See also the AllowOverride # directive. # 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 is the default MIME type the server will use for a document # if it cannot otherwise determine one, such as from filename extensions. # If your server contains mostly text or HTML documents, "text/plain" is # a good value. If most of your content is binary, such as applications # or images, you may want to use "application/octet-stream" instead to # keep browsers from trying to display binary files as though they are # text. # DefaultType text/plain # # HostnameLookups: Log the names of clients or just their IP addresses # e.g., www.apache.org (on) or 204.62.129.132 (off). # The default is off because it'd be overall better for the net if people # had to knowingly turn this feature on, since enabling it means that # each client request will result in AT LEAST one lookup request to the # nameserver. # 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 crit # 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). # 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 Minimal # # 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 OFF # Include generic snippets of statements Include /etc/apache2/conf.d/ # Include the virtual host configurations: Include /etc/apache2/sites-enabled/

Hur ska man lösa detta? Jag har försökt ändra lite här och var, men det blir mest bara sämre. Är den enda utvägen att köpa bättre hårdvara? Forummedlemmarna klagar och när jag ska SSH:a får jag vänta 5-10 sekunder för varje bokstav. Linan är 100/100, så problemet ligger inte där. Tacksam för åsikter och förslag. :/

Visa signatur

Gigabyte-P35-DS4 | Intel Core 2 Quad Q6600 [3 GHz] | 2x1GB Corsair XMS-6400@800Mhz | Nvidia Geforce 460 GTX [975/2000 MHz] | Intel 320 Series 80 GB SSD | | SETI@Home Team: Sweclockers.com

Permalänk

Skulle säga mer hårdvara, inte bättre.

Skaffa en separat burk för MySQL tror jag är den bästa lösningen, kanske även en proxy för extra avlastning.

Permalänk
Medlem

Load värdena säger inget om problemet om du inte tar med CPU belastningen, hog load + låg CPU = blockningsproblem exempelvis.

Sedan som jag skrev i förra tråden som du skapade är Keepallives mord på en apache server egentligen då det har en tendens att låta användarna binda upp resurser i onödan och sist men inte minst, cachening.. ser inte att du har kollat alls på de sakerna som föreslogs senast..

Visa signatur

"Stallman to Dvorak: Welcome to freedom, your rulebook is in the mail" - Fake Steve Jobs
rfc-1925 - The Twelve Networking Truths

Permalänk

Hej på er,

ntity: Dåligt av mig. Men nu är det allvarligt.. så du tycker helt enkelt att jag ska stänga av KeepAlive helt och hållet? Output av 'top' ser ungefär ut så här i skrivande stund: http://psy.sh.nu/~googlah/top.jpg

100 MB kvar av minnet ungefär... 1024MB RAM tot. CPU:n ligger konstant på 80-100%. Och MySQL har legat konstant på i 54 minuter verkar det som. Illa? Jag behöver alla åsikter jag kan få för att förbättra läget. Nåt mer än KeepAlive jag ska stänga av/ändra?

Tack.

Visa signatur

Gigabyte-P35-DS4 | Intel Core 2 Quad Q6600 [3 GHz] | 2x1GB Corsair XMS-6400@800Mhz | Nvidia Geforce 460 GTX [975/2000 MHz] | Intel 320 Series 80 GB SSD | | SETI@Home Team: Sweclockers.com

Permalänk
Medlem

nu är jag varken expert på vare sig apache eller mysql...
men om du har 1200 hits i sekunden blir det 72000 i minuten.

detta låter helt galet mycket, och det skulle till att börja med vara intressant att höra lite mer om din hårdvara än att du har 1 gig ram.

tweaking av confar i all ära, men det känns som att du förväntar dig underverk...

du sa att du ville ha alla åsikter, och min åsikt är att du angriper problemet vid sin grund, börja med att se över om det ens är realisktiskt att få det att fungera på din hårdvara.

Permalänk

Jag har nog runt 1.200 anrop i sekunden, tyvärr. MySQL gör nu t.o.m time-out ibland på grund av belastningen. Hårdvaran burken sitter på är en gammal AMD 3200+, 1 GB RAM, 250GB IDE-disk och 100/100-lina. Jag vetitusan vad jag ska göra.. förutom att låta det hända.

Är man illa tvungen att köpa en dual core och 4GB ram för att klara det här? Eller kan man ändra något uppenbart i apache2.conf eller my.cnf? MPM Worker och Prefork MPM är man lite osäker på. Tack för hjälpen!

Visa signatur

Gigabyte-P35-DS4 | Intel Core 2 Quad Q6600 [3 GHz] | 2x1GB Corsair XMS-6400@800Mhz | Nvidia Geforce 460 GTX [975/2000 MHz] | Intel 320 Series 80 GB SSD | | SETI@Home Team: Sweclockers.com

Permalänk
Medlem

60 i load utan att ha 100% cpu belastning, då är du inte CPU bound utan mer troligt IO.. en "ps aux" visar sådant bättre än top (som suger i största allmänhet)

Om det är så att du är IO bound är det snabbare diskar som gäller, personligen hade jag dock maxat ut maskinen på RAM och kört allt på en stor RAM-disk för att aldrig droppa ner på bussen (spec IDE som är så pass slött)

Annars är det som sagt cachning som gäller, eller för den delen att kasta mer hårdbvara mot problemet att dela upp belastningen på en SQL och en eller 2 webbservrar.

tiden som du ser vid mysql är mängden CPU tid som den har konsumerat, inte tiden som den har varit igång.

PS, angående din timeout på mysql är det nog med pga av loaden, det tar helt enkelt för länge mellan det att en fråga ställs till mysql och den blir schedulad in på CPUn för att kunna svara. Samma anledning är det även att du måste vänta så länge på att tecken som du skriver skall synas...
DS

Visa signatur

"Stallman to Dvorak: Welcome to freedom, your rulebook is in the mail" - Fake Steve Jobs
rfc-1925 - The Twelve Networking Truths

Permalänk
Medlem

vad är det för hemsida du har med så många användare?

Visa signatur

- Det var inte bättre förr, det var bara roligare.

Permalänk

Okej, tack för ditt svar ntity. Angående hårddiskarna så märker jag inte nämnvärt att hårddisken jobbar. HDD-lampan blinkar ibland, men för det mesta inte. Det måste ju tyda på att det är mest RAM och CPU som jobbar väl?

Sajterna som hostas är i första hand http://27mhz.se och allra minst http://movie-forumz.org som i skrivande stund har 1.000 besökare. Ni märker väl antagligen själv hur segt det är!? Allra jobbigast är att man inte kan köra SSH utan att vänta i 10 minuter typ... ett kommando kan ta upp till 60 sekunder att skriva. Nästan så att jag stänger ner en av sidorna för att kunna jobba i SSH... :/

Jag vore otroligt tacksam om någon kunde komma med något konkret att göra.. Forumen börjar bli så pass stora så det kommer bara bli värre med tiden. Jag vet inte vad jag ska göra, ska man satsa på ny hårdvara eller går det att optimera systemet på något sätt? Vad skulle ni ha gjort?

Jag testade stänga av KeepAlive men istället så fick MySQL time-out imellanåt. Inte bättre där inte.

Detta är en output av /etc/init.d/mysql STATUS

Server version 5.0.45-Debian_1ubuntu3-log Protocol version 10 Connection Localhost via UNIX socket UNIX socket /var/run/mysqld/mysqld.sock Uptime: 1 hour 39 min 44 sec Threads: 7 Questions: 599526 Slow queries: 60 Opens: 3943 Flush tables: 1 Open tables: 64 Queries per second avg: 100.188

Alltså 100 frågor i sekunden. Rätt mycket.. om någon kan komma med förslag till rena optimeringar som gör underverk kan jag nästan ge en slant för de.

Ntity: Vad tycker du jag ska köra på RAM-disken isåfall? Enligt Ubuntu Wiki så är det redan en mountad i /dev/shm. Kommer det göra stor skillnad?

Visa signatur

Gigabyte-P35-DS4 | Intel Core 2 Quad Q6600 [3 GHz] | 2x1GB Corsair XMS-6400@800Mhz | Nvidia Geforce 460 GTX [975/2000 MHz] | Intel 320 Series 80 GB SSD | | SETI@Home Team: Sweclockers.com

Permalänk
Medlem

Det jätteenkla svaret är ju så klart att du måste investera i separata burkar för databas och hemsidan. Tror knappast en liten tweakning i någon obskyr configfil kommer hjälpa dig, tyvärr.

Edit: föressten, har du kollat alla loggar så att du inte sitter och blir typ attackerad av någon idiot?

Permalänk

Tråkigt att höra.. men om vi säger så här då, låter det RIMLIGT att burken ska bli så här seg av att ha igång Apache2 + MySQL? Stänger jag av dessa svarar burken på SSH på 0.000003 sekunder. Dvs, jättesnabbt. Så problemet ligger i hostingen... så det låter normalt? Det är SÅ drygt att inte kunna administrera via SSH. Installerade just paketet Imagemagick och det tog cirka 2 minuter... i vanliga fall 6 sekunder.

Tråkigt nog får jag väl ta och titta på lite ny hårdvara. Tack för inputen Poka64.

Visa signatur

Gigabyte-P35-DS4 | Intel Core 2 Quad Q6600 [3 GHz] | 2x1GB Corsair XMS-6400@800Mhz | Nvidia Geforce 460 GTX [975/2000 MHz] | Intel 320 Series 80 GB SSD | | SETI@Home Team: Sweclockers.com

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Googlah
Tråkigt att höra.. men om vi säger så här då, låter det RIMLIGT att burken ska bli så här seg av att ha igång Apache2 + MySQL? Stänger jag av dessa svarar burken på SSH på 0.000003 sekunder. Dvs, jättesnabbt. Så problemet ligger i hostingen... så det låter normalt? Det är SÅ drygt att inte kunna administrera via SSH. Installerade just paketet Imagemagick och det tog cirka 2 minuter... i vanliga fall 6 sekunder.

Tråkigt nog får jag väl ta och titta på lite ny hårdvara. Tack för inputen Poka64.

Det är väl klart att datorn bli responsiv när du stänger ner apache och mysql, det är ju de som tar kraften.
En avstängd bil drar mindre bensin är en som är igång.

Skaffa fler burkar, eller bättre hårdvara.
Skaffa två burkar för apache och två för MySQL så löser det sig.

Visa signatur

"Problemet med socialism är att till sist tar alla andras pengar slut" - Margaret Thatcher

Permalänk
Medlem

här är en utmärkt guide om hur man clustrar två apache servrar http://www.howtoforge.com/high_availability_loadbalanced_apac...

Visa signatur

PSN: todddan Adda gärna

Permalänk

Och här får du en guide hur man sätter upp ett MySQL kluster http://www.howtoforge.com/loadbalanced_mysql_cluster_debian (på debian dock, men du kan säkert anpassa till vilken dist du nu har).

Visa signatur

Permalänk
Medlem

Jag tror att cache, som redan har nämnts, löser dina problem. Det verkar ju vara Movie-forumz som käkar all prestanda. Saken är ju den att det forumet inte har särskilt många inlägg utan att de flesta besökarna enbart läser. Så om du sparar alla aktuella trådar i ramminnet så lär du få ner loaden rätt rejält.

EDIT: I villket fall som helst låter det mycket med 1200 hits i sekunden och samtidigt bara 100 frågor per sekund till databasen. För det verkar ju som sagt vara Movie-forumz som äter upp all prestanda för 27mhz.se verkar ju inte vara så pass populär att den har så många hits/sekund.

Permalänk
Medlem

Jag frågade inte om din HDD lampa lös eller inte, jag ville se vad det var som orsakade blocktiderna som i sin tur orsakar din långa processkö, men just nu låter det mer som om du vill ha någon som kommer och bara fixar det.. så det kanske är dags att du lämnar driften till någon som vet vad de sysslar med?

Visa signatur

"Stallman to Dvorak: Welcome to freedom, your rulebook is in the mail" - Fake Steve Jobs
rfc-1925 - The Twelve Networking Truths

Permalänk
Hedersmedlem

Två problem heter i varje fall vBulletin och phpBB (om inte idag så kommer de bli ). Båda är riktigt sega i största allmänhet. Om du kan PHP och MySQL väl bör du börja kolla på att optimera forumkoden.

Angående hårdvara, Sweclockers körs på två servrar, en dedikerad webbserver och en dedikerad datasserver.
Börja med att identifiera vilken av processerna det är som käkar I/O och utgå därifrån. Mycket I/O från MySQL (mycket troligt) -> minst en dedikerad MySQL-burk med mycket minne, detsamma angående Apache (där är det mest CPU:n som får jobba för att tolka PHP dock) eller en kombination av båda.

Visa signatur

Vim
Kinesis Classic Contoured (svart), Svorak (A5)
Medlem i signaturgruppen Vimzealoter.

Permalänk

Börja med att köpa lite mer minne tycker jag, större buffrar/cachen så man inte behöver läsa från disk lika mycket. Sedan lite optimering av själva mjukvaran kanske, stäng av onödiga saker som inte behövs. Kolla hur sökningar går till, om man bara kör någon sökning med LIKE %% i MySQL istället för tex fulltextseach så kan det verkligen döda prestandan.

Permalänk
Medlem

Kanske testa på lite APC eller xcache eller liknande saker

Visa signatur