CPU-Auslastung LAMP-Stapel

CPU-Auslastung LAMP-Stapel

Wir haben eine ec2 m2.4xlarge mit Magento (CentOS 5.6, httpd 2.2, PHP 5.2.17 mit Eaccelerator 0.9.5.3, MySQL 5.1.52). Im Moment haben wir einen großen Traffic-Spitzenwert und unser Top sieht so aus:

top - 09:41:29 up 31 days,  1:12,  1 user,  load average: 120.01, 129.03, 113.23
Tasks: 1190 total,  18 running, 1172 sleeping,   0 stopped,   0 zombie
Cpu(s): 97.3%us,  1.8%sy,  0.0%ni,  0.5%id,  0.0%wa,  0.0%hi,  0.0%si,  0.4%st
Mem:  71687720k total, 36898928k used, 34788792k free,    49692k buffers
Swap: 880737784k total,        0k used, 880737784k free,  1586524k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 2433 mysql     15   0 23.6g 4.5g 7112 S 564.7  6.6  33607:34 mysqld
24046 apache    16   0  411m  65m  28m S 26.4  0.1   0:09.05 httpd
24360 apache    15   0  410m  60m  25m S 26.4  0.1   0:03.65 httpd
24993 apache    16   0  410m  57m  21m S 26.1  0.1   0:01.41 httpd
24838 apache    16   0  428m  74m  20m S 24.8  0.1   0:02.37 httpd
24359 apache    16   0  411m  62m  26m R 22.3  0.1   0:08.12 httpd
23850 apache    15   0  411m  64m  27m S 16.8  0.1   0:14.54 httpd
25229 apache    16   0  404m  46m  17m R 10.2  0.1   0:00.71 httpd
14594 apache    15   0  404m  63m  34m S  8.4  0.1   1:10.26 httpd
24955 apache    16   0  404m  50m  21m R  8.4  0.1   0:01.66 httpd
24313 apache    16   0  399m  46m  22m R  8.1  0.1   0:02.30 httpd
25119 apache    16   0  411m  59m  23m S  6.8  0.1   0:01.45 httpd

Fragen:

  • Würde es msyqld durch mehr Speicher dabei helfen, Abfragen zwischenzuspeichern und schneller zu reagieren?
  • Wenn das so ist, wie?
  • Gibt es außer der Aufteilung von MySQL und PHP auf separate Server (was wir gerade tun) noch etwas anderes, was wir tun könnten/sollten?

Danke!

AKTUALISIEREN:

Hier ist unsere my.cnf zusammen mit der Ausgabe von mysqltuner. Es sieht nach einem Cache-Problem aus. Nochmals vielen Dank!

# cat /etc/my.cnf
[client]
port            = ****
socket          = /var/lib/mysql/mysql.sock

[mysqld]
datadir=/mnt/persistent/mysql
port=****
socket=/var/lib/mysql/mysql.sock
key_buffer = 512M
max_allowed_packet = 64M
table_cache = 1024
sort_buffer_size = 8M
read_buffer_size = 4M
read_rnd_buffer_size = 2M
myisam_sort_buffer_size = 64M
thread_cache_size = 128M
tmp_table_size = 128M
join_buffer_size = 1M
query_cache_limit = 2M
query_cache_size= 64M
query_cache_type = 1
max_connections = 1000
thread_stack = 128K
thread_concurrency = 48
log-bin=mysql-bin
server-id       = 1
wait_timeout = 300
innodb_data_home_dir = /mnt/persistent/mysql/
innodb_data_file_path = ibdata1:10M:autoextend
innodb_buffer_pool_size = 20G
innodb_additional_mem_pool_size = 20M
innodb_log_file_size = 64M
innodb_log_buffer_size = 8M
innodb_flush_log_at_trx_commit = 1
innodb_lock_wait_timeout = 50
innodb_thread_concurrency = 48
ft_min_word_len=3

[myisamchk]
ft_min_word_len=3
key_buffer = 128M
sort_buffer_size = 128M
read_buffer = 2M
write_buffer = 2M

# ./mysqltuner.pl

 >>  MySQLTuner 1.2.0 - Major Hayden <[email protected]>
 >>  Bug reports, feature requests, and downloads at http://mysqltuner.com/
 >>  Run with '--help' for additional options and output filtering

-------- General Statistics --------------------------------------------------
[--] Skipped version check for MySQLTuner script
[OK] Currently running supported MySQL version 5.1.52-log
[OK] Operating on 64-bit architecture

