Hướng dẫn too many php-fpm processes - quá nhiều quy trình php-fpm
1. Giới thiệuPHP-FPM có một file cấu hình với đầy đủ các chức năng chung, tuy nhiên nó không thuộc phạm vi đề cập ở đây. Ý tưởng của bài viết này là khám phá các thiết lập cấu hình mặc định và thiết lập đã được tối ưu. Show
Có lý do để nói rằng thiết lập PHP-FPM bên ngoài tài liệu là một điều bí ẩn trừ khi bạn có kinh nghiệm về chủ đề này - đừng sợ, hy vọng bạn sẽ hiểu rõ hơn sau khi đọc bài viết này. Nó cũng đáng chú ý rằng hệ điều hành có thể và sẽ ảnh hưởng đến ứng dụng đang chạy trên nó. Ví dụ Linux, PHP-FPM đang chạy như một domain socket và TCP socket, số kết nối tối đa, mở port, mở file,... 2. Tổng quan về thiết lập PHP-FPM PoolNếu bạn lười biếng và không buồn đọc các comment của file default pool configuration (www.conf), thì điều đó thật xấu hổ cho bạn. Nó giải thích sau mỗi thiết lập. Tuy nhiên vì các comments là theo nghĩa đen, họ không giải thích làm thế nào để thiết lập chúng một cách đúng đắn dựa trên cài đặt của bạn (ví dụ web server, web/db server,...). PHP-FPM – thống kê cơ bảnTrước khi chúng ta bắt đầu mày mò, hãy liệt kê một vài tài liệu hệ thống cơ bản và kiểm tra benchmart để thấy chúng ta đang ở môi trường nào. System
BenchmarkVề benchmark tôi đang sử dụng Siege - bạn có thể tìm ra làm thể nào để cài đặt nó qua website https://www.joedog.org/siege-home Tôi đang chỉ Siege đến một Magento 1.9.3.8 store (với dự liệu demo). Tôi đã vô hiệu hóa tất cả cache của Magento như vậy chúng ta đang làm với xử lý PHP thuần (Opcode cache cũng bị vô hiệu hóa qua 2).Mặc định của www.conf (Với ngoại lệ của việc cho phép status feature):
Lệnh siege của tôi là:
Kết quả Siege:
PHP-FPM status page:Bạn có thể giám sát PHP-FPM child processes bằng việc cho phép PHP-FPM feature. http://php.net/manual/en/install.fpm.configuration.php#pm.status-path Kết quả của trang PHP-FPM status sau khi khởi tạo benchmark:
Nổi bật trong màu đỏ là "max children reached" - Đây là một người chỉ dẫn tuyệt vời cái mà chúng ta đã đạt đến ngưỡng của PHP-FPM child processes để giải quyết với các requets đang đến. "max children reached" đã báo cáo bởi trang PHP-FPM status hoặc trong file log của PHP-FPM:max children reached" - Đây là một người chỉ dẫn tuyệt vời cái mà chúng ta đã đạt đến ngưỡng của PHP-FPM child processes để giải quyết với các requets đang đến. "max children reached" đã báo cáo bởi trang PHP-FPM status hoặc trong file log của PHP-FPM:
Có 2 hướng fix:
PHP-FPM – child processesĐây có thể là giá trị quan trọng nhất để thiết lập. Tại sao ? Bởi vì theo nghĩa đen đây là giá trị lớn nhất của PHP-FPM child proceses sẽ được sinh ra. Tại sao nó quan trọng ? Hãy sử dụng một tín hiệu để giải thích điều này dựa vào kết quả ở trên. Bạn đã từng đến một siêu thị và chỉ có một cửa thanh toán chưa ? Điều gì sẽ xảy ra. Một hàng đợi để thực hiện thanh toán. Giống với những điều xảy ra với PHP-FPM - nếu có nhiều kết nối đến cùng lúc, nó sẽ mất một thời gian dài để xử lý tất cả các request đến. Đây là cái mà PHP-FPM request dường như tương tự với việc bạn có 3;
Mỗi người màu xanh là các request từ NGINX. Ở trên chỉ có một supermarket (PHP-FPM worker), để giao dịch với mỗi request. Thông thường, với FAST PHP script, hàng đợi sẽ được xử lý trước khi bạn có thể nhận thấy.
Tiếp theo, hãy hình dung nhân 5 lần PHP-FPM wokers (child proceses) thay vì 1:
Bên dưới là một view vi mô hơn của requests được xử lý bởi một pool: Và tiếp theo một view bao quát hơn của các request được xử lý bởi nhiều pools: Tính toán giá trị cho pm.max_childrenPhương thức đầu tiên cho việc tính toánHãy giả sử rằng trong file 2, 5 được thiết lập là 128MB và bạn có xấp xỉ 8GB RAM trong hệ thống của bạn.Giả sử bạn giữ lại 512MB cho hệ điều hành và các xử lý khác, còn lại 7.5GB, chúng ta không muốn tất các PHP-prrocesses vượt qua 7.5GB này, thậm chí tệ hơn là gây ra sự hoán đổi. Nếu chúng ta giả thiết ứng dụng PHP/script hay bất cứ cái gì, tiêu thụ tối đa là 128MB, chúng ta muốn chia 7.5GB cho 128MB: 7500MB / 128MB = 58 (Làm tròn)
Phương thức thứ hai cho việc tính toánPhương thức thứ hai liên quan đến một cách tính toán chính xác hơn. Bạn làm được điều này bằng cách phát hiện ra mức tiêu thụ bộ nhớ trung bình cho tất cả các PHP-FPM proceses đang chạy. Chỉ dẫn tốt nhất của tôi là chạy câu lệnh dưới đây trong khi hệ thống đang tải (tức là đang có các request đến website). Bước 1 - Xác định phiên bản của PHP-FPM đang chạy Chạy lệnh sau (với môi trường Ubunntu):
Output trên cho môi trường dev của tôi là php-fpm5.6, nó có thể là php5.6-fpm, php-fpm7.0-fpm ở môi trường của bạn. Vì thế đó là lý do tại sao tôi đã nói chúng ta cần sử dụng câu lệnh trên để xác định điều này. Bước 2- Tính toán mức tiêu thụ bộ nhớ trung bình Chạy lệnh bên dưới đưa cho chúng ta bộ nhớ trung bình được sử dụng trong format mà con người có thể đọc được (MB). Các bạn hãy điều chỉnh phiên bản của php-fpm đúng với phiên bản trên môi trường của bạn:
Output:
Tôi chạy lại câu lệnh trong khi đang test website với Siege để lấy về giá trị thực tế hơn: Output: 0Như vậy dựa vào kết quả ở trên, hãy điền giá trị này đến công thức tính toán cho pm.max_children:pm.max_children: 7500MB / 60MB = 125 (gần bằng) Cấu hình mới của PHP-FPM của tôi sẽ trông như thế này: 1pm.min_spare_servers và pm.max_spare_serversVì hiện tại chúng ta đã thiết lập process manager để sinh ra child workers động 2Chúng ta cần tính toán pm.min_spare_servers và pm.max_spare_servers. Có một chút thông tin trong tài liệu chính thức về những config này http://php.net/manual/en/install.fpm.configuration.php#pm.min-spare-servers. Chúng ta có thể quan sát các giá trị hiện tại và làm một vài giả định dựa trên các giá trị mặc địnhpm.min_spare_servers và pm.max_spare_servers. Có một chút thông tin trong tài liệu chính thức về những config này http://php.net/manual/en/install.fpm.configuration.php#pm.min-spare-servers. Chúng ta có thể quan sát các giá trị hiện tại và làm một vài giả định dựa trên các giá trị mặc định 3Chúng ta biết rằng pm.max_children là số tối đa của chill processes. Như vậy hãy coi đây là 100%. Chúng ta thử tính toán bao nhiêu phần trăm các giá trị khác dựa trên pm.max_children:pm.max_children là số tối đa của chill processes. Như vậy hãy coi đây là 100%. Chúng ta thử tính toán bao nhiêu phần trăm các giá trị khác dựa trên pm.max_children: pm.min_spare_serversMô tả cho config này có trong file 6
4(1 / 5) * 100 = 20% Theo đó, chúng ta nên thiết lập pm.min_spare_servers = 20% của pm.max_childrenpm.min_spare_servers = 20% của pm.max_children pm.max_spare_serversMô tả cho config này có trong file 6
5Theo đó, chúng ta nên thiết lập pm.min_spare_servers = 20% của pm.max_children ; pm.max_spare_servers – the maximum number of children in ‘idle’pm.max_spare_servers = 60% của pm.max_children pm.start_servers
; number then some children will be killed.pm.start_servers. Dựa trên các comment trong file 6, nó có một số chỉ dẫn làm thế nào để thiết lập giá trị này
Bây giờ chúng ta đã có spare min và max children, chúng ta có thể quan sát pm.start_servers. Dựa trên các comment trong file Transactions: 553 hits Availability: 100.00 % Elapsed time: 59.92 secs Data transferred: 21.73 MB Response time: 5.16 secs Transaction rate: 9.23 trans/sec Throughput: 0.36 MB/sec Concurrency: 47.59 Successful transactions: 553 Failed transactions: 0 Longest transaction: 6.65 Shortest transaction: 0.30 6, nó có một số chỉ dẫn làm thế nào để thiết lập giá trị này; The number of child processes created on startup.pm.max_children = 125, chúng ta có thể sử dụng giá trị này trong việc tính toán. ; Note: Used only when pm is set to ‘dynamic’ = 20% của pm.max_children (20 / 100) * 125 = 25 ; Default Value: min_spare_servers + (max_spare_servers – min_spare_servers) / 2 = 60% của pm.max_children (60 / 100) * 125 = 75 Để tất cả chúng cùng với nhau = min_spare_servers + (max_spare_servers – min_spare_servers) / 2 25 + (75 – 25) / 2 = 37 (làm tròn)
6
7pm.max_spare_servers = 60% của pm.max_children (60 / 100) * 125 = 75pm.start_servers = min_spare_servers + (max_spare_servers – min_spare_servers) / 2 25 + (75 – 25) / 2 = 37 (làm tròn) 8Config sau khi cập nhật: 9Ouput của status page sau khi cập nhật 0Kiểm tra giá trị mới của chúng ta
3. Các loại PHP-FPM managementPHP-FPM thiết lập mặc định process management là dynamic. Có 2 kiểu khác: status và ondemand. Mỗi cái có ưu điểm riêng phụ thuộc vào server của bạn và tài nguyên của nó. Đoạn bên dưới là mô tả trong file config:dynamic. Có 2 kiểu khác: status và ondemand. Mỗi cái có ưu điểm riêng phụ thuộc vào server của bạn và tài nguyên của nó. Đoạn bên dưới là mô tả trong file config:
Tôi đã làm một số testing để kiểm tra những khác biệt này trong một môi trường làm việc. Tôi sửu dụng câu lệnh dưới đây để tính toán bộ nhớ khởi tạo khi khởi động lại PHP-FPM và sau khi thực hiện benchmark: 1Kết quả như bảng sau:
4. Thảo luậnSuy nghĩ cuối cùng của tôi là nó đáng để điều chỉnh các cài đặt PHP-FPM hoặc ít nhất là dành một chút thời gian để hiểu các nút thắt nằm ở đâu và nơi bạn có thể siết chặt mọi hiệu suất với cấu hình PHP-FPM của mình. Để tìm hiểu xem nên sử dụng danymic, static hay ondemand, chỉ cần xem kỹ thiết lập máy chủ của bạn và những gì nó làm.danymic, static hay ondemand, chỉ cần xem kỹ thiết lập máy chủ của bạn và những gì nó làm.
Bài viết được lược dịch từ nguồn: PHP-FPM – process management: PHP-FPM – process management |