Saya mengubah homepage saya untuk kinerja, saat ini menangani sekitar 200 permintaan / detik pada 3.14.by yang memakan 6 query SQL, dan 20 req / detik pada 3.14.by/forum yang merupakan forum phpBB.
Anehnya, jumlahnya hampir sama pada beberapa VPS dan dedicated server Atom 330.
Perangkat lunak server adalah sebagai berikut: Apache2 + mod_php prefork 4 childs (mencoba angka berbeda di sini), php5, APC, nginx, memcached untuk penyimpanan sesi PHP.
MySQL dikonfigurasikan untuk memakan sekitar 30% dari RAM yang tersedia (~ 150Mb pada VPS, 700Mb pada server khusus)
Sepertinya ada hambatan di tempat yang tidak memungkinkan saya untuk naik, saran? (Yaitu saya tahu bahwa melakukan kurang dari 6 SQL akan membuatnya lebih cepat, tetapi ini tidak terlihat seperti faktor pembatas, karena sqld makan tidak lebih dari beberapa% di atas karena permintaan cache)
Adakah yang menguji menendang apache2 yang sudah diprogram dan hanya menyisakan nginx + php yang lebih cepat?
Beberapa tolok ukur lagi
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.
Pembaruan: Tampaknya hambatan adalah kinerja MySQL pada data yang di-cache. Halaman dengan SQL tunggal menunjukkan 354req / detik, dengan 6 SQL - 180 req / detik. Menurut Anda, apa yang bisa saya ubah di sini? (Saya dapat membayar 100-200Mb untuk MySQL)
[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/
sumber
Jawaban:
Jelas, ada banyak yang bisa Anda coba. Taruhan terbaik Anda adalah mengejar log Anda untuk kueri yang tidak menggunakan indeks (mengaktifkan log untuk itu) dan kueri yang tidak dioptimalkan lainnya. Saya telah menyusun daftar besar opsi terkait kinerja selama bertahun-tahun, jadi saya telah memasukkan sebagian kecil di sini untuk informasi Anda - semoga membantu. Berikut adalah beberapa catatan umum untuk hal-hal yang dapat Anda coba (jika belum):
MySQL
Apache
PHP
OS Tweaks
sumber
Jika hambatannya bukan CPU, maka IO - baik jaringan atau disk. Jadi .. Anda perlu melihat berapa banyak IO yang terjadi. Saya tidak akan mengira itu adalah jaringannya (kecuali Anda berada pada tautan setengah dupleks 10mbps, tetapi ada baiknya memeriksa sakelar kalau-kalau deteksi otomatis tidak melakukan tugasnya dengan benar).
Itu meninggalkan disk IO, yang bisa menjadi faktor besar terutama pada VPS. Gunakan sar atau iostat untuk melihat cakram, kemudian google cara menemukan detail lebih lanjut jika cakram Anda banyak digunakan.
sumber
Saya akan mencari caching dengan Nginx ( memcached ) atau Varnish .
Paling tidak Anda harus server file statis dengan Nginx seperti kata SaveTheRbtz.
sumber
Karena server sepertinya tidak menjadi masalah, mungkin generator bebannya. Cobalah untuk menjalankannya di beberapa mesin.
sumber
Kedengarannya bagi saya seperti Anda mungkin memukul jumlah maksimum koneksi yang diizinkan oleh Apache. Lihatlah konfigurasi Apache Anda. Meningkatkan batas server dan klien maks akan membantu jika Anda belum terikat oleh batas lain seperti I / O atau memori. Lihatlah nilai yang ada untuk mpm_prefork_module atau mpm_worker_module dan sesuaikan sesuai dengan kebutuhan Anda.
sumber
Apakah beban ini dihasilkan oleh alat atau beban dunia nyata?
Anda mungkin ingin memeriksa memcached. Saya telah melihat masalah pada tingkat koneksi yang tinggi yang menyebabkan latensi dalam aplikasi.
Jika menggunakan generator beban, apa yang Anda dapatkan ketika menekan halaman statis kecil?
Selama pemuatan, Anda mungkin ingin memeriksa tumpukan jaringan untuk kondisi TIME_WAIT. Mungkin Anda sedang mengisi antrian koneksi Anda.
Ada sekitar 100 alasan dan item yang dapat Anda lihat tetapi tanpa informasi lebih lanjut, saya hanya membuang tebakan pada saat ini.
sumber
99% persen dari masalah waktu seperti ini akan ditelusuri kembali ke database. Pastikan indeks memukul Anda terlebih dahulu. Jika itu tidak berhasil, mulai caching semua yang Anda bisa.
sumber
Saya sarankan Anda untuk menggunakan (jika mungkin) pooler koneksi untuk menjaga database terhubung ke aplikasi web Anda (tidak perlu menyambung kembali pada setiap permintaan). Itu bisa membuat perbedaan kecepatan yang sangat besar.
Juga, cobalah menganalisis semua pertanyaan Anda dengan EXPLAIN (dan mengapa tidak membuat profil pertanyaan Anda dengan SHOW PROFILE?).
sumber