-------- Storage Engine Statistics -------------------------------------------
[--] Status: +Archive -BDB +Federated +InnoDB -ISAM -NDBCluster 
[--] Data in MyISAM tables: 2G (Tables: 26)
[--] Data in InnoDB tables: 749M (Tables: 250)
[!!] Total fragmented tables: 262

-------- Security Recommendations  -------------------------------------------

-------- Performance Metrics -------------------------------------------------
[--] Up for: 31d 2h 30m 38s (680M q [253.371 qps], 2M conn, TX: 4825B, RX: 236B)
[--] Reads / Writes: 89% / 11%
[--] Total buffers: 20.6G global + 15.1M per thread (1000 max threads)
[OK] Maximum possible memory usage: 35.4G (51% of installed RAM)
[OK] Slow queries: 0% (35K/680M)
[OK] Highest usage of available connections: 53% (537/1000)
[OK] Key buffer size / total MyISAM indexes: 512.0M/457.2M
[OK] Key buffer hit rate: 100.0% (9B cached / 264K reads)
[OK] Query cache efficiency: 42.3% (260M cached / 615M selects)
[!!] Query cache prunes per day: 4384652
[OK] Sorts requiring temporary tables: 0% (1K temp sorts / 38M sorts)
[!!] Joins performed without indexes: 100404
[OK] Temporary tables created on disk: 17% (7M on disk / 45M total)
[OK] Thread cache hit rate: 99% (537 created / 2M connections)
[!!] Table cache hit rate: 0% (1K open / 946K opened)
[OK] Open file limit used: 9% (453/5K)
[OK] Table locks acquired immediately: 99% (758M immediate / 758M locks)
[OK] InnoDB data size / buffer pool: 749.3M/20.0G

-------- Recommendations -----------------------------------------------------
General recommendations:
    Run OPTIMIZE TABLE to defragment tables for better performance
    Enable the slow query log to troubleshoot bad queries
    Adjust your join queries to always utilize indexes
    Increase table_cache gradually to avoid file descriptor limits
Variables to adjust:
    query_cache_size (> 64M)
    join_buffer_size (> 1.0M, or always use indexes with joins)
    table_cache (> 1024)

Antwort1

Would giving msyqld more memory help it cache queries and react faster?

Sie können MySQL mehr Tabellencache geben, was ein wenig helfen würde, aber ich glaube nicht, dass das für Sie ein allzu großes Problem darstellt. Da die CPU-Auslastung für den MySQL-Prozess sehr hoch ist, würde ich glauben, dass es einfach all die Verbindungen sind, die MySQL verlangsamen.

Eine nette Website, die ich gerne zum Optimieren von MySQL verwende, ist dieser MySQL-Speicherrechner: http://www.omh.cc/mycnf/

Ich würde auch empfehlen, sich das folgende Perl-Skript auf GitHub anzusehen, da es Ihre gesamte MySQL-Konfiguration auf Fehler überprüft. http://mysqltuner.com

Und schließlich glaube ich, dass etwas HTTP-Caching in Ihrem Fall hilfreich sein könnte. Wenn Ihre Site sehr dynamisch ist (was bei Ihnen der Fall zu sein scheint, da die CPU-Auslastung und der Speicherbedarf der Datenbank recht hoch sind), wird ein HTTP-Caching MySQL etwas entlasten. Ich persönlich verwende Varnish (da ich derzeit nicht mehr als zwei Hyperlinks posten kann, können Sie es mit einer einfachen Google-Suche finden), aber es gibt auch andere.

Hoffe, das hilft. Ich bin kein Genie wie einige der Benutzer hier, aber hoffentlich helfen diese Tipps.

Antwort2

Sie können Apache mit Nginx vorschalten. Dadurch wird Nginx im Namen des Clients eine Proxy-Anfrage an Apache senden und Sie können die Komprimierung auch an Apache auslagern. Wenn Sie dies tun, versuchen Sie, die Anzahl der Max Apache-Prozesse auf ein Minimum zu reduzieren, das Ihren Server nicht zu sehr verlangsamt.

Sie können Nginx auch so konfigurieren, dass der statische Inhalt anstelle von Apache bereitgestellt wird.

Dieser Link kann Ihnen beim Einstieg helfen.

http://tumblr.intranation.com/post/766288369/using-nginx-reverse-proxy

verwandte Informationen