Nginx + php-fpm - Mỗi php-fpm xử lý 70-100% cpu khi chạy


8

Tôi có một tình huống trong đó xảy ra sau đây:

  • Chúng tôi đang sử dụng linode với 8 lõi, 8gb ram, 2,6 ghz - sử dụng nginx + php-fpm - chúng tôi đang nhận được các biểu đồ sử dụng cpu cực kỳ cao (mà chúng tôi không muốn trở thành một người hàng xóm tồi tệ như vậy) ...

  • Chúng tôi có khoảng dưới 100 người dùng trên trang web cùng một lúc - vì vậy tình huống này cũng vô cùng xấu hổ - rằng việc sử dụng cpu của chúng tôi rất cao.

  • Chúng tôi đang sử dụng một Framework rất khủng khiếp, có thể là cpu, rất kinh khủng, thay vì các khung công tác nổi tiếng, tài liệu tốt, được chế tạo tốt như wordpress hoặc drupal, trong đó có RẤT NHIỀU tài liệu về bộ nhớ đệm (cũng như các plugin xử lý bộ nhớ đệm) php trên nền tảng nginx + php_fpm.

  • Do đó, chúng tôi có khoảng 6 quy trình php-fpm mở mà khi CHẠY, hãy tiêu thụ số lượng Lpu riêng lẻ (30+ và thường gần 99%) - và tôi thực sự không biết làm thế nào để ngăn chặn chúng sử dụng quá nhiều cpu . Tôi không thể biết tập lệnh php nào đang gây ra các đột biến này bởi vì chúng xảy ra mọi lúc ... thường chỉ có 1 hoặc 2 đang chạy - nhưng khi cả 6 chạy, chúng tôi sẽ tối đa hóa tất cả 8 cpus.

  • Tệp pool.d / www.conf của tôi có các cài đặt sau:

    pm = dynamic
    pm.max_children = 10
    pm.start_servers = 4
    pm.min_spare_servers = 2
    pm.max_spare_servers = 6
    
  • Chúng tôi đã thực hiện cài đặt này bởi vì, theo cách mà tôi diễn giải nó, bộ nhớ của chúng tôi thực sự tuyệt vời (htop hiển thị 472/7000 + mb được sử dụng, không trao đổi, v.v.) và chúng tôi có thể xử lý nhiều quy trình hơn và phá vỡ dòng chờ đợi để có được đã xử lý - NHƯNG không may, vì mỗi quy trình quá mãnh liệt trên cpu của chúng tôi khi chạy - chúng tôi cuối cùng điều khiển CPU của chúng tôi qua mái nhà - vì vậy chúng tôi không thể xử lý đủ các quy trình.

  • Câu hỏi - chúng ta có thể làm gì để giảm quá trình sử dụng cpu php-fpm để chúng ta có thể tăng cài đặt trong tệp conf pool đó cho php-fpm - và cũng có, /var/log/php5-fpm.log đang la hét chúng tôi để tăng con cái của chúng tôi và điều chỉnh / tăng máy chủ tối thiểu / tối đa / bắt đầu của chúng tôi. Nhưng làm như vậy làm cho tải trung bình của chúng tôi điên như đã nêu trước đây. Làm thế nào chúng ta có thể làm như vậy mà không nhất thiết phải sử dụng bộ đệm hoặc các tùy chọn của chúng ta là gì?

  • Ý kiến ​​của tôi? Tôi đã đọc những điều về việc sử dụng cpulimit để đảm bảo không có quá trình nào mất nhiều hơn một lượng cpu được phân bổ - nhưng điều đó có làm chậm mọi thứ không thể sử dụng được không? Hoặc khi làm như vậy, chúng tôi có thể tăng khả năng chạy nhiều hơn một vài quy trình - Tôi cũng nghĩ rằng việc chạy hai nhóm - một cho trang web hướng về phía trước của chúng tôi (những gì khách hàng trải nghiệm) và một cho phần phụ trợ (ảnh hưởng đến trang web hướng về phía trước của chúng tôi khi thời gian báo cáo -consuming đang được chạy).

  • Tôi đã dành vài ngày để nghiên cứu, tìm hiểu, v.v. về chủ đề này - và thật khó khăn vì tình hình của mọi người rất độc đáo đối với hệ thống của họ - rắc rối là ở một khuôn khổ cụ thể chưa từng được viết, có thể được viết kém - đang gây ra thật khó để tìm ra giải pháp. Chúng ta cũng không thể loại bỏ khung này - tôi phải tìm một giải pháp nào đó.


