Ich optimiere meine Homepage, um die Leistung zu verbessern. Derzeit werden ungefähr 200 Anfragen / Sekunde auf 3.14.by verarbeitet, bei denen 6 SQL-Abfragen verarbeitet werden, und 20 Anfragen / Sekunde auf 3.14.by/forum, bei dem es sich um das phpBB-Forum handelt.
Seltsamerweise sind die Zahlen auf einigen VPS- und dedizierten Atom 330-Servern ungefähr gleich.
Server-Software ist die folgende: Apache2 + mod_php prefork 4 Kinder (versuchte verschiedene Zahlen hier), PHP5, APC, Nginx, für PHP-Sitzungen Speicherung zwischengespeichert.
MySQL ist so konfiguriert, dass es etwa 30% des verfügbaren Arbeitsspeichers aufnimmt (~ 150 MB bei VPS, 700 MB bei dedizierten Servern).
Das sieht so aus, als ob es irgendwo einen Engpass gibt, der es mir nicht erlaubt, höher zu gehen. Irgendwelche Vorschläge? (dh ich weiß, dass weniger als 6 SQL-Anweisungen schneller sind, aber dies scheint kein einschränkender Faktor zu sein, da sqld aufgrund von zwischengespeicherten Abfragen nicht mehr als ein paar Prozent oben isst.)
Hat jemand getestet, dass es viel schneller ist, vorgegabelten Apache2 zu treten und nur Nginx + PHP zu lassen?
Noch ein paar Benchmarks
Small 40-byte static file: 1484 r/s via nginx+apache2, 2452 if we talk to apache2 directly.
Small "Hello world" php script: 458 r/s via ngin+apache2.
Update: Es scheint, dass der Engpass die MySQL-Leistung bei zwischengespeicherten Daten ist. Seite mit einzelnem SQL zeigt 354 Req / Sek., Mit 6 SQL - 180 Req / Sek. Was denkst du, kann ich hier optimieren? (Ich kann 100-200Mb für MySQL herausfiltern)
[client]
port = 3306
socket = /var/run/mysqld/mysqld.sock
[mysqld_safe]
socket = /var/run/mysqld/mysqld.sock
nice = 0
[mysqld]
default-character-set=cp1251
collation-server=cp1251_general_cs
skip-character-set-client-handshake
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
skip-external-locking
bind-address = 127.0.0.1
key_buffer = 16M
max_allowed_packet = 8M
thread_stack = 64K
thread_cache_size = 16
sort_buffer_size = 8M
read_buffer_size = 1M
myisam-recover = BACKUP
max_connections = 650
table_cache = 256
thread_concurrency = 10
query_cache_limit = 1M
query_cache_size = 16M
expire_logs_days = 10
max_binlog_size = 100M
[mysqldump]
quick
quote-names
max_allowed_packet = 8M
[mysql]
[isamchk]
key_buffer = 8M
!includedir /etc/mysql/conf.d/
quelle
Antworten:
Natürlich gibt es eine Menge, die Sie ausprobieren können. Am besten jagen Sie Ihre Protokolle nach Abfragen, die keine Indizes verwenden (aktivieren Sie Protokolle für diese), und nach anderen nicht optimierten Abfragen. Ich habe im Laufe der Jahre eine große Liste von leistungsbezogenen Optionen zusammengestellt, daher habe ich hier eine kleine Teilmenge zu Ihrer Information aufgenommen - hoffentlich hilft es. Hier sind einige allgemeine Hinweise für Dinge, die Sie ausprobieren können (falls Sie dies noch nicht getan haben):
MySQL
Apache
PHP
OS Tweaks
quelle
Wenn der Engpass nicht die CPU ist, dann sein IO - entweder Netzwerk oder Datenträger. Also .. Sie müssen sehen, wie viel IO los ist. Ich hätte nicht gedacht, dass es das Netzwerk ist (es sei denn, Sie haben eine 10-Mbit / s-Halbduplexverbindung, aber es lohnt sich, den Switch zu überprüfen, falls die automatische Erkennung nicht richtig funktioniert).
Dadurch bleibt Festplatten-E / A übrig, was insbesondere bei VPS ein wichtiger Faktor sein kann. Verwenden Sie sar oder iostat, um einen Blick auf die Festplatten zu werfen, und googeln Sie dann, um weitere Details zu finden, wenn Ihre Festplatte stark ausgelastet ist.
quelle
Ich würde das Cachen entweder mit Nginx ( memcached ) oder Varnish untersuchen .
Zumindest sollten Sie statische Dateien mit Nginx wie SaveTheRbtz servern.
quelle
Da der Server kein Problem zu sein scheint, ist es vielleicht der Lastgenerator. Versuchen Sie, es auf mehreren Computern auszuführen.
quelle
Es hört sich für mich so an, als ob Sie die maximale Anzahl an Verbindungen erreichen, die Apache zulässt. Sehen Sie sich Ihre Apache-Konfiguration an. Das Erhöhen des Serverlimits und der maximalen Anzahl von Clients sollte hilfreich sein, wenn Sie nicht bereits an ein anderes Limit wie E / A oder Speicher gebunden sind. Sehen Sie sich die Werte für mpm_prefork_module oder mpm_worker_module an und passen Sie sie entsprechend Ihren Anforderungen an.
quelle
Wird diese Last von einem Werkzeug oder von realen Lasten erzeugt?
Möglicherweise möchten Sie memcached überprüfen. Ich habe Probleme mit hohen Verbindungsraten gesehen, die eine Latenz in der Anwendung verursachen.
Was erhalten Sie, wenn Sie einen Lastgenerator verwenden, wenn Sie eine kleine statische Seite aufrufen?
Während des Ladens möchten Sie möglicherweise den Netzwerkstapel auf TIME_WAIT-Bedingungen überprüfen. Möglicherweise füllen Sie Ihre Verbindungswarteschlange.
Es gibt ungefähr 100 weitere Gründe und Gegenstände, die Sie sich ansehen können, aber ohne weitere Informationen werde ich an dieser Stelle nur Vermutungen anstellen.
quelle
In 99% der Fälle werden solche Probleme auf die Datenbank zurückgeführt. Stellen Sie sicher, dass Ihre Trefferindizes zuallererst. Wenn das nicht funktioniert, fangen Sie an, alles, was Sie können, zwischenzuspeichern.
quelle
Ich empfehle Ihnen, (wenn möglich) einen Verbindungspooler zu verwenden, um die Datenbank mit Ihren Webanwendungen verbunden zu halten (es ist nicht erforderlich, bei jeder Anforderung eine erneute Verbindung herzustellen). Das kann einen großen Unterschied in der Geschwindigkeit machen.
Versuchen Sie auch, alle Ihre Abfragen mit EXPLAIN zu analysieren (und warum nicht mit SHOW PROFILE ein Profil für Ihre Abfragen erstellen?).
quelle