Terus-menerus harus memuat ulang PHP-FPM


27

Kami memiliki server yang cukup banyak menjalankan nginx dan PHP-FPM. Kami memiliki 6 situs web di server ini, yang menjalankan PHP-FPM dan nginx. Perangkat lunak adalah semua vBulletin 3.8 dan WordPress. Database berada di server terpisah.

Sekarang, karena ini adalah situs web yang sangat populer, kami biasanya memiliki 7-8.000 pengunjung online pada satu waktu, dengan masing-masing halaman memukul database untuk sebagian besar. Saya percaya ini adalah penyebab masalah kita.

Karena kami memiliki begitu banyak basis data di server MySQL, dan karena pertanyaannya bisa, sejujurnya, jauh lebih baik dalam perangkat lunak, saya pikir MySQL kadang-kadang gagal mengembalikan hasil ke PHP pada waktu yang tepat, menciptakan efek kaskade yang pada akhirnya menyebabkan semuanya berhenti sampai kita memuat ulang PHP-FPM. Setelah kami melakukan itu, segalanya mulai berfungsi dengan baik lagi.

Alasan saya mengalami masalah dalam pemecahan masalah ini adalah karena saya tidak dapat benar-benar membedakan apa pun dari log. Dalam log permintaan lambat MySQL, saya melihat tidak ada yang menarik ketika downtime terjadi. Dalam log nginx, saya melihat ribuan entri mengatakan bahwa permintaan baca habis atau koneksi habis (Ke PHP-FPM). Dan dalam log PHP-FPM, saya melihat banyak baris yang mengatakan "waktu eksekusi habis (31 detik), mengakhiri

Jadi pada titik ini saya benar-benar tidak tahu ke mana harus mencari masalah. Jelas, apa pun yang terjadi sedang terjadi karena skrip ini kadang-kadang tidak menjalankan cukup cepat (Biasanya mereka memuat di bawah satu detik, tetapi sesuatu terjadi yang menyebabkan waktu buka meroket). Ini terjadi berkali-kali sehari dan telah menjadi masalah bagi kami.

Untuk saat ini saya hanya memiliki crontab untuk memuat ulang php5-fpm setiap 10 menit, yang menangani masalah mogok. Tentu saja, ketika PHP memuat ulang, nginx melempar kesalahan gateway 502, jadi itu bukan solusi.

PHP menjalankan cache APC, jika itu penting. Saya telah membaca di beberapa tempat bahwa APC dapat menyebabkan menggantung dalam keadaan tertentu.

Petunjuk apa pun akan sangat membantu. Saya benar-benar ingin tidak perlu khawatir dengan mesin ini sepanjang waktu.

Info lebih lanjut dapat diberikan tentunya. Beri tahu saya apa yang Anda butuhkan.

Pembaruan: Saya baru saja menyalin apc.php ke root web dan mengaksesnya untuk melihat statistik kami. Segalanya tampak bagus. Lalu saya mengklik tautan untuk pergi ke statistik Pengguna dan BOOM server langsung digantung. Saya memuat ulang php-fpm dan kemudian memuat kembali halaman statistik pengguna dan itu berjalan dengan baik. Menunggu satu menit, memuat ulang lagi, server hang lagi.

Jadi ini jelas terkait APC. Pertanyaannya adalah - Bagaimana cara memperbaikinya?

Konfigurasi APC:

[apc]
apc.enabled="1"
apc.stat = "1"
apc.max_file_size = "2M"
apc.localcache = "1"
apc.localcache.size = "256"
apc.shm_segments = "1"
apc.ttl = "3600"
apc.user_ttl = "7200"
apc.gc_ttl = "3600"
apc.cache_by_default = "1"
apc.filters = ""
apc.write_lock = "1"
apc.num_files_hint= "10000"
apc.user_entries_hint="10000"
apc.shm_size = "1G"
apc.mmap_file_mask=/tmp/apc.XXXXXX
apc.include_once_override = "0"
apc.file_update_protection="2"
apc.canonicalize = "1"
apc.report_autofilter="0"
apc.stat_ctime="0"

Pembaruan 2: Kami telah membuat beberapa kemajuan dalam hal ini di sini. Ternyata plugin caching WordPress (W3 Total Cache) adalah penyebab crash. Kami masih tidak tahu mengapa, tetapi dengan dinonaktifkan, kami telah menjalankan PHP selama hampir 4 jam sekarang tanpa memuat ulang, tanpa perlambatan, tanpa gangguan. Kami masih menggunakan APC di forum vBulletin dan tidak ada masalah sama sekali. Apakah ada cara kita dapat menentukan MENGAPA APC mogok? Saya ingin menggunakannya pada instalasi WordPress kami, tetapi tidak dengan biaya sistem yang rapuh.


Bisakah Anda memposting pengaturan APC terkait yang Anda miliki?
Kyle

Ya, ide bagus. Selesai
Kevin

Berapa banyak ram dan swap yang Anda miliki di mesin ini? Berapa banyak yang digunakan ketika mulai mati?
Kyle

2
APC adalah mimpi buruk kereta yang mengerikan, dan merupakan satu-satunya sumber crash seperti ini di salah satu situs web saya selama bertahun - tahun . Saya akhirnya menyingkirkannya sepenuhnya; dan PHP sekarang solid. Jika Anda ingin caching, coba Zend Opcache, yang juga merupakan cache default dari PHP 5.5.
Michael Hampton

1
Ya, akhirnya menjadi APC yang menabrak PHP. Ketika kami menonaktifkan APC, kami berhenti harus memulai ulang PHP terus-menerus.
Kevin

Jawaban:


27

Anda menggunakan php-fpm, jadi 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 adalah cara terbaik untuk sistem produksi apa pun, IMHO.

Saya akan mengurangi jumlah untuk pm.max_requests untuk kumpulan 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. Anak memproses menunggu 5s untuk reaksi pada sinyal dari master.

Ini harus menjaga agar kumpulan pekerja PHP Anda tetap bagus, segar dan bersih. Semakin lama seorang pekerja diizinkan untuk memberikan permintaan, semakin tidak stabil permintaan itu. Ada juga risiko kebocoran memori yang lebih tinggi.

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, ada terlalu banyak variabel yang mempengaruhi perilaku dan stabilitas PHP.


1
Apa pendapat Anda tentang hanya menggunakan cron untuk me-restart php5-fpm setiap jam?
CMCDragonkai

2
Itu cara yang agak kumuh untuk melakukannya, dan mungkin tidak berhasil sama sekali. PHP-FPM memiliki sejumlah tweak built-in, jadi lebih baik menggunakan tweakability itu.
Rouben

1
Jawaban ini menunjuk saya ke arah yang benar. Saya melihat masalah yang sama seperti ini sendiri, solusi bagi saya adalah mengubah pmdari dynamicmenjadi ondemanddan semua tampaknya berfungsi baik sekarang dengan semua nilai default lainnya.
Lanlan

(dalam php-fpm.conf) itu harus '=' alih-alih '' memisahkan kunci dan nilai. emergency_restart_threshold = 3 emergency_restart_interval = 1m process_control_timeout = 5s
justyy

Saya mulaiERROR: [/etc/php/7.0/fpm/pool.d/www.conf:135] unknown entry 'emergency_restart_threshold'
deweydb
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.