Optimalkan apache / php / mysql berjalan pada VPS untuk beban berat

17

Pertanyaan tentang cara mengoptimalkan server apache / mysql pada VPS dengan RAM 512m. Di bawah beban normal, semuanya berjalan cepat, tidak ada koneksi tertinggal. Namun ketika kami mendapatkan hari-hari lalu lintas yang padat (50k + kunjungan) situs merangkak dan butuh 30 detik + untuk mendapatkan konten kembali dari apache.

Situs ini berjalan pada Expression Engine (CMS) (dalam PHP) dan saya telah mengikuti panduan pengoptimalan yang berat. Saya sudah googled dan mengikuti beberapa di luar sana untuk apache dengan sedikit keberuntungan, membawanya ke tempat sekarang, tetapi saya perlu mendapatkan waktu respon yang konstan.

Saya berasumsi ini berbeda dari pertanyaan 'optimalkan memori rendah' ​​di sini karena saya memiliki cukup RAM (untuk apa yang saya coba lakukan), saya hanya perlu membuat server tidak tersedak di bawah beban berat.

Adakah rekomendasi ulang?

Bayan
sumber
1
Hanya tindak lanjut - beralih ke Lighttpd dan sudah perbedaannya luar biasa, menangani beban jauh lebih baik. Lebih banyak optimisasi yang akan datang saya yakin, tetapi itu banyak membantu. Dan, saya menggunakan eaccelerator, yang saya pilih dari APC, karena diminta.
Burung beo

Jawaban:

18

Untuk PHP ada 2 hal penting yang akan meningkatkan kapasitas:

  1. Caching PHP Tingkat Lanjut (APC) sebagaimana disebutkan. Inilah yang kami gunakan di Yahoo !. Ada proyek serupa lainnya, tetapi yang ini adalah bayi Rasmus.
  2. FastCGI bukan mod_php. Ada perdebatan tentang masalah ini karena mod_php biasanya yang tercepat. Namun, saya berasumsi bahwa Anda memiliki satu server Apache yang memberikan konten PHP dinamis dan aset statis (JS, CSS, flash, gambar, PDF, dll.). Permintaan untuk aset-aset statis itu tidak perlu menghabiskan banyak memori, tetapi karena PHP adalah modul, ia ada di setiap utas Apache.

Untuk Apache:

  1. Gunakan MPM pekerja
  2. Aktifkan KeepAlive

Anda juga dapat mempertimbangkan beralih dari Apache ke Lighttpd , atau Nginx . Saya suka Apache. Saya menggunakan kebodohan dari banyak fitur canggihnya. Saya menerima overhead-nya karena saya butuh apa yang ditawarkannya. Untuk tumpukan LAMP umum, itu lebih dari yang diperlukan dan pemborosan sumber daya.

Untuk MySQL:

  1. Upaya pengoptimalan Anda akan menghasilkan 10 kali lipat ketika dihabiskan untuk menganalisis dan memperbaiki kueri, alih-alih mengubah nilai my.cnf Anda. Saya tidak mengatakan bahwa tidak penting untuk mendapatkan cache, koneksi, dll. Yang benar ... tetapi bagi kebanyakan orang itu hanya 9% dari masalahnya.
  2. Selama QA Anda, nyalakan log kueri umum pada staging / dev mysqld Anda untuk menangkap semua pertanyaan yang dikirim. (JANGAN lakukan itu di server mysql produksi Anda!)
  3. Gunakan EXPLAIN untuk menganalisis kueri. Terutama jika Anda menggunakan kerangka kerja dengan ORM (abstrak DB dan membuat Anda tidak menulis SQL Anda sendiri), Anda perlu membersihkan GABUNGAN asing, PILIH tanpa klausa WHERE, ORDER BYs yang menyebabkan 'menggunakan filesort', dan pertanyaan yang tidak menggunakan indeks.
  4. Jika Anda menggunakan MySQL 5.1, manfaatkan profiler kueri .

Alat lain yang layak dipertimbangkan adalah mk-visual-menjelaskan

Saya telah mengutip 10 referensi bagus. Hal-hal ini seharusnya membuat Anda bersenandung. Harap beri tahu kami bagaimana hasilnya.

