Apakah php fpm berulir tunggal?

PHP-FPM (atau Fast Process Manager) menawarkan beberapa keunggulan dibandingkan mod_php, dengan dua yang paling menonjol adalah lebih fleksibel untuk dikonfigurasi dan saat ini merupakan mode yang disukai untuk menjalankan PHP oleh banyak komunitas. Namun, jika Anda menggunakan pengaturan konfigurasi default pengelola paket, kemungkinan besar Anda tidak akan mendapatkan hasil maksimal darinya

Dalam posting ini, saya akan memberikan gambaran singkat tentang cara meningkatkan kinerja PHP-FPM, dengan membahas tiga jenis manajer proses PHP-FPM, dan mana yang terbaik untuk digunakan dalam keadaan apa.

PHP-FPM dapat menggunakan salah satunya

  • statis
  • dinamis;
  • sesuai permintaan

Mari kita lihat masing-masing dengan sedikit detail

Statis

Statis memastikan sejumlah proses anak selalu tersedia untuk menangani permintaan pengguna. Ini diatur dengan. Dalam mode ini, permintaan tidak perlu menunggu proses baru dimulai, yang menjadikannya pendekatan tercepat

Dengan asumsi bahwa Anda ingin menggunakan konfigurasi statis dengan 10 proses anak selalu tersedia, Anda akan mengonfigurasinya di /etc/php/7.2/fpm/pool.d/www.conf (dengan asumsi Anda menggunakan file konfigurasi default PHP-FPM Debian/Ubunut) sebagai berikut

pm = static pm.max_children = 10 

Untuk melihat apakah perubahan konfigurasi sudah efektif, setelah memulai ulang PHP-FPM, jalankan pstree -c -H-S. Ini akan menunjukkan bahwa ada sepuluh proses yang tersedia, seperti pada contoh di bawah ini

php-fpm7.2-+-php-fpm7.2            |-php-fpm7.2            |-php-fpm7.2            |-php-fpm7.2            |-php-fpm7.2            |-php-fpm7.2            |-php-fpm7.2            |-php-fpm7.2            |-php-fpm7.2            `-php-fpm7.2 
_

Dinamis

Dalam mode ini, PHP-FPM secara dinamis mengatur jumlah proses anak yang tersedia dan memastikan setidaknya satu proses anak selalu tersedia

Konfigurasi ini menggunakan lima pilihan konfigurasi;

  • php-fpm7.2-+-php-fpm7.2            |-php-fpm7.2            |-php-fpm7.2            |-php-fpm7.2            |-php-fpm7.2            |-php-fpm7.2            |-php-fpm7.2            |-php-fpm7.2            |-php-fpm7.2            `-php-fpm7.2 
    _0. Jumlah maksimum proses anak yang diizinkan untuk dihasilkan
  • php-fpm7.2-+-php-fpm7.2            |-php-fpm7.2            |-php-fpm7.2            |-php-fpm7.2            |-php-fpm7.2            |-php-fpm7.2            |-php-fpm7.2            |-php-fpm7.2            |-php-fpm7.2            `-php-fpm7.2 
    _1. Jumlah proses anak untuk memulai saat PHP-FPM dimulai
  • php-fpm7.2-+-php-fpm7.2            |-php-fpm7.2            |-php-fpm7.2            |-php-fpm7.2            |-php-fpm7.2            |-php-fpm7.2            |-php-fpm7.2            |-php-fpm7.2            |-php-fpm7.2            `-php-fpm7.2 
    _2. Jumlah minimum proses anak menganggur yang akan dibuat oleh PHP-FPM. Lebih banyak dibuat jika tersedia lebih sedikit dari jumlah ini
  • php-fpm7.2-+-php-fpm7.2            |-php-fpm7.2            |-php-fpm7.2            |-php-fpm7.2            |-php-fpm7.2            |-php-fpm7.2            |-php-fpm7.2            |-php-fpm7.2            |-php-fpm7.2            `-php-fpm7.2 
    _3. Jumlah maksimum proses anak menganggur yang akan dibuat oleh PHP-FPM. Jika ada lebih banyak proses anak yang tersedia dari nilai ini, maka beberapa akan dimatikan
  • php-fpm7.2-+-php-fpm7.2            |-php-fpm7.2            |-php-fpm7.2            |-php-fpm7.2            |-php-fpm7.2            |-php-fpm7.2            |-php-fpm7.2            |-php-fpm7.2            |-php-fpm7.2            `-php-fpm7.2 
    _4. Waktu idle, dalam detik, setelah itu proses anak akan dimatikan

