Nginx + php-fpm - Setiap proses php-fpm 70-100% cpu saat menjalankan

8

Saya memiliki situasi di mana yang berikut ini terjadi:

  • Kami berada di linode dengan 8-core, 8gb ram, 2,6 ghz - menggunakan nginx + php-fpm - kami mendapatkan grafik penggunaan cpu yang sangat tinggi (yang kami tidak ingin menjadi tetangga VPS yang buruk) ...

  • Kami memiliki kurang dari 100 pengguna di situs sekaligus - sehingga situasi ini juga sangat memalukan - bahwa penggunaan cpu kami sangat tinggi.

  • Kami menggunakan kerangka kerja php-wise yang sangat tidak diketahui, mungkin intensif, dipertanyakan mengerikan, bukannya kerangka kerja lain yang terkenal, terdokumentasi dengan baik, seperti wordpress atau drupal di mana ada BANYAK dokumentasi tentang caching (serta plugin) yang menangani caching) php pada platform nginx + php_fpm.

  • Jadi, kami memiliki sekitar 6 proses php-fpm terbuka yang ketika MENJALANKAN, mengkonsumsi secara individual LARGE (30+, dan sering mendekati 99%) jumlah cpu - dan saya tidak memiliki ide sedikit pun bagaimana menghentikan mereka menggunakan begitu banyak cpu . Saya tidak tahu skrip php mana yang menyebabkan lonjakan ini karena mereka terjadi setiap saat ... biasanya hanya 1 atau 2 yang berjalan - tetapi ketika semua 6 dijalankan, kami memaksimalkan semua 8 CPU.

  • File pool.d / www.conf saya memiliki pengaturan berikut:

    pm = dynamic
    pm.max_children = 10
    pm.start_servers = 4
    pm.min_spare_servers = 2
    pm.max_spare_servers = 6
    
  • Kami melakukan pengaturan ^ ini karena, dengan cara saya menginterpretasikannya, memori kami benar-benar luar biasa (htop menunjukkan 472/7000 + mb digunakan, tidak ada swapping dll) dan kami dapat menangani lebih banyak proses dan memecah jalur yang menunggu untuk mendapatkan diproses - TETAPI sayangnya, karena setiap proses terlalu kuat pada cpu kami saat berjalan - kami akhirnya menggerakkan CPU kami melalui atap - jadi kami tidak dapat menangani proses yang cukup.

  • Pertanyaannya - apa yang bisa kita lakukan untuk mengurangi proses penggunaan php-fpm cpu sehingga kita dapat meningkatkan pengaturan dalam file pool conf untuk php-fpm - dan juga ya, /var/log/php5-fpm.log berteriak kepada kami untuk meningkatkan anak-anak kami dan menyesuaikan / meningkatkan server min / max / start kami. Tetapi melakukan hal itu membuat rata-rata beban kami menjadi gila seperti yang dinyatakan sebelumnya. Bagaimana kita bisa melakukannya tanpa harus menggunakan cache atau apa saja pilihan kita?

  • Ide saya? Saya sudah membaca hal-hal tentang menggunakan cpulimit untuk memastikan tidak ada proses yang membutuhkan lebih dari jumlah cpu yang dialokasikan - tetapi apakah hal itu akan memperlambat agar tidak dapat digunakan lagi? Atau dengan melakukan itu kita dapat meningkatkan kemampuan kita untuk menjalankan lebih dari beberapa proses - saya juga berpikir menjalankan dua kumpulan - satu untuk situs web menghadap ke depan kami (apa yang dialami pelanggan) dan satu lagi untuk backend (yang memengaruhi situs menghadap ke depan kami saat waktu -laporan konsumen sedang dijalankan).

  • Saya telah menghabiskan beberapa hari untuk meneliti, googling, dll pada topik ini - dan itu sulit karena situasi setiap orang sangat unik untuk sistem mereka - masalahnya adalah pada kerangka kerja yang belum pernah terjadi sebelumnya, mungkin ditulis dengan buruk - membuat - membuat sulit untuk menemukan solusinya. Kita juga tidak bisa begitu saja menghapus kerangka kerja ini - saya harus mencari solusi.