CẬP NHẬT: Tôi đã triển khai memcache để lưu trữ các phiên php - vì khung này phụ thuộc rất nhiều vào các phiên của người dùng và bản chất của hệ thống của chúng tôi là nhân viên thường sử dụng nhiều tab mỗi lần - mỗi lần kiểm tra lại các phiên để xác nhận khả năng / dữ liệu người dùng / v.v. ... vì vậy tôi hy vọng sẽ thấy hiệu suất tăng lên từ điều này - hoan nghênh nhận xét về điều đó nếu bạn thích - Tôi sẽ thấy nó diễn ra như thế nào vào ngày mai khi chúng ta vượt qua thời gian cao điểm âm lượng cao hơn.


Nginx không tốt lắm cho một ứng dụng web chuyên sâu về cpu - nhưng cpu cao của chúng tôi rất tệ - thực sự rất tệ - và chúng tôi đang cố gắng khắc phục nó. Không có thiết lập máy khách tối đa tuyệt vời nào vì nó NÊN có thể hỗ trợ một số lượng khách hàng kha khá - nhưng mức sử dụng cpu cao cho mỗi quy trình làm lệch khả năng đó. Chúng tôi đã chuyển sang apache chỉ vì nó làm LITTLE tốt hơn với mức sử dụng cpu cao - nhưng cuối cùng vấn đề này chỉ ra nhiều vấn đề về ứng dụng web và có thể mất một thời gian để giải quyết nhưng không có thời gian như hiện tại để bắt đầu khắc phục.
amurrell

Khi bạn đi đến bác sĩ, và anh ấy bảo bạn uống một số thuốc nhất định - bởi vì anh ấy biết bạn sẽ không nghe câu "ngừng uống soda và ăn đồ ăn nhanh" - đây chính xác là lý do tại sao không có câu trả lời tuyệt vời nào cho tôi - bởi vì sự thật là , không có thiết lập hoặc sửa chữa nhanh thực sự được áp dụng - chỉ có một sự thật đáng buồn là chúng ta phải thay đổi đáng kể chính ứng dụng web của mình.
amurrell

May mắn thay, nếu bạn gặp vấn đề này với một khung công tác phổ biến, bạn có thể có tùy chọn tận dụng bộ nhớ đệm và tài liệu phong phú về nó - nhưng chúng tôi có một số điều ngẫu nhiên tối nghĩa mà chúng tôi không thể thay đổi ngoại trừ chính khung đó. Yay!
amurrell

1
Vì vậy, từ những gì tôi hiểu về nó, opcache đang lưu trữ mã PHP của bạn dưới dạng nhị phân và có thể được sử dụng bởi php-fpm nhanh hơn nhiều (bộ nhớ đệm) nhưng bạn cũng nên sử dụng bộ đệm ẩn đối tượng .. một ví dụ đang lưu trữ toàn bộ đầu ra trang dưới dạng "đối tượng "Trong một cái gì đó như memcached. Điều này thực sự sẽ lưu trữ đầu ra trang (hoặc những thứ khác bạn muốn như các phiên php, v.v.) ... Tiếp theo, bạn cũng có thể sử dụng véc ni là proxy ngược - nhưng về cơ bản, đó là một người trung gian giữa yêu cầu và máy chủ của bạn để bạn máy chủ không bị tấn công trực tiếp với các yêu cầu - và nó hoạt động từ bộ nhớ để phục vụ các url được lưu trong bộ nhớ cache.
amurrell

1
Varnish là tuyệt vời cho việc này - lưu trữ một bản sao được lưu trong bộ nhớ cache của những gì nó nhận được từ máy chủ trong bộ nhớ - vì vậy véc ni mất nhiều tải. Chủ nhân hiện tại của tôi là trên nginx và chúng tôi sử dụng véc ni và memcached. May mắn là khung hiện tại chúng ta có cơ chế bộ đệm riêng để xác định bộ đệm trang (dữ liệu trang đã xuất). Ở công việc cuối cùng của tôi, tôi đã phải tự viết nó vào khung - nó không vui, nhưng đã hoạt động. Tôi không quay lại, trừ khi bạn không có thời gian để sửa nginx .. Tôi ghét phải quay lại nhưng đó là giải pháp duy nhất để không hoàn toàn giết chết dự án của chúng tôi trong khi tôi viết cơ chế lưu trữ.
amurrell

Câu trả lời:


6

Một vài điều cần xem xét (xin lỗi trước nếu bạn đã xem xét những điều này): Trước hết, hãy đảm bảo tối ưu hóa cấu hình nginx của bạn và chỉ gọi php-fpm khi thật cần thiết. Điều cuối cùng bạn muốn làm là để php xử lý những thứ như các trang HTML tĩnh (điều mà nó sẽ vui vẻ làm).