Sekarang bagian yang menyenangkan datang;

SettingValuemax_children(Total RAM – Memori yang digunakan untuk Linux, DB, dll. ) / ukuran prosesstart_serversJumlah inti CPU x 4min_spare_serversJumlah inti CPU x 2max_spare_serversSama seperti
php-fpm7.2-+-php-fpm7.2            |-php-fpm7.2            |-php-fpm7.2            |-php-fpm7.2            |-php-fpm7.2            |-php-fpm7.2            |-php-fpm7.2            |-php-fpm7.2            |-php-fpm7.2            `-php-fpm7.2 
5

Kita juga perlu mengatur

php-fpm7.2-+-php-fpm7.2            |-php-fpm7.2            |-php-fpm7.2            |-php-fpm7.2            |-php-fpm7.2            |-php-fpm7.2            |-php-fpm7.2            |-php-fpm7.2            |-php-fpm7.2            `-php-fpm7.2 
_4, yang merupakan jumlah detik setelah proses menganggur akan dimatikan

Katakanlah server kita memiliki dua CPU, masing-masing dengan empat inti, dan RAM 8 GB. Jika kita berasumsi bahwa Linux dan daemon terkait menggunakan sekitar 2GB (gunakan

php-fpm7.2-+-php-fpm7.2            |-php-fpm7.2            |-php-fpm7.2            |-php-fpm7.2            |-php-fpm7.2            |-php-fpm7.2            |-php-fpm7.2            |-php-fpm7.2            |-php-fpm7.2            `-php-fpm7.2 
7 untuk mendapatkan nilai yang lebih spesifik), itu menyisakan sekitar 6192MB

Sekarang, berapa banyak memori yang digunakan setiap proses? . py. Setelah menjalankannya, menggunakan

php-fpm7.2-+-php-fpm7.2            |-php-fpm7.2            |-php-fpm7.2            |-php-fpm7.2            |-php-fpm7.2            |-php-fpm7.2            |-php-fpm7.2            |-php-fpm7.2            |-php-fpm7.2            `-php-fpm7.2 
_8, Anda akan mendapatkan keluaran yang mirip dengan berikut ini

28.4 MiB +  33.8 MiB =  62.2 MiB    php-fpm7.2 (11) 

Kolom pertama adalah memori pribadi. Kolom kedua adalah memori bersama. Kolom ketiga adalah total RAM yang digunakan. Kolom keempat adalah nama proses

Dari gambar di atas, Anda dapat melihat bahwa ukuran prosesnya adalah 62. 2MiB. Jadi, memasukkan semua informasi itu ke dalam formula kami, kami sampai pada yang berikut

# Round the result up. (8192 - 2000) / 62.2 

Berdasarkan itu, kami sampai pada nilai pengaturan berikut

SettingValuemax_children100start_servers32min_spare_servers16max_spare_servers32

Kami akan membiarkan

php-fpm7.2-+-php-fpm7.2            |-php-fpm7.2            |-php-fpm7.2            |-php-fpm7.2            |-php-fpm7.2            |-php-fpm7.2            |-php-fpm7.2            |-php-fpm7.2            |-php-fpm7.2            `-php-fpm7.2 
_4 ke default
28.4 MiB +  33.8 MiB =  62.2 MiB    php-fpm7.2 (11) 
0. Dengan asumsi bahwa kami senang dengan pengaturan ini, maka kami akan mengonfigurasinya sebagai berikut

pm = dynamic pm.max_children = 100 pm.start_servers = 32 pm.min_spare_servers = 16 pm.max_spare_servers = 32 pm.max_requests = 200 

Anda juga dapat menggunakan alat pemantau memori secara teratur untuk memantau berapa banyak memori yang digunakan aplikasi Anda. Ada sejumlah opsi yang tersedia untuk PHP, termasuk php-memprof dan Tideways

sesuai permintaan

ondemand memiliki proses garpu PHP-FPM saat permintaan diterima. Untuk mengkonfigurasi PHP-FPM untuk menggunakannya, kita perlu mengatur

28.4 MiB +  33.8 MiB =  62.2 MiB    php-fpm7.2 (11) 
1 ke
28.4 MiB +  33.8 MiB =  62.2 MiB    php-fpm7.2 (11) 
2, dan memberikan nilai untuk

  • max_children
  • process_idle_timeout
  • max_requests

28.4 MiB +  33.8 MiB =  62.2 MiB    php-fpm7.2 (11) 
_3 menetapkan jumlah permintaan yang harus dijalankan oleh setiap proses anak sebelum respawning. Dokumentasi menunjukkan bahwa pengaturan ini berguna untuk mengatasi kebocoran memori

Dengan asumsi bahwa kami mengambil pengaturan yang sama seperti untuk

28.4 MiB +  33.8 MiB =  62.2 MiB    php-fpm7.2 (11) 
2, kami akan mengonfigurasinya sebagai berikut

pm = ondemand pm.max_children = 100 pm.process_idle_timeout = 10s pm.max_requests = 200 

Konfigurasi Mana Yang Tepat Untuk Anda?

Sejujurnya? . “tergantung”, karena selalu bergantung pada jenis aplikasi yang Anda jalankan. Namun, berikut adalah beberapa saran tentang konfigurasi mana yang harus dipilih

Situs Lalu Lintas Rendah

Jika Anda memiliki situs dengan lalu lintas rendah, seperti hosting panel kontrol backend, seperti cPanel, gunakan ondemand. Memori akan disimpan karena proses anak hanya akan muncul saat dibutuhkan dan dimatikan saat tidak diperlukan lagi. Karena ini adalah backend, pengguna dapat menunggu satu atau dua saat lebih lama sementara utas muncul untuk menangani permintaan mereka

Situs Lalu Lintas Tinggi

Jika Anda memiliki situs web dengan lalu lintas tinggi, gunakan statis dan sesuaikan pengaturan berdasarkan kebutuhan Anda dari waktu ke waktu dan sumber daya perangkat keras yang tersedia. Mungkin tampak berlebihan untuk memiliki sejumlah besar proses anak yang selalu siap menerima permintaan

Namun, situs dengan lalu lintas tinggi perlu merespons secepat mungkin. Oleh karena itu, sangat penting untuk menggunakan statis sehingga cukup banyak proses anak yang siap melakukannya

Dengan menggunakan ondemand, proses anak kemungkinan akan menghabiskan terlalu banyak memori yang dihasilkan dan dimatikan, dan penundaan startup akan berdampak pada kinerja

Menggunakan dinamis sepertinya tidak akan seburuk itu, tergantung pada konfigurasinya. Namun, Anda mungkin berakhir dengan konfigurasi yang mencerminkan statis secara efektif

Menggunakan Beberapa Pool untuk Frontend/Backend

Sekarang untuk satu rekomendasi terakhir. melayani frontend dan backend situs web Anda menggunakan kumpulan yang berbeda. Katakanlah Anda memiliki situs e-niaga, mungkin diberdayakan oleh Magento. Anda dapat melihat aplikasi ini terdiri dari dua bagian

  • Tampilan depan tempat pelanggan dapat menelusuri dan melakukan pembelian
  • Backend, tempat staf admin mengelola toko (seperti menambah/menghapus produk, kategori, dan tag, dan meninjau peringkat)

Jika dilihat dengan cara ini, masuk akal untuk memiliki satu kumpulan yang melayani frontend dan kumpulan lainnya yang melayani backend dan mengonfigurasi masing-masing dengan tepat

Untuk apa nilainya, Anda dapat membagi aplikasi apa pun menjadi beberapa bagian menggunakan strategi ini, jika masuk akal untuk melakukannya. Inilah cara melakukannya

Di /etc/php/7.2/fpm/pool.d/www.conf_, tambahkan konfigurasi berikut

; frontend [frontend] listen = /var/run/php-fpm-frontend.sock user = www-data group = www-data listen.owner = www-data listen.group = www-data pm = static pm.max_children = 5

; backend [backend] listen = /var/run/php-fpm-backend.sock user = www-data group = www-data listen.owner = www-data listen.group = www-data pm = ondemand pm.max_children = 5 pm.process_idle_timeout = 10s 

Ini menciptakan dua kumpulan, satu untuk frontend, dan satu untuk backend. Keduanya memiliki pengguna dan grup yang sama, tetapi memiliki konfigurasi manajer proses yang berbeda dan terhubung melalui soket yang berbeda

Kumpulan frontend menggunakan konfigurasi statis dengan sejumlah kecil proses anak maksimum. Kumpulan backend menggunakan konfigurasi ondemand, juga dengan sejumlah kecil konfigurasi. Angka-angka ini sewenang-wenang, karena untuk keperluan contoh

Dengan itu disimpan, untuk file vhost NGINX Anda, gunakan konfigurasi berikut

server {   listen       80;   server_name  test-site.localdomain;   root         /var/www/test-site/public;

  access_log /var/log/nginx/test-site.access.log;   error_log  /var/log/nginx/test-site.error.log error;   index index.php;

  set $fpm_socket "unix:/var/run/php-fpm-frontend.sock";

  if ($uri ~* "^/api/") {       set $fpm_socket "unix:/var/run/php-fpm-backend.sock";   }

  location / {     try_files $uri $uri/ /index.php;

    location ~ .php$ {       fastcgi_split_path_info ^(.+.php)(/.+)$;       fastcgi_pass $fpm_socket;       fastcgi_index index.php;       include fastcgi.conf;       fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;     }   } } 

Ini membuat konfigurasi host virtual yang mengirimkan permintaan ke kumpulan frontend atau backend, berdasarkan lokasi yang diminta. Permintaan apa pun ke

28.4 MiB +  33.8 MiB =  62.2 MiB    php-fpm7.2 (11) 
6 dikirim ke kumpulan backend, dan semua permintaan lainnya dialihkan ke frontend

Kesimpulannya

Itu adalah pengantar cepat untuk menyetel PHP-FPM untuk kinerja yang lebih baik. Kami telah melihat tiga konfigurasi manajer proses yang berbeda, pengaturan terkaitnya, dan membahas kapan setiap konfigurasi masuk akal. Kami kemudian menyelesaikannya dengan melihat kumpulan pekerja

Apakah PHP

Setiap proses PHP-FPM menggunakan satu inti CPU . PHP sangat diuntungkan dari kinerja single-thread CPU. Sebelum kita membahasnya, mari kita lihat bagaimana PHP menggunakan CPU server web Anda. Seperti yang mungkin sudah Anda ketahui, PHP tidak dirancang untuk multithreading.

Apakah PHP multithreaded atau single threaded?

PHP, seperti kebanyakan bahasa sisi server, menggunakan multi-utas , memblokir I/O untuk menjalankan banyak tugas secara paralel.

Mengapa PHP adalah utas tunggal?

Sifat utas tunggal PHP berarti bahwa PHP tidak memiliki dukungan bawaan untuk membuat utas baru selama eksekusi skrip . Namun, ini tidak berarti bahwa Anda tidak dapat menjalankan dua skrip yang sama secara bersamaan. Dalam penyiapan yang paling umum, situs web Anda dilayani oleh Apache HTTPD.

Apakah ada multithreading di PHP?

Aplikasi PHP, tidak diragukan lagi bekerja secara efektif dengan kemampuan multithreading . Multithreading adalah sesuatu yang mirip dengan multitasking, tetapi memungkinkan untuk memproses banyak pekerjaan sekaligus, bukan pada banyak proses.