PEMBARUAN: Saya telah menerapkan memcache untuk menyimpan sesi php - karena kerangka kerjanya sangat bergantung pada sesi pengguna dan sifat sistem kami adalah bahwa karyawan sering menggunakan beberapa tab sekaligus - masing-masing memeriksa kembali ke sesi untuk mengkonfirmasi kemampuan / data pengguna / dll ... jadi saya berharap untuk melihat peningkatan kinerja dari ini - selamat mengomentari itu jika Anda mau - saya akan melihat bagaimana hasilnya besok ketika kita melewati masa puncak volume yang lebih tinggi.

amurrell
sumber
Nginx tidak terlalu baik untuk aplikasi web intensif CPU - tetapi CPU tinggi kami buruk - sangat buruk - dan kami sedang berupaya memperbaikinya. Tidak ada pengaturan maksimal klien yang harus dimiliki karena ia HARUS dapat mendukung jumlah klien yang layak - tetapi penggunaan CPU yang tinggi per proses membuat skew kemampuan itu. Kami beralih ke apache hanya karena LITTLE lebih baik dengan penggunaan CPU yang tinggi - tetapi pada akhirnya masalah ini lebih mengindikasikan masalah aplikasi web dan mungkin perlu beberapa saat untuk mengatasinya tetapi tidak ada waktu seperti sekarang untuk mulai memperbaikinya.
amurrell
Ketika Anda pergi ke dokter, dan dia memberi tahu Anda untuk mengambil obat-obatan tertentu - karena dia tahu Anda tidak akan mendengarkan pernyataan "berhenti minum soda dan makan makanan cepat saji" - inilah mengapa tidak ada jawaban yang bagus untuk saya - karena kebenarannya adalah , tidak ada pengaturan atau perbaikan cepat yang benar-benar diterapkan - hanya kebenaran yang menyedihkan bahwa kita harus mengubah aplikasi web kita sendiri secara dramatis.
amurrell
Untungnya jika Anda memiliki masalah ini dengan kerangka kerja populer, Anda mungkin memiliki opsi untuk memanfaatkan caching dan dokumentasi berlimpah tentang hal itu - tetapi kami berada pada beberapa hal acak yang tidak dapat kami ubah kecuali kerangka itu sendiri. Yay!
amurrell
1
Jadi dari apa yang saya mengerti tentang itu, opcache menyimpan kode PHP Anda sebagai biner dan dapat dikonsumsi oleh php-fpm lebih cepat (caching) tetapi Anda juga harus menggunakan objek caching .. contohnya adalah menyimpan seluruh halaman output sebagai objek " "Dalam sesuatu seperti memcached. Ini sebenarnya akan me-cache output halaman (atau hal-hal lain yang Anda inginkan seperti sesi php dll) ... Selanjutnya, Anda juga bisa menggunakan pernis yang merupakan proxy terbalik - tetapi pada dasarnya itu adalah perantara antara permintaan dan server Anda sehingga Anda server tidak dipukul dengan permintaan secara langsung - dan berfungsi dari memori untuk melayani url yang di-cache.
amurrell
1
Pernis luar biasa untuk ini - menyimpan salinan cache dari apa yang didapatnya dari server dalam memori - sehingga pernis membutuhkan banyak beban. Majikan saya saat ini ada di nginx dan kami menggunakan pernis dan memcached. Untungnya kerangka kerja kita sekarang memiliki mekanisme caching sendiri untuk menentukan cache halaman (data halaman yang dihasilkan). Pada pekerjaan terakhir saya, saya harus menuliskannya ke dalam kerangka kerja sendiri - itu tidak menyenangkan, tetapi berhasil. Apache- Saya tidak akan beralih kembali, kecuali jika Anda tidak punya waktu untuk memperbaiki nginx .. Saya benci akan kembali tetapi itu adalah satu-satunya solusi untuk tidak sepenuhnya membunuh proyek kami ketika saya menulis mekanisme caching.
amurrell

Jawaban:

6

Beberapa hal yang perlu dipertimbangkan (permintaan maaf sebelumnya jika Anda telah mempertimbangkan ini): Pertama-tama, pastikan untuk mengoptimalkan konfigurasi nginx Anda dan aktifkan php-fpm hanya ketika benar-benar diperlukan. Hal terakhir yang ingin Anda lakukan adalah membiarkan php menangani hal-hal seperti halaman HTML statis (yang dengan senang hati akan melakukannya).

