پرش به مطلب اصلی

تنظیم منابع و Auto Tune در Laravel

تنظیم منابع زمان اجرای PHP در سرویس Laravel از طریق متغیرهای محیطی سرویس انجام می‌شود. این مقادیر را در پنل سرویس وارد کنید؛ قرار دادن آن‌ها فقط در فایل .env پروژه برای پیکربندی زمان شروع کانتینر کافی نیست.

روش اعمال تنظیمات​

این متغیرها را در پنل سرویس، از مسیر تنظیمات ← متغیرهای محیطی وارد کنید و تغییرات را ذخیره کنید. نام متغیرها به بزرگی و کوچکی حروف حساس است. راهنمای متغیرهای محیطی مراحل کار با پنل را توضیح می‌دهد.

تنظیمات هنگام شروع کانتینر خوانده می‌شوند. برای اعمال تغییرات، کانتینر باید با Environment جدید دوباره ساخته شود؛ ذخیرهٔ متغیرهای محیطی در پنل باعث استقرار مجدد سرویس می‌شود. نیازی به rebuild ایمیج نیست.

اولویت تنظیمات دستی

مقدار دستی هر متغیر بر مقدار محاسبه‌شدهٔ همان تنظیم اولویت دارد. تنظیمات دستی Apache، PHP-FPM و OPcache حتی با PHP_AUTO_TUNE=0 یا در نبود مقادیر منابع هم اعمال می‌شوند. خاموش کردن Auto Tune فقط محاسبهٔ خودکار را غیرفعال می‌کند.

تنظیم خودکار منابع (Auto Tune)​

Auto Tune تنظیمات Apache، OPcache و، در ایمیج‌های FPM، PHP-FPM را متناسب با CPU و RAM محاسبه می‌کند. این محاسبه فقط زمانی اجرا می‌شود که اطلاعات CPU و RAM اختصاص‌یافته به سرویس در دسترس باشد و PHP_AUTO_TUNE غیرفعال نشده باشد.

متغیرکاربرد و مقدار پیش‌فرض
PHP_AUTO_TUNEفعال یا غیرفعال کردن تنظیم خودکار؛ پیش‌فرض 1، برای غیرفعال کردن 0
PHP_WORKER_MEMORY_MBتخمین RAM مصرفی هر PHP worker بر حسب MiB؛ پیش‌فرض 64
PHP_RUNTIME_RESERVE_MBRAM رزروشده برای سایر پردازش‌ها بر حسب MiB؛ پیش‌فرض بزرگ‌ترِ 48 و ۲۵٪ RAM

واحد GB ده‌دهی با GiB متفاوت است: هر GB برابر با 1,000,000,000 بایت و هر MiB برابر با 1,048,576 بایت است. بنابراین ۰٫۱۵ GB حافظه به معنی ۱۵۰ میلیون بایت، حدود ۱۴۳ MiB، است.

ظرفیت PHP چگونه محاسبه می‌شود؟​

ابتدا RAM رزروشده و حافظهٔ OPcache از RAM کل کم می‌شوند. ظرفیت حافظه از تقسیم RAM باقی‌مانده بر PHP_WORKER_MEMORY_MB و گرد کردن رو به پایین به دست می‌آید. سقف ظرفیت از نظر CPU برابر ceil(CPU × 2) است؛ یعنی حاصل دو برابر CPU به عدد صحیح بزرگ‌تر گرد می‌شود. ظرفیت خودکار از این دو محدودیت محاسبه می‌شود و حداقل یک worker است.

مثلاً با یک هستهٔ CPU و یک GB حافظهٔ RAM، RAM کل حدود ۹۵۴ MiB است. با مقادیر پیش‌فرض، حدود ۲۳۸ MiB برای سایر پردازش‌ها و حدود ۹۵ MiB برای OPcache در نظر گرفته می‌شود؛ RAM باقی‌مانده برای حدود ۹ worker با مصرف تخمینی ۶۴ MiB کافی است. سقف CPU برابر ceil(1 × 2) = 2 است، پس ظرفیت خودکار ۲ worker خواهد بود. این مثال تقریبی است و برای توضیح محدودیت‌هاست.

PHP_WORKER_MEMORY_MB فقط تخمین مصرف واقعی یک worker برای این محاسبه است و مقدار memory_limit در PHP را تغییر نمی‌دهد. اگر هر worker برنامهٔ شما حافظهٔ بیشتری مصرف می‌کند، این تخمین را متناسب با مصرف واقعی تنظیم کنید. حداقل یک worker نیز به معنی تضمین کافی بودن RAM برای اجرای برنامه نیست.

OPcache​

متغیرکاربرد و پیش‌فرض هنگام Auto Tune
PHP_OPCACHE_MEMORY_MBحافظهٔ OPcache بر حسب MiB؛ ۱۰٪ RAM با حداقل 16 و حداکثر 256؛ مقدار دستی حداقل 8
PHP_OPCACHE_INTERNED_STRINGS_MBحافظهٔ رشته‌های اشتراکی بر حسب MiB؛ یک‌هشتم حافظهٔ OPcache با حداقل 1 و حداکثر 16
PHP_OPCACHE_MAX_FILESتعداد فایل‌های قابل کش؛ پیش‌فرض 10000

حافظهٔ رشته‌های اشتراکی باید کمتر از حافظهٔ OPcache باشد؛ هنگام تنظیم دستی هر دو مقدار، این شرط را رعایت کنید.

فایل سفارشی 99-chabok-php.ini بر تنظیمات تولیدشدهٔ OPcache اولویت دارد. اگر تنظیم OPcache از طریق متغیر محیطی نتیجهٔ مورد انتظار را نداشت، وجود مقدار متناظر در این فایل را بررسی کنید.

