Máy tính Php-fpm

Bạn đã bao giờ tự hỏi làm thế nào bạn có thể điều chỉnh cấu hình máy chủ của mình để tận dụng tối đa số tiền bạn đang trả chưa?

từ chối trách nhiệm. Điều này không có nghĩa đó là thiết lập máy chủ hoàn hảo, nhưng đó là một khởi đầu tốt. Mỗi yêu cầu là duy nhất và hiểu cách thức hoạt động của nó luôn là bước đầu tiên. Có tài liệu tốt dưới dạng một bài đăng trên blog giúp chúng tôi tiết kiệm rất nhiều thời gian và công sức, vì vậy chúng tôi cũng muốn chia sẻ kinh nghiệm của mình

Tại Promet, chúng tôi sử dụng nginx và php-fpm cho máy chủ của mình. Một lợi ích tốt của việc này so với việc sử dụng mod_php cũ tốt từ apache là nginx có thể hoạt động như một proxy và sẽ phục vụ trực tiếp các tệp tĩnh, chỉ những tệp có phần mở rộng php mới được chuyển đến fpm-php

Tối ưu hóa php-fpm ban đầu rất phức tạp nhưng một khi bạn hiểu cách thức hoạt động của nó thì nó sẽ dễ dàng hơn bạn nghĩ một chút. Chúng tôi đang sử dụng hệ thống cơ sở debian nên vị trí mặc định của tệp cấu hình là /etc/php5/fpm/pool. d/www. conf

Lựa chọn chiến lược tốt nhất

Có ba chiến lược về cách php-fpm phân bổ bộ nhớ. tĩnh, động và theo yêu cầu

  1. Tĩnh - một số cố định của quy trình bạn yêu cầu phân bổ
  2. Động - phân bổ một lượng quy trình cố định nhưng sẽ tự động tăng lên khi tải của bạn tăng lên
  3. Theo yêu cầu - sẽ không có gì bắt đầu miễn là không có yêu cầu nào được phục vụ

Lúc đầu, việc chọn loại chiến lược nào sẽ khá khó hiểu, nhưng trong số ba loại chiến lược, bạn nên luôn sử dụng Động và theo yêu cầu. Điều này cho phép bạn phân bổ bộ nhớ động cho máy chủ web của mình để quản lý hiệu quả tài nguyên máy chủ của bạn

Chúng tôi sẽ sử dụng chiến lược theo yêu cầu, về cơ bản có nghĩa là nó sẽ bắt đầu hoặc kết thúc quy trình mới dựa trên nhu cầu. Ưu điểm của việc này là sự đơn giản vì bạn chỉ cần xác định một cài đặt, “max_children,” và bạn có thể để mọi thứ khác như mặc định

Hãy lấy thông số máy chủ sau đây làm ví dụ

Hiện tại, chúng tôi sẽ sử dụng các giá trị mặc định của các gói. Chúng tôi sẽ tính toán cài đặt tối ưu dựa trên việc sử dụng quy trình. Vì vậy, trước tiên bạn cần có một số lưu lượng truy cập

Xác định bộ nhớ cho mỗi tiến trình con

Chúng ta cần xác định dung lượng bộ nhớ mà mỗi tiến trình con của php-fpm đang sử dụng để tính giá trị cuối cùng. Tôi sử dụng tập lệnh có tên ps_mem để nhận một số thống kê về quy trình và bộ nhớ của mình

  • # Tải xuống tập lệnh trước
  • quên http. //git. io/joLG
  • # và chạy nó như thế này
  • trăn ps_mem. py. grep php5
  • đầu ra sẽ cung cấp cho bạn một cái gì đó như thế này
    • 1. 8 GiB + 145. 5 MiB =   1. 9 GiB    php5-fpm (41)

