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.
Jawaban:
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):
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.
sumber
pm
daridynamic
menjadiondemand
dan semua tampaknya berfungsi baik sekarang dengan semua nilai default lainnya.ERROR: [/etc/php/7.0/fpm/pool.d/www.conf:135] unknown entry 'emergency_restart_threshold'