Anda memasuki dunia optimasi yang luas dan luas di sana-sini tentu saja tidak ada satu pendekatan yang cocok untuk semua.
Tentukan kinerja
Apakah maksud Anda waktu pemuatan halaman untuk satu pengguna, atau kapasitas total / total konkurensi? Keduanya sangat berbeda - dan tidak terkait erat. Sangat mungkin untuk memiliki toko cepat dengan kapasitas terbatas; atau toko yang lambat dengan banyak kapasitas.
Jadi saat menyikapi salah satu jenis kinerja:
- Waktu buka halaman yang dirasakan pengguna tunggal
- Total kapasitas / konkurensi
Anda harus mengatasi masing-masing secara independen dengan solusi mereka sendiri - terutama karena masing-masing memiliki hambatan sendiri.
Mari kita membuat asumsi Anda dengan host yang kompeten yang telah mengkonfigurasi aspek-aspek lain dari server Anda secara optimal untuk toko Anda.
Waktu buka halaman yang dirasakan pengguna tunggal
Apakah MySQL yang menjadi hambatan
. Tidak secara langsung. Ini semua tentang latensi, dalam sebagian besar kasus ketika menguji waktu buka halaman - hanya cache yang akan dipukul. Jadi kuncinya di sini adalah untuk meminimalkan latensi.
- Tune ukuran cache MySQL dengan tepat (tidak ada jawaban yang tepat, kami menyetel pengaturan yang sama sekali berbeda, bulanan, per toko)
- Kurangi latensi jaringan. Untuk frame 64 byte; 51.2μs untuk 10Mbps, 5.12μs untuk 100Mbps dan 4.096μs untuk 1Gbps. Ini memberikan peningkatan 20% hanya dengan transisi dari 100Mbps ke 1Gbps. s1
- Meningkatkan kapasitas jaringan. Anda akan terkejut dengan banyaknya megabita per detik yang dipertukarkan antara Web dan server DB, biasanya lebih dari 10MB / s - sehingga minimum 100Mb / s diperlukan s1 . Atau, cukup pindahkan server DB secara lokal.
- Menggunakan SOLR. Mesin eksternal kadang-kadang lebih cocok, SOLR tentu lebih cepat untuk katalog BESAR (dan saya akan menekankan, katalog lebih besar ). Bahkan SOLR yang tidak disetel akan menghasilkan navigasi berlapis dan hasil pencarian lebih cepat daripada yang bisa dilakukan MySQL.
Tetapi perubahan ini akan memiliki dampak fraksional pada waktu buka halaman - di mana hambatannya benar-benar di tempat lain.
- Tune aplikasi. Magento memiliki beberapa bug yang cukup besar dengan cara membangun koleksi dan menyimpannya; kami telah menemukan sejumlah masalah kode inti besar yang dapat melumpuhkan kinerja. Dalam beberapa kasus, cukup lepaskan tampilan jumlah produk pada hasil navigasi berlapis yang dicukur 2 detik dari pemuatan koleksi besar.
- Tinjau log lambat MySQL. Periksa kueri lambat dan tambahkan indeks seperlunya. Perbedaan antara menjalankan kueri yang kompleks dengan beberapa gabungan dengan dan tanpa indeks yang sesuai dapat menjadi puluhan detik .
Aplikasi adalah hambatannya. Bukan perangkat lunak. Jadi hanya meningkatkan core-code atau membuat template Anda lebih ringan akan memiliki efek yang jauh lebih dramatis pada kinerja daripada perubahan konfigurasi MySQL APA PUN .
Apa yang tidak akan kita pedulikan
- Mengubah mesin penyimpanan. MariaDB dan Percona berbagi mesin InnoDB yang sama - Percona XtraDB. Mereka dapat diperlakukan sebagai satu dan sama. Dalam hal waktu eksekusi permintaan tunggal - kinerja akan persis mencerminkan pembuatan MySQL vanilla. Ini ikut bermain di bawah beban / konkurensi.
- Menjalankan budak MySQL. Ini tidak akan meningkatkan kinerja kecuali jika budak secara fisik lebih dekat (dari perspektif jaringan), atau bahwa budak memiliki perangkat keras yang lebih baik daripada master. Ini ikut bermain di bawah beban / konkurensi.
- Menjalankan server DB eksternal. Sejauh ini, ini adalah saran terburuk yang kami lihat berulang kali diberikan oleh banyak tuan rumah / agensi. Sampai Anda mencapai puncak pada perangkat keras / sumber daya atau Anda memiliki beberapa server web (baca: ketersediaan tinggi), MySQL di mesin lokal untuk toko Magento adalah A Good Idea. Ini memotong semua overhead jaringan dan latensi. Bahkan jaringan 100 Gb / s (ya, seratus gigabit per detik) tidak akan dibandingkan dengan soket unix lokal untuk volume, throughput, dan latensi mentah.
s1 Untuk server database terpisah saja. Tidak berlaku untuk server DB lokal.
Total kapasitas / konkurensi
Apakah MySQL yang menjadi hambatan
Mungkin. Tetapi hanya sekali Anda telah memakukan kinerja dan kapasitas PHP Anda ke titik di mana MySQL memperlambat segalanya. Jika Varnish dan FPC Anda telah terkonfigurasi dengan benar (jangan mulaii kami tentang berapa banyak upaya gagal yang telah kita lihat) - maka MySQL menjadi hambatan.
Jadi selain modifikasi di atas.
- Ubah mesin MySQL. XtraDB dapat unggul di bawah beban dan memang menunjukkan manfaat asli dibandingkan distribusi MySQL stok.
- Tetap terbarui dengan MySQL. 5.5 berkinerja lebih baik dari 5.0 di bawah beban.
- Ubah driver PHP PHP. PHP 5.3 dan yang lebih baru memiliki driver MySQL asli, tetapi dalam beberapa keadaan, kami telah menemukan PHP 5.2 dengan driver terpisah untuk mengungguli MySQLND untuk Magento. Uji sendiri
- Ubah mesin pencari. Memindahkan pencarian ke SOLR / Sphinx (atau bahkan beberapa layanan eksternal pihak ketiga) dapat benar-benar mengurangi beban beban non-transaksional (mis. Orang tidak melakukan pemesanan)
- Ubah mesin navigasi berlapis. Sekali lagi, SOLR adalah mesin yang brilian untuk navigasi berlapis dan karena sifatnya yang tidak terkunci jauh lebih cepat daripada MySQL.
- Tambahkan budak MySQL. Ini tidak membantu penjelajahan (non-transaksional) beban, tetapi tidak akan membantu Anda memproses lebih banyak pesanan per jam - karena bergantung pada Guru untuk proses dan mereplikasi data ini
Apa yang tidak akan kita pedulikan
- Master / Master. Karena titik jenuh yang cukup tinggi dari kejenuhan perangkat keras dari pengaturan Master / Slave (lebih dari 1000 pesanan per jam) - kami tidak pernah menemukan persyaratan untuk menggunakan Master / Master dalam produksi. Kami telah melakukan pengujian ekstensif, tetapi tidak pernah menemukan itu menguntungkan dari perspektif kinerja dan dengan risiko yang melekat dan masalah Master / Master, itu tidak layak.
Baca vs Skalabilitas Tulis
Paragraf terakhir benar-benar mengarah pada bidang utama skalabilitas baca dan tulis. Pembacaan skala dapat dilakukan tanpa batas tanpa terlalu banyak komplikasi dengan penambahan lebih banyak budak.
Mengingat rasio Magento tentang Baca untuk Menulis adalah sekitar 0,1% - mengingat menulis seharusnya tidak terlalu menjadi perhatian. Itu sebabnya saya tidak repot menyebutkan MySQL Cluster dan fitur-fiturnya pintar seperti auto-sharding (memisahkan tabel ke mesin yang terpisah).
Perangkat keras, perangkat keras, perangkat keras
Perangkat keras adalah jawaban tercepat untuk perbaikan, jadi saya sengaja tidak menyebutkannya di atas dalam kedua skenario.
Tetapi semua perubahan perangkat lunak di dunia tidak akan membuat perbedaan jika perangkat keras Anda tidak memadai. Itu bisa berarti ...
- Switch berkualitas rendah dengan buffer terbatas
- Tautan jaringan yang terlalu jenuh
- Server yang jauh secara geografis
- QoS / CoS jaringan buruk
- Jumlah total RAM yang terbatas
- RAM bandwidth memori rendah
- Subsistem IOP HDD rendah
- Pengontrol RAID perangkat lunak
- CPU kecepatan clock rendah
- Chipset bandwidth rendah
- Virtualisasi perangkat keras (hampir semua jenis selain Virtualisasi Tingkat Kernel)
Saat ini, ada langit-langit sangat tinggi pada seberapa tinggi Anda dapat benar-benar skala pada perangkat keras. Mari kita mengabaikan mitos penskalaan tak terbatas "di awan" karena perangkat keras cloud cenderung cukup biasa-biasa saja. Contohnya model andalan Amazon hanya 12 Cores @ 3.3GHz. Tetapi di luar ini, ada beberapa server yang sangat kuat yang tersedia - server teratas kami memiliki 160 core dan 2TB (ya, Terabytes) RAM. Kami belum melihat ada yang melampaui kemampuan itu.
Jadi Anda memiliki ruang lingkup besar untuk penskalaan vertikal, bahkan sebelum Anda perlu mempertimbangkan penskalaan horizontal.
Target yang selalu bergerak
Layak disebutkan bahwa dalam mengejar kinerja, bottleneck akan selalu bergerak.
Untuk toko Magento stok.
Nyalakan cache. PHP adalah penghambatnya.
Tambahkan cache backend. PHP adalah hambatannya.
Tambahkan cache halaman penuh level aplikasi. PHP adalah penghambatnya.
Tambahkan cache front-end tingkat server (mis. Varnish). MySQL adalah penghambatnya.
Tambahkan mesin pencari alternatif / navigasi berlapis (mis. SOLR / Sphinx). PHP adalah hambatan
Tambah server aplikasi lebih banyak. MySQL adalah hambatannya
Tambah budak MySQL. Cache front-end adalah hambatan
Tambah lebih banyak server cache front-end. PHP adalah hambatan
Tambah server aplikasi lebih banyak. SOLR / Sphinx adalah hambatannya
Dan sebagainya.
Ini cukup banyak menjadi kasus pengulangan bilas. Tetapi yang jelas untuk dipahami adalah bahwa MySQL tentu saja bukan pelabuhan panggilan pertama untuk optimasi - dan benar-benar hanya berperan ketika MySQL mengkonsumsi lebih banyak CPU secara proporsional ke PHP - dan ini HANYA terjadi ketika FPC dan Varnish digunakan dan server hanya memproses pesanan dan tidak banyak yang lain (karena semuanya ada dalam cache).
Jangan membuat perubahan secara membabi buta
Cukup menambahkan budak MySQL karena Anda membaca kami katakan di atas bahwa itu akan membantu, dapat biaya kinerja dan keandalan Anda pada tingkat yang sangat besar. Jaringan yang macet, server slave dengan spesifikasi rendah atau bahkan pengaturan yang tidak tepat dapat menyebabkan masalah replikasi yang dapat membuat toko Anda lebih lambat dari awalnya - atau menyebabkan masalah sinkronisasi antara Master dan Slave.
Untuk meletakkan segala sesuatu dalam perspektif - beberapa contoh dunia nyata.
Contoh 1 - 300 pesanan per jam
Kami telah menggunakan perangkat keras berikut untuk melayani 300 pesanan per jam ; dan hanya pada titik kritis - kami kemudian merasa perlu menambahkan server MySQL khusus dan budak MySQL lokal.
1 Server
CPU: 2x Intel E5-4620
RAM: 64GB HDD: 4x 80k IOP / s SSD
RAID: Perangkat Keras RAID 10
Versi Magento: Magento EE
OS: MageStack
Selama seluruh waktu, rata-rata beban tetap di bawah 3,00.
Contoh 2 - 180 pesanan per jam
Hanya dua hari yang lalu, klien baru kami dengan mudah menyerap lonjakan lalu lintas yang besar. Memproses 180 pesanan per jam dengan server tunggal dan Edisi Komunitas Magento .
1 Server
CPU: 2x Intel E5-4620
RAM: 64GB HDD: 4x 80k IOP / s SSD
RAID: Perangkat Keras RAID 10
Versi Magento: Magento CE
OS: MageStack
Situs web: Wellgosh.com
Selama keseluruhan, rata-rata memuat tetap di bawah 6,00. Beban lebih tinggi dalam skenario ini dan itu turun ke beberapa faktor.
- Tidak ada penyetelan sisi-toko yang dilakukan seperti pada Contoh 1
- Kurangnya FPC tingkat aplikasi
Dan mengingat hal ini, kami masih punya statistik terperinci untuk memberikan umpan balik melalui grafik. Ini menceritakan kisah luar biasa tentang bagaimana beban didistribusikan di antara komponen-komponen utama dari arsitektur Magento yang terpisah (penyeimbang beban, server web, server db dll. - menggunakan MageStack ).
Jadi dari depan ke belakang ... tanggal yang ingin Anda lihat adalah pukul 12:00 pagi pada 22 Februari.
Paket Firewall
Pernis Lalu Lintas
Lalu Lintas Nginx
Beban MySQL
Beban CPU
Dan yang terpenting, distribusi beban
Gambar ini benar-benar menceritakan semuanya. Dan itu adalah MySQL tentu bukan beban - setidaknya belum. Jadi saran kami, fokuskan kekhawatiran kinerja Anda di tempat lain, kecuali jika Anda memproses lebih dari beberapa ribu pesanan per jam.
Dan dalam ringkasan
Membuat perubahan kinerja bukan "satu ukuran cocok untuk semua". Ini adalah kasus menganalisis kemacetan Anda saat ini dan membuat perubahan / penyesuaian halus agar sesuai dengan toko dan infrastruktur Anda.
Namun selain kinerja, ada manfaat lain menggunakan Percona
Kami menggunakan Percona XtraDB, hampir secara eksklusif. Kami menjalankan build yang dikompilasi khusus dari MySQL yang kami kembangkan secara khusus untuk Magento dan telah berkonsultasi dengan Percona selama proses tersebut. Tapi bukan hanya kinerja yang memengaruhi pilihan ini.
- The Percona Toolkit
- pt-query-digest
- xtrabackup
- dll.
- Frekuensi rilis percona
- Dukungan konsultasi percona
- Cache hangat dimulai kembali dengan pelestarian pool InnoDB
Dan banyak lagi. Jadi menggunakannya melalui MySQL memiliki kelebihan lain selain kinerja. Bahkan - MySQL adalah dan selalu menjadi yang paling sedikit dari perhatian kami dalam mengejar kinerja dan stabilitas.
Atribusi: wellgosh.com , sonassi.com , iebmedia.com .