Bruno Bronosky
sumber
6

Pindahkan file sesi PHP Anda ke tmpfs , gunakan APC (atau lainnya) dan hapus semua modul PHP yang tidak Anda butuhkan. Hapus semua modul Apache yang tidak Anda butuhkan / gunakan.

Untuk membuat tmpfs (direktori dalam RAM!)

mkdir /tmpfs; chmod 777 /tmpfs
mount -t tmpfs -o size=256M tmpfs /tmpfs

Di / etc / fstab tambahkan baris di bawah ini untuk membuatnya di reboot!

tmpfs     /tmpfs    tmpfs   size=256m,mode=0777    0       0

Di /etc/apache2/php.ini sesuaikan untuk menyimpan sesi Anda dalam RAM (tmpfs)!

session.save_handler = files
session.save_path = "/tmpfs"

Catatan: Dengan file PHP DAN file sesi dalam RAM, Anda hampir tidak menyentuh disk!

Gunakan expires_module di apache sehingga browser akan melakukan cache sebagian besar hal.

ExpiresActive On
ExpiresDefault "access plus 90 days"
ExpiresByType image/gif "access plus 90 days"
ExpiresByType image/ico "access plus 90 days"
ExpiresByType image/png "access plus 90 days"
ExpiresByType image/jpeg "access plus 90 days"
ExpiresByType image/x-icon "access plus 90 days"
ExpiresByType text/css "Access plus 90 days"
ExpiresByType text/html "Access plus 90 days"
ExpiresByType application/x-shockwave-flash "Access plus 90 days"
ExpiresByType application/x-javascript "Access plus 90 days"

Jangan gunakan file .htaccess ! Sebaliknya, kode keras mereka dalam file konfigurasi vhost! Secara drastis akan menghilangkan / mengurangi pemeriksaan diska per semua permintaan http ... benar-benar bertambah.

Options FollowSymLinks 
AllowOverride None

Contoh .htaccess yang digunakan dalam file vhost.conf Anda ...

<Directory /home/user/www/site.com/secure>
    Order Allow,Deny
    Deny from All
</Directory>
Nulled
sumber
5

Beberapa hal muncul dalam pikiran.

Tembolok opcode selalu merupakan ide yang bagus. Saya lebih suka http://eaccelerator.net/ daripada APC. Jika Anda belum mengembangkan dengan APC di sepanjang jalan mencoba menambahkannya hampir selalu menyakitkan. Eaccelerator sementara tidak semewah sepertinya berfungsi.

Proxy terbalik juga merupakan ide yang bagus, tetapi Anda harus memperhatikan penggunaan RAM. Saya menemukan Apache 2.2 dengan mpm-pekerja untuk mengambil cukup banyak RAM pada itu sendiri. Dalam kasus Anda, saya akan merekomendasikan sesuatu yang lebih ringan seperti Nginx dan menjalankan Apache dengan PHP sebagai FASTCGI atau biarkan sesuai proses. Gagasan dengan menggunakan Varnish, Squid, Nginx, dll adalah membuat mereka menyajikan konten statis, menangani koneksi pengguna, dan hanya mengirimkan permintaan PHP ke Apache yang Anda anggap sebagai server aplikasi.

Jika Anda menjalankan versi Mysql 5.1 yang cukup baru, seperti setidaknya 5.1.24 Anda sekarang memiliki akses ke log lambat sub detik. Saya akan memulai long_query_time pada 1 atau 2 dan kemudian menurunkannya menjadi 0,5 saat Anda mendapatkan yang lama. Ada juga banyak informasi penyetelan umum di internet untuk Mysql, tetapi Anda tidak memiliki RAM untuk melakukan banyak hal. Sudahkah Anda meningkatkan pengaturan dari default? Sebagian besar file my.cnf default dikonfigurasi untuk menggunakan sekitar 64MB RAM. Paling tidak saya akan meningkatkan key_buffer dari 16MB ke 64MB.