Kedua, karena Anda menggunakan php-fpm, saya sarankan untuk lebih agresif dengan berapa lama anak-anak php-fpm diizinkan untuk hidup. Anda perlu menemukan sweet spot antara benang / anak yang berumur pendek dan stabilitas. Default php-fpm terlalu murah hati untuk sistem produksi apa pun, IMHO. Semakin lama seorang pekerja diizinkan untuk melayani permintaan, semakin tidak stabil permintaannya. Ada juga risiko kebocoran memori yang lebih tinggi, dan jika kerangka yang Anda rujuk memiliki bug seperti loop tak terbatas, yang mungkin menyebabkan Anda bersedih dengan beban CPU, ini seharusnya tidak sakit.

Saya akan mengurangi jumlah untuk pm.max_requestskumpulan produksi Anda. Saya pikir standarnya adalah 200. Saya akan mulai dari 50 dan melihat di mana itu membawa Anda.

Gagal / melengkapi itu, Anda juga bisa mencoba opsi global ini (AFAIK semuanya dinonaktifkan secara default):

emergency_restart_threshold 3
emergency_restart_interval 1m
process_control_timeout 5s

Apa artinya ini? Jika 3 anak PHP-FPM memproses keluar dengan SIGSEGV atau SIGBUS (yaitu crash) dalam 1 menit maka PHP-FPM seharusnya dimulai ulang secara otomatis. Proses anak menunggu 5s untuk reaksi pada sinyal dari master.

Berikut ini ikhtisar yang bagus dari semua opsi konfigurasi yang saya sebutkan di sini, serta yang lainnya: http://myjeeva.com/php-fpm-configuration-101.html

Semoga tips ini membantu Anda! Ingatlah untuk mengubah dan mengamati, sayangnya sepertinya tidak ada aturan praktis untuk semua ini, seperti yang Anda amati, ada terlalu banyak variabel yang mempengaruhi perilaku dan stabilitas PHP.

Akhirnya, fasilitas pembatas CPU yang Anda tanyakan didokumentasikan di sini , tetapi saya hanya akan menggunakannya jika Anda menghabiskan semua opsi lainnya. Jika Anda memilih jalur ini, saya pasti akan mengawasi kemungkinan interaksi antara tweak PHP-FPM dan konfigurasi limit.conf Anda. Pada titik itu, dll. Penjaga mungkin adalah penyelamat! :)

Semoga berhasil!

Rouben

Rouben
sumber
Saya akan mencoba membatasi max_requests besok - Sepertinya setiap proses yang kami izinkan ingin memakan cpu jadi ini mungkin ide yang bagus. Kami menggunakan ambang restart darurat, tetapi nomor saya sedikit lebih tinggi - saya akan mencoba milik Anda dan melihat bagaimana hasilnya. Terima kasih atas ketelitian Anda - sangat dihargai. Ingin tahu pendapat Anda tentang caching? Saya bertanya-tanya apakah menggunakan caching php berarti bahwa kerangka kerja harus disesuaikan untuk menanganinya. Saya cukup baru dalam konsep itu.
amurrell
3

Anda menjalankan caching opcode, bukan?

Ini dulunya adalah APC yang menjadi tujuan utama di sini, tapi itu sudah menjadi buggy selama beberapa waktu, dan telah digantikan oleh Zend Opcache , yang sekarang menjadi bagian dari PHP sejak 5.5, dan memiliki backport di PECL untuk 5.3 dan 5.4.

Michael Hampton
sumber
Saya tertarik pada Zend OpCache ini - Kami ada di 5.3 - Jika Anda dapat memperluas jawaban ini, saya akan sangat menghargainya!
amurrell
Kami memiliki xcache - tetapi sekarang saya telah memilih untuk Zend Opcache dan saya telah menginstalnya dan mengonfirmasi semuanya sudah berjalan di phpinfo (). Saya akan memberi tahu Anda jika kinerja kami lebih baik sebagai hasilnya
jauhkan
Saya harus menonaktifkan zend opcache untuk saat ini - semuanya berfungsi kecuali file css atau js yang dihasilkan php-dinamis. Saya mencoba daftar hitam file-file itu dari opcache - tetapi baik daftar hitam tidak berfungsi atau saya tidak tahu mengapa opcache menyebabkan nginx mendapatkan 502 kesalahan gateway yang buruk untuk HANYA file-file itu. Yang saya butuhkan untuk template dan mereka adalah bagian dari kerangka kerja yang buruk. Dalam log nginx saya menerima banyak readv gagal - 104 koneksi kesalahan rekan.
amurrell