pengembangan-web-mp.com

Cara mengurangi penggunaan memori pada server web Unix

Saat ini saya menggunakan Joyent Accelerator untuk Host aplikasi web saya, dan itu berfungsi dengan baik, namun saya perlu mengurangi biaya jadi saya menurunkan peringkat rencana saya saat ini dan yang memaksakan beberapa batas memori baru (256M rss, 512M swap). Saya tidak terlalu jauh dari mereka kemarin, tetapi setelah me-restart Apache beberapa kali hari ini, saya sekarang 411M rss, 721M swap (prstat -Z -s cpu).

Pencarian di Server Fault hanya memberi saya banyak cara dan alat khusus untuk memantau server, tetapi tidak ada saran tentang cara mengurangi/mengoptimalkan penggunaan memori itu. Saya juga telah melihat pertanyaan ini , tapi saya pikir itu tidak baik untuk situasi khusus ini (atau bolehkah saya katakan generik?).

Server menjalankan Solaris pada CPU bersama, dan saya menggunakan Apache + MySQL + PHP stack.

Saya tertarik mengetahui langkah-langkah yang dapat dilakukan untuk memecahkan masalah ini dan menyelesaikan masalah. Namun, saya juga kehabisan waktu untuk menurunkan memori kaki saya mencetak dan menurunkan versi rencana sebelum saat ini berakhir, jadi segala sesuatu yang dapat membuat keajaiban dan menyelamatkan hari juga diterima :)

36
lima

Terima kasih semuanya atas jawaban Anda ! Mengikuti saran Anda, saya dapat mengurangi penggunaan memori saya menjadi 195M SWAP dan 108M RSS, tanpa menyentuh kode saya (saya pasti akan segera mengoptimalkannya, tapi ini seharusnya menjadi solusi untuk mengeluarkan saya dari masalah dengan cepat).

Berikut daftar hal yang saya lakukan:

Singkirkan wildcard yang digunakan dalam entri VirtualHost. Alih-alih *: 80 dan *: 443, saya menggunakan IP asli dari server saya.

Mengubah MPM prefork Apache. Ini adalah nilai-nilai yang akhirnya saya gunakan:

 StartServers 1 
 MinSpareServers 1 
 MaxSpareServers 5 
 ServerLimit 16 
 MaxClients 16 
 MaxRequestsPerChild 0 
 ListenBacklog 100 
 .____.]

Ini sama sekali bukan angka ajaib. Saya telah menghabiskan beberapa waktu untuk mencoba berbagai nilai dan kombinasi, dan kemudian mengujinya terhadap penggunaan server saya yang sebenarnya dan semua orang harus melakukan hal yang sama dalam lingkungan mereka. Sebagai catatan, server saya menerima hampir 2M pvs/bulan, melayani halaman dinamis dan aset pada tingkat reguler - tanpa efek digg. Tujuannya, sekali lagi, adalah untuk mengurangi jejak memori, bukan untuk meningkatkan kinerja atau HA.

Referensi:

Menurunkan KeepAlive dari Apache. Dengan mengatur KeepAliveTimeout ke nilai yang lebih rendah (2 dalam kasus saya) Saya dapat mengharapkan lebih sedikit proses server hanya menunggu koneksi dengan klien idle yang mungkin tidak meminta konten lagi.

Referensi: http://httpd.Apache.org/docs/2.0/mod/core.html#keepalivetimeout

Menghapus modul MySQL yang tidak digunakan. Saya menambahkan skip-innodb ke my.cnf MySQL. Pengurangan konsumsi memori besar-besaran.


Ada juga beberapa saran bagus yang tidak dapat saya lakukan:

  • Hapus PHP modul yang tidak Anda butuhkan. The PHP pada server saya memiliki kebanyakan mod sudah dikompilasi, saya mungkin akan mencoba minimal saya sendiri PHP pada VPS lainnya.
  • Beralih ke nginx dengan php-fastcgi. Itu saran bagus lainnya yang akan saya coba segera, tetapi saat ini saya tidak bisa mengambil risiko downtime.
23
lima

Saya menemukan artikel ini pada konfigurasi memori rendah untuk Apache dan MySQL

Agar sangat berguna dalam menata perubahan konfigurasi yang diperlukan untuk konfigurasi memori rendah. Saya men-tweak mereka untuk situasi saya sendiri tetapi mereka harus memberi Anda alat yang diperlukan untuk menemukan yang paling cocok untuk lingkungan Anda

6
Kevin Kuphal

Anda perlu membatasi berapa banyak proses server Apache yang berjalan, dan karena sedekat mungkin dengan batas Anda, Anda tidak akan mampu menangani lalu lintas yang sangat sibuk. Memiliki server web yang maksimal dalam penggunaan normal umumnya adalah Ide Buruk (tm), karena lalu lintas web bagus dan rendah untuk sebagian besar sampai Anda mendapatkan slashdotted atau digger atau fireballed atau apa pun.

Masalah utama adalah jumlah proses Apache yang berjalan pada satu titik - dengan asumsi prefork di sini, karena saya hanya menggunakan PHP aplikasi dan PHP bukan threadsafe. Saya tidak memiliki pengalaman menentukan MPM pekerja. Ada beberapa item yang ada di memori bersama, dan beberapa item yang ada di memori setiap proses.