Selain itu, apakah Anda menggunakan tabel Myisam atau Innodb? Jika Anda menyimpan sesi di DB, Anda ingin mengubah tabel sesi menjadi Innodb (atau menjadikannya cookie) daripada membiarkannya sebagai tabel Mysiam yang melakukan penguncian level tabel daripada penguncian level baris. Pada dasarnya setiap tabel yang lebih dari 20% menulis hingga 80% dibaca adalah kandidat untuk pindah ke Innodb. Ingat Anda harus menyeimbangkan jumlah RAM antara tabel Myisam dan tabel Innodb karena buffer untuk masing-masing dikonfigurasi secara terpisah.

Dan terakhir, 512MB RAM lain akan berjalan jauh dalam pengaturan Anda atau bahkan 512PS VPS lain untuk menjalankan Mysql jika itu lebih murah atau kira-kira harganya sama. Saya benar-benar akan condong ke instance kedua karena itu akan menggandakan IO disk yang tersedia. Salah satu masalah dengan server VPS adalah IO Anda tidak terlindungi dari orang lain di server fisik yang sama.

Hmmm posting saya semua agak tersebar, tetapi memberi Anda banyak tempat untuk melihat. Semoga berhasil.

Kashani
sumber
2
  • Gunakan cache opcode untuk php seperti apc.
  • Gunakan akselerator http seperti squid atau pernis.
wittwerch
sumber
1

Dalam situasi memori rendah (512Mb rendah, untuk server dengan lalu lintas tinggi) ada baiknya mempertimbangkan server web dan mesin DB pilihan Anda.

Lighttp lebih ringan di luar kotak daripada biasanya Apache dapat dibuat setelah banyak tweaking, dan ada opsi lebih ringan dari itu bahkan. Ini tentu saja tidak mungkin jika ada fitur Apache yang Anda andalkan yang tidak mendukung server lain.

sqlite jauh lebih ketat daripada mySQL, dan lebih cepat dalam banyak kondisi juga. Periksa apakah mesin yang Anda gunakan mendukung ini juga dan apakah itu mencobanya.

Opsi lainnya, opsi mudah, adalah mendapatkan lebih banyak RAM di VM jika Anda mampu membelinya.

David Spillett
sumber
1

Di luar saran-saran hebat di sini, perlu dicatat bahwa semua VPS tidak dibuat sama. Dalam pengalaman saya, PHP ternyata CPU yang berat.

Tolok Ukur AB Wordpress (ab -n 500 -c 25 http://domain.com/index.php ) dari nginx / apc / phpfpm / mysql (lokal) pada EC2 menghasilkan ~ 2 permintaan / detik pada level entri "2GB RAM / 1 Hitung Unit Server ".

Benchmark yang sama berjalan melawan stack yang sama persis (digunakan oleh skrip ke OS identik) pada Rackspace Cloudserver 512MB mengembalikan ~ 80 req / detik. Jadi 4x Kurang ram, kinerja 40x dalam percobaan yang belum sempurna ini.

Melihat bagian atas selama AB Anda melihat bahwa EC2 tidak bisa menangani konkurensi, dan akan langsung menekan 100% CPU Load dan mengunci. Melihat puncak pada Server 512MB (virtualisasi quad core CPU) selama benchmark yang sama, Core akan mencapai ~ 60% Load dan menangani benchmark dengan lancar.

VPS sangat mudah diputar dan dimatikan tanpa komitmen, tidak ada salahnya untuk menempatkan infrastruktur tempat VM / VPS Anda berada dalam pengujian!

EDIT 1: Juga, Mesin Virtual "CPU Tinggi" EC2 hanya mampu menghasilkan ~ 10 / req detik, dengan CPU masih menjadi hambatan. Kesimpulan saya adalah bahwa Anda mengorbankan kinerja untuk stabilitas / ketahanan dengan EC2, dan tentu saja ada banyak kasus yang memerlukan lingkungan seperti itu.

iainlbc
sumber
juga, pertimbangkan nginx (v.1 dirilis hari ini). wordpress.com mengganti konfigurasi litespeed dengan nginx sehingga jelas merupakan server web yang mampu.
iainlbc
Nginx memang mengesankan. Saya hanya berharap ini bisa membaca aturan mod_rewrite dari file .htaccess.
Martijn Heemels