Điều này có nghĩa là php-fpm đang sử dụng tổng cộng 1. 9 GiB với 41 quy trình. Sau khi chuyển đổi giá trị tính bằng Megabyte, chúng tôi sẽ chia nó cho số lượng quy trình. Điều này sẽ cho chúng ta biết. Mỗi tiến trình con (41) đang tiêu thụ bao nhiêu

  • 1900 MiB/41 Quy trình = 46. 34 MiB
  • 48. Bộ nhớ 59MB/Quy trình
  • Bây giờ chúng ta có thể tính toán số lượng quy trình mà php-fpm có thể tính toán thông qua công thức đơn giản này
  • max_children = (Tổng số bộ nhớ - 1000MB) / Bộ nhớ FPM trên mỗi tiến trình
  • Chúng tôi dành 1000 MB cho quy trình khác như mysql, nginx, v.v.
  • max_children = (4000 MB - 1000 MB)/48. 59
  • max_con = 62. 5

Bây giờ bạn có thể đặt chiều. max_children để có tối đa 62. 5

Phần kết luận

Và thế là xong nhé mọi người. Tôi hy vọng điều này đã được cung cấp thông tin cho bạn cũng như cho chúng tôi.  

Như mọi khi, chúng tôi muốn nghe bất kỳ lời chỉ trích mang tính xây dựng nào và điều này sẽ giúp ích cho mọi người như thế nào, vui lòng liên hệ với chúng tôi nếu bạn nghĩ rằng điều gì đó có thể được cải thiện

Tôi đã phải xử lý lượng truy cập cao trong sự nghiệp của mình và tôi đã chiến đấu với thời gian ngừng hoạt động, trí nhớ không được sử dụng và rất nhiều rắc rối trong quá khứ của mình. Trong bài viết này, tôi muốn đưa ra hướng dẫn từng bước về cài đặt hiệu suất apache2, đây là kết quả tập trung của rất nhiều lần đọc và thử

môi trường của tôi

  • AWS EC2 (m4. xlarge). 4*2,4GHz. RAM 16GB
  • Ubuntu 16. 04
  • Apache 2. 4 sử dụng mpm_event (Xem điều gì là tốt nhất cho bạn, Cách chuyển đổi)
  • PHP FPM (5. 6, 7. 1)
Tính toán trước mức sử dụng bộ nhớ trung bình và maxclient/max-con

1. Tính toán kích thước quy trình

Bạn cần biết có bao nhiêu quy trình có thể chạy trên máy của mình. Vì vậy, tính toán kích thước quy trình của trình điều khiển CPU/bộ nhớ chính của bạn là cần thiết

Có một số phương pháp tính toán ngoài kia. Cá nhân tôi thích tập lệnh python này vì nó tính đến bộ nhớ dùng chung và sẽ cung cấp thông tin chi tiết về việc sử dụng bộ nhớ thực

cd ~
wget https://raw.githubusercontent.com/pixelb/ps_mem/master/ps_mem.py
chmod a+x ps_mem.py
sudo python ps_mem.py

ps_mem. py sẽ tạo ra đầu ra như thế này

Ở đây bạn có thể thấy rằng có 30 quy trình apache2, tiêu thụ tổng cộng 139MiB, vì vậy mỗi quy trình Apache đang sử dụng khoảng 5MiB RAM. php-fpm5. 6 quá trình sẽ sử dụng khoảng 50MiB

2. Tính MaxRequestWorkers của apache

Tuy nhiên, để an toàn, tôi sẽ dành 15% bộ nhớ cho tất cả các quy trình khác (trong trường hợp của tôi là ~2,4GiB) và làm tròn kích thước quy trình apache lên 5MiB

MaxRequestWorkers = (Total RAM - Memory used for Linux, DB, etc.) / process size
MaxRequestWorkers = (16384MB - 2400MB) / 5MB = 2800

3. Tính con số tối đa php-fpm

Tuy nhiên, để an toàn, tôi sẽ dự trữ 1 GiB cho tất cả các quy trình khác và làm tròn kích thước quy trình php lên 55MiB

maxclients = (Total RAM - Memory used for Linux, DB, etc.) / process size
maxclients = (16384MB - 2400MB) / 55MB = 256

Đồng nghiệp của tôi Thomas Herweg đã chuẩn bị Bảng Excel này để tính toán. https. //s3. quả hồ trăn. io/tải xuống/apache_performance. xlsx

Thiết lập chi tiết

Trong tệp /etc/apache2/mods-enabled/mpm-event.conf hoặc

MaxRequestWorkers = (Total RAM - Memory used for Linux, DB, etc.) / process size
MaxRequestWorkers = (16384MB - 2400MB) / 5MB = 2800
0