Anda dapat mengurangi jejak memori total dengan meninggalkan modul bersama yang tidak Anda butuhkan. Pada dasarnya, Apache dikonfigurasikan dari sebagian besar host untuk melakukan apa saja di bawah Matahari. Jika Anda tidak menggunakan mod_userdir, beri komentar dari konfigurasi Apache Anda. Berhati-hatilah dengan berapa banyak yang Anda hapus, karena beberapa hal yang mungkin Anda butuhkan atau ketergantungannya tidak intuitif! Semua modul harus didokumentasikan di situs web Apache.org. Jejak per proses lebih sulit untuk menjadi lebih kecil; kebanyakan konfigurasi Apache akhir-akhir ini hanya datang dengan empat modul penting yang dikompilasi. Di luar keempat modul, sebagian besar penggunaan memori berasal dari kebocoran atau aplikasi RAM itu bukan sampah yang dikumpulkan secara efektif, itulah sebabnya Anda mungkin ingin mengatur jumlah permintaan yang ditangani oleh setiap proses rendah.

Anda sungguh ingin tetap menggunakan memori Anda dalam RAM sendiri dan tidak masuk ke swap. Swap berarti I/O. I/O lambat dan akan mendorong penggunaan CPU Anda melalui atap sebagai proses memblokir sambil menunggu sesuatu untuk keluar dari swap.

4
Karl Katzke

Karena Anda sudah memenuhi target Anda, berikut beberapa tambahan:

Karena Anda menghapus semua modul php yang tidak perlu, Anda bisa melakukan hal yang sama untuk Apache. Secara default (tergantung pada instalasi Anda) Apache memuat cukup banyak modul tambahan dan kebanyakan dari mereka tidak benar-benar diperlukan untuk penggunaan sehari-hari yang normal. Misalnya, ada banyak modul otentikasi yang selalu dimuat. deflate biasanya tidak diperlukan kecuali Anda mencoba membatasi penggunaan bandwidth Anda. Autoindex & status go juga dipertanyakan.

Dan satu lagi adalah Anda dapat membatasi jumlah memori yang tersedia untuk php di php.ini: memory_limit = xxxM

2
rasjani

Untuk Apache, hapus modul yang tidak Anda gunakan, karena mereka hanya menggunakan memori tambahan. Untuk MySQL, hapus innodb/bbdb jika Anda tidak menggunakannya, dan hapus modul PHP yang tidak Anda butuhkan.

Selanjutnya Anda harus mengkonfigurasi Apache MaxClients berdasarkan ukuran satu proses dan jumlah memori yang ingin Anda berikan kepada Apache. Hal yang sama berlaku untuk koneksi maks pada MySQL (Saya sarankan yang terbaik MySQL Tuning Primer Script.

Jika Anda memiliki kendali atas aplikasi PHP Anda, pastikan itu tidak menggunakan terlalu banyak memori (mis. Dalam variabel, terutama yang statis).

Jika Anda ingin melangkah lebih jauh, Anda dapat mengganti Apache + mod_php dengan pengaturan nginx + fcgi, yang mungkin akan menghasilkan pengurangan memori lebih lanjut.

Satu hal lagi - Anda benar-benar tidak ingin bertukar di server web. Hanya sedikit, untuk menghapus hal-hal yang tidak dibutuhkan, tetapi bertukar secara teratur di server web akan menghasilkan situs web yang tidak responsif.

2
yhager

Server menjalankan Solaris pada CPU bersama, dan saya menggunakan Apache + MySQL + PHP stack.

Saya tidak punya pengalaman dengan Solaris, tetapi hal terbaik yang dapat Anda lakukan adalah tidak menggunakan Apache/mod_php.

  • Beralih ke nginx dengan php-fastcgi.
  • Kompilasi ulang php untuk menggunakan jumlah minimal plugin.
  • Singkirkan proses yang tidak perlu seperti ntpd (gunakan ntpdate), ftp (gunakan scp) dll ...
0
Unknown

Tentu saja Anda dapat membatasi jumlah proses yang dapat dilakukan oleh Apache, namun ini hanya akan berfungsi sebagai batasan Sudo-hard pada penggunaan memori Anda. Dari sudut pandang tingkat yang lebih rendah Anda dapat menggunakan plimit untuk membatasi sumber daya yang tersedia untuk suatu proses. Terapkan ini ke proses orang tua dan anak mewarisi saya percaya.

Namun dari sudut pandang konfigurasi server web itu bisa turun ke bagaimana kode Anda benar-benar berjalan! Tetapi ingatlah hal-hal kecil seperti menggunakan file .htaccess menggunakan lebih banyak sumber daya daripada menggunakan file konfigurasi Apache pusat (seperti yang dibaca setiap kali permintaan masuk, yang mengarah ke overhead yang lebih besar), sesuatu yang signifikansi di situs web besar.

0
Coops

Satu hal yang mungkin membantu pertumbuhan memori dari waktu ke waktu adalah menetapkan httpd keepalive lebih rendah, tapi saya akan menguji dengan hati-hati jika aplikasi Anda membutuhkan proses yang lebih lama.

0
D.F.