Apache​

متغیرهای مربوط به پردازش‌های آماده در حالت prefork / mod_php و متغیرهای thread در حالت event / FPM کاربرد دارند. تنظیمات را متناسب با حالت اجرای ایمیج انتخاب کنید.

متغیرکاربرد
APACHE_SERVER_LIMITسقف تعداد پردازش‌های Apache
APACHE_START_SERVERSتعداد پردازش‌های اولیه
APACHE_MAX_REQUEST_WORKERSسقف درخواست‌های هم‌زمان
APACHE_MAX_CONNECTIONS_PER_CHILDتعداد اتصال پیش از بازسازی هر پردازش؛ پیش‌فرض خودکار 500؛ مقدار 0 یعنی نامحدود
APACHE_MIN_SPARE_SERVERSحداقل پردازش‌های آماده در prefork / mod_php
APACHE_MAX_SPARE_SERVERSحداکثر پردازش‌های آماده در prefork / mod_php
APACHE_THREAD_LIMITسقف thread در هر پردازش در event / FPM
APACHE_THREADS_PER_CHILDتعداد thread هر پردازش در event / FPM
APACHE_MIN_SPARE_THREADSحداقل threadهای آماده در event / FPM
APACHE_MAX_SPARE_THREADSحداکثر threadهای آماده در event / FPM

PHP-FPM​

این متغیرها فقط در ایمیج‌های *-fpm اعمال می‌شوند. انتخاب این متغیرها به‌تنهایی حالت اجرای ایمیج را به FPM تغییر نمی‌دهد.

متغیرکاربرد و پیش‌فرض هنگام Auto Tune
PHP_FPM_PMیکی از static، dynamic یا ondemand؛ اگر RAM کمتر از 512 MiB یا CPU کمتر از یک هسته باشد، پیش‌فرض ondemand است؛ در غیر این صورت dynamic
PHP_FPM_MAX_CHILDRENسقف PHP workerها؛ محاسبه از محدودیت CPU و RAM
PHP_FPM_START_SERVERSتعداد workerهای اولیه در حالت dynamic؛ برابر حداقل workerهای آماده
PHP_FPM_MIN_SPARE_SERVERSحداقل workerهای آماده در حالت dynamic؛ کوچک‌ترِ 2 و سقف workerها
PHP_FPM_MAX_SPARE_SERVERSحداکثر workerهای آماده در حالت dynamic؛ دو برابر حداقل workerهای آماده، تا سقف workerها
PHP_FPM_MAX_REQUESTSتعداد درخواست پیش از بازسازی worker؛ پیش‌فرض 500؛ مقدار 0 یعنی نامحدود
PHP_FPM_PROCESS_IDLE_TIMEOUTزمان بیکاری پیش از بستن worker در حالت ondemand، بر حسب ثانیه؛ پیش‌فرض 10

قالب مقادیر​

متغیرهای عددی تنظیمات، عدد صحیح مثبت می‌پذیرند. فقط APACHE_MAX_CONNECTIONS_PER_CHILD و PHP_FPM_MAX_REQUESTS مقدار 0 را هم برای غیرفعال کردن بازیافت پردازش می‌پذیرند. کلید روشن/خاموش PHP_AUTO_TUNE نیز مقدار 0 یا 1 می‌پذیرد. PHP_FPM_PM نیز مقدار متنی یکی از سه حالت جدول را می‌گیرد.

برای متغیرهای حافظه، عدد را بدون پسوند وارد کنید؛ مثلاً PHP_WORKER_MEMORY_MB=96، نه 96M. حداقل حافظهٔ دستی OPcache و شرط کمتر بودن حافظهٔ رشته‌ها را نیز رعایت کنید.

مثال‌های تنظیم​

تنظیم خودکار با تخمین مصرف worker​

در این مثال، تنظیم خودکار روشن است و مصرف هر worker به‌جای مقدار پیش‌فرض ۶۴، برابر ۹۶ MiB تخمین زده می‌شود. Auto Tune برای اجرا همچنان به در دسترس بودن اطلاعات CPU و RAM اختصاص‌یافته به سرویس نیاز دارد.

PHP_AUTO_TUNE=1
PHP_WORKER_MEMORY_MB=96

ترکیب تنظیم خودکار و دستی​

با وجود مقادیر منابع، ظرفیت Apache و FPM به‌صورت خودکار محاسبه می‌شود، اما مقادیر زیر برای OPcache بر محاسبهٔ خودکار اولویت دارند:

PHP_AUTO_TUNE=1
PHP_OPCACHE_MEMORY_MB=64
PHP_OPCACHE_INTERNED_STRINGS_MB=8
PHP_OPCACHE_MAX_FILES=10000

تنظیم دستی PHP-FPM بدون Auto Tune​

نمونهٔ زیر فقط برای ایمیج FPM است. در حالت ondemand، workerها هنگام نیاز ساخته می‌شوند و پس از ۱۰ ثانیه بیکاری بسته می‌شوند. عدد 2 صرفاً نمونه است؛ سقف workerها را متناسب با منابع و مصرف واقعی برنامه انتخاب کنید.

PHP_AUTO_TUNE=0
PHP_FPM_PM=ondemand
PHP_FPM_MAX_CHILDREN=2
PHP_FPM_MAX_REQUESTS=500
PHP_FPM_PROCESS_IDLE_TIMEOUT=10

این مثال فقط تنظیمات FPM را دستی تعیین می‌کند. اگر به تنظیم دستی Apache یا OPcache هم نیاز دارید، متغیرهای همان بخش را جداگانه وارد کنید.