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.
Jawaban:
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_requests
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. 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
sumber
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.
sumber