Thứ hai, vì bạn đang sử dụng php-fpm, tôi khuyên bạn nên tích cực hơn với thời gian trẻ em của php-fpm được phép sống. Bạn cần tìm ra điểm ngọt ngào giữa những chủ đề / trẻ em sống ngắn và sự ổn định. Mặc định php-fpm là quá hào phóng cho bất kỳ hệ thống sản xuất nào, IMHO. Một công nhân càng lâu được phép phục vụ các yêu cầu, nó sẽ càng không ổn định. Cũng có nguy cơ rò rỉ bộ nhớ cao hơn và nếu khung này mà bạn đề cập có lỗi như các vòng lặp vô hạn, điều này có thể khiến bạn đau buồn với tải CPU, thì điều này không nên làm tổn thương.

Tôi sẽ giảm số lượng cho nhóm pm.max_requestssản xuất của bạn. Tôi nghĩ mặc định là 200. Tôi sẽ bắt đầu từ 50 và xem nơi sẽ đưa bạn đến.

Không / bổ sung cho điều đó, bạn cũng có thể thử các tùy chọn toàn cầu này (AFAIK tất cả chúng đều bị tắt theo mặc định):

emergency_restart_threshold 3
emergency_restart_interval 1m
process_control_timeout 5s

Điều đó có nghĩa là gì? Nếu 3 con PHP-FPM xử lý thoát với SIGSEGV hoặc SIGBUS (tức là sự cố) trong vòng 1 phút thì PHP-FPM có nghĩa vụ tự động khởi động lại. Đứa trẻ xử lý chờ 5s cho phản ứng về tín hiệu từ chủ.

Đây là một tổng quan đẹp về tất cả các tùy chọn cấu hình mà tôi đã đề cập ở đây, cũng như các tùy chọn khác: http://myjeeva.com/php-fpm-configuration-101.html

Hy vọng những lời khuyên này sẽ giúp bạn! Hãy nhớ điều chỉnh và quan sát, thật không may, dường như không có quy tắc nào cho tất cả điều này, như bạn đã quan sát, có quá nhiều biến số ảnh hưởng đến hành vi và sự ổn định của PHP.

Cuối cùng, cơ sở giới hạn CPU mà bạn thắc mắc được ghi lại ở đây , nhưng tôi chỉ sử dụng nó nếu bạn sử dụng hết mọi tùy chọn khác. Nếu bạn chọn đường dẫn này, tôi chắc chắn sẽ đề phòng các tương tác có thể có giữa các chỉnh sửa PHP-FPM và cấu hình giới hạn của bạn. Tại thời điểm đó, v.v ... có thể là cứu cánh! :)

Chúc may mắn!

Rouben


Tôi sẽ cố gắng hạn chế các thông số tối đa vào ngày mai - Có vẻ như mỗi quy trình chúng tôi cho phép muốn ăn hết cpu nên đây có thể là một ý tưởng hay. Chúng tôi đang sử dụng ngưỡng khởi động lại khẩn cấp, nhưng số của tôi cao hơn một chút - Tôi sẽ thử của bạn và xem mọi thứ diễn ra như thế nào. Cảm ơn sự kỹ lưỡng của bạn - rất đánh giá cao. Bạn có muốn biết suy nghĩ của bạn về bộ nhớ đệm? Tôi tự hỏi nếu sử dụng bộ nhớ đệm php có nghĩa là khung công tác sẽ phải được tùy chỉnh để xử lý nó. Tôi khá mới với khái niệm đó.
amurrell

3

Bạn đang chạy bộ nhớ đệm opcode, phải không?

Nó từng là APC đã từng xuất hiện ở đây, nhưng nó đã từng là một lỗi trong một thời gian dài và đã được thay thế bởi Zend Opcache , hiện là một phần của PHP từ 5.5 và có một backport trong PECL cho 5.3 và 5.4.


Tôi quan tâm đến Zend OpCache này - Chúng tôi đang ở trên 5.3 - Nếu bạn có thể mở rộng câu trả lời này, tôi thực sự đánh giá cao nó!
amurrell

Chúng tôi đã có xcache - nhưng bây giờ tôi đã chọn Zend Opcache và tôi đã cài đặt nó và xác nhận rằng nó đã hoạt động và chạy trong phpinfo (). Tôi sẽ cho bạn biết nếu hiệu suất của chúng tôi tốt hơn do kết quả vượt qua các ngón tay
amurrell 17/214

Bây giờ tôi phải vô hiệu hóa zend opcache - mọi thứ đều hoạt động ngoại trừ bất kỳ tệp css hoặc js nào do php tạo. Tôi đã cố gắng đưa vào danh sách đen các tệp đó từ opcache - nhưng danh sách đen đó không hoạt động hoặc tôi không thể biết tại sao opcache lại khiến nginx nhận được 502 lỗi cổng xấu cho CHỈ các tệp đó. Mà tôi cần chúng cho mẫu và chúng là một phần của khung xấu. Trong nhật ký nginx tôi đã nhận được hàng tấn readv - lỗi kết nối ngang hàng 104.
amurrell
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.