ServerLimit (Total RAM - Memory used for Linux, DB, etc.) / process size
StartServers (Number of Cores)
MinSpareThreads 25
MaxSpareThreads 75
ThreadLimit 64
ThreadsPerChild 25
MaxRequestWorkers (Total RAM - Memory used for Linux, DB, etc.) / process size
MaxConnectionsPerChild 1000

Lưu ý rằng cài đặt mặc định không chứa “Giới hạn máy chủ”, vì vậy tôi đã thêm nó vào đây

Trong

MaxRequestWorkers = (Total RAM - Memory used for Linux, DB, etc.) / process size
MaxRequestWorkers = (16384MB - 2400MB) / 5MB = 2800
1 thay đổi các cài đặt sau

pm = dynamic            
pm.max_children (total RAM - (DB etc) / process size)
pm.start_servers (cpu cores * 4)
pm.min_spare_servers (cpu cores * 2)
pm.max_spare_servers (cpu cores * 4)
pm.max_requests 1000

Để tìm hiểu về tất cả các cài đặt php-fpm, tôi khuyên bạn nên xem video trên trang đó. https. //máy chủ cho tin tặc. com/c/php-fpm-quy trình-quản lý

Cài đặt cuối cùng của tôi

Máy chủ của tôi có 16GB RAM và 4 CPU à 2,4GHz. Quy trình apache trung bình của tôi có 5 MB, quy trình PHP trung bình chiếm 55 MB

MaxRequestWorkers = (Total RAM - Memory used for Linux, DB, etc.) / process size
MaxRequestWorkers = (16384MB - 2400MB) / 5MB = 2800
2

________số 8_______

MaxRequestWorkers = (Total RAM - Memory used for Linux, DB, etc.) / process size
MaxRequestWorkers = (16384MB - 2400MB) / 5MB = 2800
1

; Optimized for php-fpm request size of 55MB on AWS EC2 m4.xlarge (4CPU cores, 16GB RAM)
pm = dynamic
pm.max_children = 256
pm.start_servers = 20
pm.min_spare_servers = 10
pm.max_spare_servers = 20
pm.max_requests = 1000

Lưu cài đặt của bạn và khởi động lại quy trình apache và php-fpm của bạn

sudo service apache2 restart
sudo service php7.1-fpm restart

Kiểm tra cài đặt của bạn

Để kiểm tra cài đặt máy chủ của bạn, bạn có thể chạy thử nghiệm Apache Bench và xem máy chủ của bạn hoạt động như thế nào trong

MaxRequestWorkers = (Total RAM - Memory used for Linux, DB, etc.) / process size
MaxRequestWorkers = (16384MB - 2400MB) / 5MB = 2800
4

Mở 2 terminal và lệnh sau để kiểm tra 5000 yêu cầu với đồng thời 100 yêu cầu song song

ab -n 5000 -c 100

Kiểm tra tải bằng băng ghế apache

Cải thiện quy trình mô phỏng (do zzzplayer đề xuất)

Một gợi ý mà tôi có thể đưa ra là cũng yêu cầu người đọc chạy “ps_mem” trước và *nhanh chóng sau* băng ghế dự bị Apache mô phỏng (*nhanh chóng sau* vì quy trình sẽ loại bỏ các tiến trình con nhàn rỗi). Điều này sẽ hiển thị số tiến trình con chính xác trước và sau khối lượng công việc được mô phỏng cho cả Apache và PHP-FPM

“htop” không hiển thị số tiến trình con chính xác như vậy từ cả Apache và PHP-FPM

Chạy cả “ps_mem” và “htop” đều ổn, nhưng runnig “ps_mem” quan trọng hơn vì mục đích của bài viết là đảm bảo các tiến trình con của cả Apache và PHP-FPM tăng lên khi khối lượng công việc tăng lên

Tôi hi vọng cái này giúp được. Gửi cho tôi một dòng, khi bạn có kinh nghiệm khác hoặc nghĩ rằng tôi có thể cải thiện công thức/tính toán của mình. Tôi cũng có thể tạo một giao diện web đơn giản để tính toán các cài đặt… Nhưng bây giờ tôi phải quay lại làm việc ;-)