Điểm:0

PHP5 đến PHP7 tăng mức sử dụng bộ nhớ bất ngờ bên trong vùng chứa

lá cờ ug

Tuần trước, chúng tôi đã cập nhật một số trang wordpress đang chạy Alpine Linux dưới dạng vùng chứa bên trong máy chủ lưu trữ (Ubuntu 20.04) thông qua LXD.

Tóm tắt về bản cập nhật như sau:

Alpine Linux v3.8 -> 3.14
PHP 5.3.6 -> 7.4.24
Wordpress 5.0.3 -> 5.7.3

Vấn đề

Chúng tôi bắt đầu gặp sự cố với hiệu suất của máy chủ sau các bản cập nhật đó và chúng tôi phát hiện ra rằng các bộ chứa được cập nhật đang sử dụng bộ nhớ (bộ nhớ thường trú) gấp 3 lần trở lên so với các bộ chứa cũ hơn (khoảng 150 MB so với 50 MB), điều này khiến máy chủ bắt đầu hoán đổi thường xuyên hơn.

Trong các phiên bản cũ hơn (sử dụng PHP 5.3), bộ nhớ được sử dụng bởi php (tiến trình) tăng lên khi trang đang được xử lý (như mong đợi), nhưng ngay sau khi xử lý xong, nó sẽ trở lại bình thường. Nói cách khác, một cái gì đó như: 10MB ---> 95MB ---> 10MB.

Trong các vùng chứa được cập nhật, bộ nhớ được sử dụng bởi php tăng theo cùng một cách, nhưng nó không trở lại "bình thường": 10MB ---> 95MB ---> 95MB. Và mỗi khi một quy trình mới được sử dụng, điều tương tự cũng xảy ra, làm tăng mức sử dụng bộ nhớ theo số lượng quy trình con khả dụng (trong trường hợp này là 4 quy trình trên mỗi trang).

Những gì tôi đã thử

  • Hạ cấp phiên bản PHP xuống 7.2.x7.3.x : điều tương tự
  • Đã cập nhật thành php 8.0.11 : vấn đề tương tự
  • sử dụng apache2 thay vì lighttpd (hiện tại php đang chạy dưới dạng fcgi): hành vi tương tự
  • Chỉ cập nhật Alpine và PHP để xác định xem Wordpress có thể là nguyên nhân hay không: wordpress không phải là nguyên nhân
  • Chạy wordpress mà không cần plugin (để biết liệu một số plugin có thể gây ra sự cố hay không): không thay đổi
  • Đã thực hiện một vòng lặp nối đơn giản (thuần php): điều tương tự
  • Đã thử nghiệm trong một máy chủ khác với một trang wordpress khác: hành vi tương tự

Lý do nó không khôi phục được bộ nhớ là gì? Làm thế nào nó có thể được cố định?

Cập nhật

  • tôi thiết lập một sạch sẽ Anpơ 3.14 container và thực hiện kiểm tra "vòng lặp đơn giản". Trong trường hợp đó, bộ nhớ cư trú đã giảm như mong đợi. Tuy nhiên, khi tôi đã thử nghiệm với một trang web wordpress thực tế, sự cố vẫn tiếp diễn.
  • tôi thiết lập một sạch sẽ Ubuntu 20.04 container và thực hiện các thử nghiệm tương tự. Kết quả giống như với sạch Anpơ 3.14.
lá cờ lr
Bản sao: https://stackoverflow.com/questions/39740398/i-am-faces-more-memory-consumption-in-php-7-compare-to-php-5-6
lepe avatar
lá cờ ug
@BarnabasBusa xin lỗi, tôi không nghĩ điều đó liên quan đến vấn đề của mình. Khi thử nghiệm với một tập lệnh PHP đơn giản (nối chuỗi với một vòng lặp), thực tế PHP7 chiếm ít bộ nhớ hơn khi bắt đầu và trong khi chạy thử nghiệm đơn giản. Vấn đề là nó không phục hồi bộ nhớ sau khi sử dụng. Tôi cũng nghi ngờ nó có thể liên quan đến một số loại bộ đệm (vì opcache được bật theo mặc định trong PHP7) nhưng mô-đun opcache thậm chí chưa được cài đặt và tôi cũng đã thử tắt nó trong cài đặt.
lepe avatar
lá cờ ug
Báo cáo lỗi: https://bugs.php.net/bug.php?id=81536 và liên quan: https://bugs.php.net/bug.php?id=80108
Điểm:0
lá cờ ug

Dựa theo báo cáo lỗi này nó không thực sự là một lỗi, mà là một tính năng trong PHP7+ dưới Quản lý bộ nhớ Zend Engine:

[email protected] : Đây là hành vi dự kiến. Khi tắt máy theo yêu cầu, Zend trình quản lý bộ nhớ không giải phóng tất cả các khối được phân bổ, mà giữ lại some[1] để tránh phải phân bổ lại chúng có thể cho lần tiếp theo yêu cầu.

Giải pháp được đề xuất là gọi: gc_mem_caches(). Bạn có thể dùng auto_prepend_fileauto_append_file chỉ thị trong php.ini để thực thi nó luôn nếu cần.

Tuy nhiên, giải pháp đó không giúp được gì trong tình huống của tôi, vì vậy không có gì đảm bảo rằng nó sẽ hoạt động.

Vì không có cách nào dễ dàng để thay đổi hành vi đó vào thời điểm hiện tại, tôi đã tìm ra một cách khác để giải quyết vấn đề về bộ nhớ (cách này sẽ hoạt động với PHP7, PHP8):

  1. Thay vì sử dụng php-cgi, sử dụng php-fpm
  2. Thiết lập cấu hình FPM để sử dụng ít tiến trình con nhất, nhưng hãy để nó tạo con nếu cần, đối với điều này, bạn có thể sử dụng theo yêu cầu chế độ hoặc năng động:

/etc/php7/php-fpm.d/www.conf :

chiều = theo yêu cầu
; Điều chỉnh khi cần thiết:
pm.max_children = 10

hoặc:

chiều = động
; Điều chỉnh khi cần thiết:
pm.max_children = 10
pm.start_servers = 1
pm.min_spare_servers = 1
pm.max_spare_servers = 1

Sự khác biệt chính giữa chúng là theo yêu cầu sẽ sử dụng ít bộ nhớ hơn khi không hoạt động nhưng sẽ chậm hơn khi máy khách kết nối.

Đây là một so sánh các kết quả của tôi:

PHP Cách thức Bọn trẻ tối đa Mem Nhàn. Max Mem. Thời gian tải Thời gian tối đa*
PHP5 CGI 4 4 50MB 200MB 5s 15s
PHP7 CGI 4 4 200 MB 200MB 5s tuổi 30
PHP7 FPM / theo yêu cầu 0 10 15 MB 500MB 7s 10 giây
PHP7 FPM / năng động 1 10 25 MB 500MB 6s 10 giây
  • Thời gian tải tối đa được kiểm tra khi chạy đồng thời 50 máy khách

Các giá trị trong bảng là gần đúng và chỉ nhằm mục đích minh họa (không phải là điểm chuẩn thực dưới bất kỳ hình thức nào).

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.