Cara mengurangi penggunaan memori pada server web Unix


36

Saat ini saya menggunakan Joyent Accelerator untuk meng-host aplikasi web saya, dan itu berfungsi dengan baik, namun saya perlu mengurangi biaya jadi saya menurunkan versi 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 sudah melihat pertanyaan ini , tetapi saya pikir itu tidak baik untuk situasi khusus ini (atau bolehkah saya katakan generik?).

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

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 :)


1
Saya hanya ingin berkomentar bahwa walaupun saya telah mempelajari pengaturan ini sendiri dari googling, ternyata saya mengubah pengaturan dalam satu file, tetapi file konfigurasi yang berbeda yang sedang dimuat kemudian sebenarnya secara diam-diam mengabaikan pengaturan saya! Setelah saya menemukan itu, pengaturan pengaturan MPM prefork dan beberapa hal lain bekerja sangat baik untuk menjaga jumlah proses dan penggunaan memori di bawah kontrol, menukar ke minimum. Semoga info ini membantu orang lain, terutama yang menjalankan Gentoo di server mereka.
Pistos

Jawaban:


23

Terimakasih semuanya untuk 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, tetapi ini seharusnya menjadi solusi untuk membuat saya keluar dari masalah dengan cepat).

Inilah daftar hal-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. Inilah 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 waktu 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:

Tuned KeepAlive dari Apache. Dengan menetapkan KeepAliveTimeoutke 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-innodbke my.cnf MySQL. Pengurangan konsumsi memori besar-besaran.


Ada juga beberapa saran bagus yang tidak bisa saya lakukan secara pribadi:

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

Saya menjalankan nginx dan php-fastcgi (LEMP) dan saya mengalami masalah memori yang serupa ... pada server 256MB Saya menemukan bahwa php-fastcgi bekerja dengan baik dengan PHP_FCGI_CHILDREN = 5 dan PHP_FCGI_MAX_REQUESTS = 333 ... nilai-nilai ini merupakan awal yang baik titik!
farinspace

Got rid of the wildcard used in VirtualHost entriesapakah itu benar-benar membantu dengan cara yang berarti? Saya berada di bawah kesan yang tidak akan membuat perbedaan.
Mahn

@ Ahn - tidak membantu dengan Memori, tetapi meningkatkan penggunaan CPU, yang merupakan hal yang baik di lingkungan memori rendah
jsnfwlr

"Beralih ke nginx dengan php-fastcgi" --- Opsi yang kurang drastis namun efektif jika Anda ingin mempertahankan Apache2 adalah: Apache2 + mod_proxy_fcgi + mod_mpm_event. mpm_event mirip dengan nginx. Gunakan itu untuk terhubung ke php-fpm. Lihat dracony.org/stop-using-php-fpm-to-argue-using-nginx-vs-apache
James Johnston


4

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 aplikasi PHP dan PHP bukan threadsafe. Saya tidak punya pengalaman menimbang 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; sebagian besar konfigurasi apache saat ini hanya datang dengan empat modul penting yang dikompilasi. Di luar keempat modul, sebagian besar penggunaan memori berasal dari kebocoran atau RAM aplikasi yang bukan sampah yang dikumpulkan secara efektif, itulah sebabnya Anda mungkin ingin mengatur jumlah permintaan ditangani oleh setiap proses rendah.

Anda benar - benar ingin menjaga penggunaan memori Anda dalam RAM itu sendiri dan tidak masuk ke swap. Swap berarti I / O. I / O lambat dan akan mendorong penggunaan CPU Anda melalui atap saat proses memblokir sambil menunggu sesuatu untuk keluar dari swap.


1
Terima kasih atas sarannya Karl! Apakah ada cara untuk mencegah server menggunakan Swap? Karena setelah mengurangi penggunaan memori, saya tidak lagi menggunakan RAM, tetapi masih menunjukkan memori SWAP telah digunakan.
lima

@fandelost Tidak masalah swap yang digunakan, saat hal-hal yang masuk dan keluar dari swap yang buruk. Sistem operasi Anda mungkin menukar instruksi atau data dari proses yang tidak berjalan sangat sering ketika ada waktu untuk melakukannya karena dianggap (dan seringkali benar) bahwa instruksi dan data tersebut lebih baik di sana.
Patrick James McDougle

2

Untuk apache, lepaskan 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 pada ukuran satu proses dan jumlah memori yang ingin Anda berikan apache. Hal yang sama berlaku untuk koneksi maks pada MySQL (Saya sarankan Script Primer Tuning MySQL yang sangat baik .

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

Jika Anda ingin melangkah lebih jauh, Anda dapat mengganti apache + mod_php dengan setup 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.


Terima kasih atas saran Anda, ya, saya mencoba tuning-primer.sh tetapi saya mendapatkan kesalahan berikut: "kesalahan sintaks pada baris 94:` cnf_socket = $ 'tak terduga ". Ada ide?
lima

Bisa jadi terkait dengan shell. Karena skrip ini mungkin terkait dengan Linux, cobalah untuk mengubah baris pertama untuk menunjuk ke bash, alih-alih / bin / sh. Saya harap Anda bisa mendapatkan pesta diinstal pada Solaris, tapi aku tidak bisa membantu dengan itu ...
yhager

2

Karena Anda sudah memenuhi target Anda, berikut beberapa tambahan:

Karena Anda menghapus semua modul php yang tidak perlu, Anda dapat 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


0

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

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


0

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

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 ...
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.