تصویر محمدعلی اکبری

PHP-FPM یک پیاده سازی دیگر از PHP FastCGI بوده و برای سابت‌های heavy-load مناسب است. از ویژگی‌های آن در مقایسه با PHP معمولی و دیگر پیاده سازی‌های PHP FastCGI می‌توان به موارد زیر اشاره کرد:

  • شروع و بارگزاری مجدد فرآیندها به صورت graceful: خاتمه درخواست‌های موجود قبل از اتمام فرآیند.
  • کنترل تعداد فرآیندها با توجه به بار سرور
  • توانایی شروع workerها با uid/gid/chroot/environment و php.ini های مختلف
  • سازگاری بیشتر با acceleratorها
  • قابلیت کشف فرآیندهای کند SlowLog

PHP-FPM نیز همانند دیگر نرم‌افزارها باید برای محیطی که در آن کار میکند بهینه شود. بهینه سازی یا Tunnig یعنی تعیین دقیق پارامترهای نرم‌افزار با توجه به کاربرد، کانفیگ سخت افزاری سرور شامل RAM و CPU، تعداد درخواست‌های روی سرور و ...

کار خود را با تعداد فرآیندهای در حال اجرا شروع می‌کنیم. مقادیر زیر را در نظر بگیرید:

; Choose how the process manager will control the number of child processes.
; Possible Values:
;   static  - a fixed number (pm.max_children) of child processes;
;   dynamic - the number of child processes are set dynamically based on the
;             following directives:
;             pm.max_children      - the maximum number of children that can
;                                    be alive at the same time.
;             pm.start_servers     - the number of children created on startup.
;             pm.min_spare_servers - the minimum number of children in 'idle'
;                                    state (waiting to process). If the number
;                                    of 'idle' processes is less than this
;                                    number then some children will be created.
;             pm.max_spare_servers - the maximum number of children in 'idle'
;                                    state (waiting to process). If the number
;                                    of 'idle' processes is greater than this
;                                    number then some children will be killed.
; Note: This value is mandatory.
pm = dynamic

; The number of child processes to be created when pm is set to 'static' and the
; maximum number of child processes to be created when pm is set to 'dynamic'.
; This value sets the limit on the number of simultaneous requests that will be
; served. Equivalent to the ApacheMaxClients directive with mpm_prefork.
; Equivalent to the PHP_FCGI_CHILDREN environment variable in the original PHP
; CGI.
; Note: Used when pm is set to either 'static' or 'dynamic'
; Note: This value is mandatory.
pm.max_children = 60

; The number of child processes created on startup.
; Note: Used only when pm is set to 'dynamic'
; Default Value: min_spare_servers + (max_spare_servers - min_spare_servers) / 2
pm.start_servers = 20

; The desired minimum number of idle server processes.
; Note: Used only when pm is set to 'dynamic'
; Note: Mandatory when pm is set to 'dynamic'
pm.min_spare_servers = 20

; The desired maximum number of idle server processes.
; Note: Used only when pm is set to 'dynamic'
; Note: Mandatory when pm is set to 'dynamic'
pm.max_spare_servers = 35

; The number of requests each child process should execute before respawning.
; This can be useful to work around memory leaks in 3rd party libraries. For
; endless request processing specify '0'. Equivalent to PHP_FCGI_MAX_REQUESTS.
; Default Value: 0
pm.max_requests = 500

در PHP-FPM پاسخگویی به هر درخواست بر عهده یک فرآیند یا process است. مقدار pm = dynamic تعیین می‌کند که فرآیندها به صورت پویا مدیریت شوند، یعنی هرگاه لازم بود فرآیند جدید ایجاد شود و یا فرآیندهای بیکار خاتمه پیدا کنند.  مقدار pm.max_children تعیین کننده تعداد حداکثر فرآیندها است، در صورتی که درخواست جدیدی بعد از این تعداد ایجاد شود، باید منتظر آزاد شدن فرآیندهای قبلی شود.

ایجاد و خاتمه هر فرآیند مستلزم صرف CPU، RAM و زمان است، لذا با استفاده از pm.start_servers تعیین می‌کنیم با بالا آمدن سرور چه تعداد فرآیند خالی برای پاسخگویی به درخواست‌های آتی ایجاد شود. همچنین مقادیر  و pm.min_spare_servers و pm.max_spare_servers نیز تعیین کننده حداقل و حداکثر تعداد فرآیندهای idle می‌باشد. فرآیندهای بیکار بعد از فرآیند pm.max_spare_servers خاتمه پیدا می‌کنند و حداقل به تعداد pm.min_spare_servers فرآیند بیکار در سرور باز خواهند گشت.

هر فرآیند به تعداد pm.max_requests از درخواست‌ها را پاسخ می‌دهد و بعد از آن به صورت اجباری خاتمه پیدا می‌کند و یا به عبارتی respawn می‌شوند. دلیل این امر آزاد نشدن احتمالی قسمت‌هایی از RAM توسط فرآیند است. ممکن است نرم‌افزارهایی که روی سرور شما در حال اجرا هستند (دروپال، ورد پرس و ...) و یا PHP از افزونه‌هایی استفاده کنند که خوب نوشته نشده باشند و حافظه RAM را بعد از استفاده رها نکنند.

برای دو مجموعه از مقادیر نتایج زیر بدست می‌آید:

pm = dynamic
pm.max_children = 60
pm.start_servers = 20
pm.min_spare_servers = 20
pm.max_spare_servers = 35
pm.max_requests = 500

مقدار مصرف RAM در حال فوق تقریبا 300 مگابایت بوده و برای سایت‌های پر بازدید مناسب است.

pm = dynamic
pm.max_children = 30
pm.start_servers = 2
pm.min_spare_servers = 2
pm.max_spare_servers = 5
pm.max_requests = 50

مقدار مصرف RAM در حالت فوق تقریبا 140 مگابایت بوده و برای سایت‌های سبک مناسب است.

به روز رسانی ( 5 بهمن 1393)

- مقادیر زیر روی سروری با 10 هزار کاربر آنلاین (گزارش گوگل آنالیتیک) به خوبی جواب داد:

[www]
pm = static
pm.max_children = 1024

- در تنظیمات opcache نیز مقادیر زیر تعیین شده بود:

opcache.memory_consumption=256
opcache.interned_strings_buffer=32
opcache.max_accelerated_files=10000
opcache.validate_timestamps=0
opcache.save_comments=0
opcache.load_comments=0

دیدگاه‌ها

تصویر 3adegh

3adegh (تایید نشده)

سلام

لطفا آموزش نصب و اجرا کردن php-fpm را روی سی پنل توضیح و اموزش دهید

متشکرم

تصویر niX

niX (تایید نشده)

سپاس بابت مطلب خلاصه و مفید

مقادیری که برای رم 300 مگ تعیین کرده اید , خیلی بالا هست ...

افزودن نظر جدید