Làm thế nào để điều tra rò rỉ bộ nhớ với Apache và PHP?


16

Chúng tôi đang điều hành một trang web Drupal hạng nặng thực hiện mô hình tài chính. Chúng ta dường như đang gặp phải một số rò rỉ bộ nhớ do thực tế là bộ nhớ ngoài giờ được sử dụng bởi apache tăng lên trong khi số lượng quá trình apache vẫn ổn định:

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây

Chúng tôi biết vấn đề bộ nhớ đến từ apache / PHP bởi vì bất cứ khi nào chúng tôi phát hành /etc/init.d/httpd reloadviệc sử dụng bộ nhớ đều giảm (xem ảnh chụp màn hình ở trên và bên dưới đầu ra CLI):

Trước khi tải lại httpd

$ miễn phí
             tổng số bộ đệm chia sẻ miễn phí được sử dụng lưu trữ
Mem: 49447692 45926468 3521224 0 191100 22609728
- / + bộ đệm / bộ đệm: 23125640 26322052
Hoán đổi: 2097144 536552 1560592

Sau khi tải lại httpd

$ miễn phí
             tổng số bộ đệm chia sẻ miễn phí được sử dụng lưu trữ
Mem: 49447692 28905752 20541940 0 191360 22598428
- / + bộ đệm / bộ đệm: 6115964 43331728
Hoán đổi: 2097144 536552 1560592

Mỗi luồng apache được gán cho PHP memory_limitlà 512 MB, điều này giải thích việc sử dụng bộ nhớ cao biểu thị khối lượng yêu cầu thấp và max_execution_time120 giây sẽ chấm dứt các luồng thực thi mất nhiều thời gian hơn và do đó sẽ ngăn chặn sự tăng trưởng liên tục trong việc sử dụng bộ nhớ nhìn thấy

Q: Làm thế nào chúng ta có thể điều tra những gì gây ra rò rỉ bộ nhớ này?

Lý tưởng nhất là tôi đang tìm kiếm các bước khắc phục sự cố tôi có thể thực hiện trên hệ thống mà không phải làm phiền nhóm phát triển.

Thông tin bổ sung:

OS: RHEL 5.6
PHP: 5.3
Drupal: 6.x
MySQL: 5.6

FYI chúng tôi nhận thức được vấn đề hoán đổi mà chúng tôi đang điều tra riêng và không liên quan gì đến rò rỉ bộ nhớ mà chúng tôi đã quan sát trước khi việc hoán đổi bắt đầu xảy ra.


Lần trước tôi gặp phải vấn đề sử dụng bộ nhớ nghiêm trọng với LAMP + Drupal là khi tôi sử dụng thư viện memcached PHP. Sau khi tôi lấy đi, việc sử dụng bộ nhớ giảm rất đáng kể. Chỉ là một phỏng đoán. Có thể gõ một câu trả lời thích hợp cho bạn một chút sau.
Janne Pikkarainen

@JannePikkarainen: chúng tôi đang sử dụng memcachedthư viện PHP . Dựa trên trang quản trị memcache memcache.php, tất cả những gì chúng ta có thể thấy là chúng ta đã phân bổ 5GBcho memcache, trong đó 3.3GBđang được sử dụng. Sẽ là tuyệt vời nếu bạn có thể giúp chúng tôi thêm ở đây.
Tối đa

Vâng, memcacheddaemon có lẽ là tốt. Đó là thư viện memcache PHP có thể hoặc không thể rò rỉ bộ nhớ (và do đó phát triển việc sử dụng bộ nhớ của Apache). Vấn đề của tôi là khoảng 1-2 năm trước, vì vậy mọi thứ có thể đã được khắc phục sau đó. Dù sao, nếu memcached không bắt buộc đối với bạn, hãy thử tắt nó trong một thời gian và xem liệu việc sử dụng bộ nhớ Apache có còn phát triển không.
Janne Pikkarainen

Vấn đề thực tế là gì? Hiệu suất có kém không? Bạn đang nói với chúng tôi các triệu chứng mà không giải thích vấn đề gì chúng tôi sẽ giúp bạn giải quyết. (Và vấn đề hoán đổi này mà bạn đang nói đến là gì? Bạn có trao đổi quá nhiều đến mức ảnh hưởng đến hiệu suất không?)
David Schwartz

@DavidSchwartz: vấn đề là nếu chúng ta không khởi động lại httpd, việc sử dụng bộ nhớ sẽ tiếp tục phát triển và hộp cuối cùng gặp sự cố với một số thông báo trong bộ nhớ kernel. Hiệu suất là tốt (cho đến khi việc sử dụng bộ nhớ đạt đến giới hạn bộ nhớ). Hãy bỏ qua vấn đề trao đổi.
Tối đa

Câu trả lời:


12

Chúng tôi biết vấn đề bộ nhớ đến từ apache / PHP bởi vì bất cứ khi nào chúng tôi phát hành /etc/init.d/httpd tải lại các giọt sử dụng bộ nhớ

Không - điều đó chỉ có nghĩa là nó liên quan đến lưu lượng truy cập web. Bạn đã tiếp tục đề cập rằng bạn đang chạy mysql trên hộp - có lẽ là quản lý dữ liệu cho máy chủ web - nó có thể dễ dàng trở thành thủ phạm ở đây. Như các dịch vụ khác mà webstack của bạn sử dụng mà bạn chưa đề cập.

Mỗi luồng apache được gán một bộ nhớ PHP_limit 512MB giải thích

Không, nó không có. Bạn đang báo cáo trung bình 7 và tối đa 25 máy chủ bận rộn - tuy nhiên biểu đồ bộ nhớ của bạn hiển thị đồng bằng khoảng 25Gb.

Thực sự bạn nên bắt đầu lại với điều chỉnh HTTP cơ bản - dường như bạn đang chạy 256 httpds không đổi, tuy nhiên mức sử dụng cao nhất của bạn là 25 - điều này chỉ là ngu ngốc.

và max_execut_time trong 120 giây sẽ chấm dứt các luồng mà việc thực thi mất nhiều thời gian hơn

Không - chỉ khi luồng thực thi nằm trong trình thông dịch PHP - không phải nếu PHP bị chặn.

thực hiện mô hình tài chính

(thở dài)

Sẽ rất hữu ích nếu bạn cung cấp chi tiết về cách bạn đã định cấu hình Apache, luồng hoặc prefork, phiên bản nào, cách PHP được gọi (mô-đun, cgi, fastcgi), cho dù bạn đang sử dụng các kết nối liên tục, cho dù bạn có sử dụng các thủ tục được lưu trữ hay không.

Tôi khuyên bạn nên bắt đầu bằng cách di chuyển mysql vào một máy riêng biệt và ngừng sử dụng các kết nối liên tục (nếu bạn hiện đang sử dụng chúng). Đặt giới hạn bộ nhớ thấp hơn nhiều và ghi đè lên mức này trên cơ sở mỗi tập lệnh. Hãy chắc chắn rằng bạn đã cài đặt và cấu hình bộ thu gom rác tham chiếu tròn.


2

Bạn có thể giải quyết vấn đề của bạn bây giờ. Là một tạm thời để giữ cho máy chủ không bị tráo đổi / đập, tôi chạy lệnh sau mỗi giờ từ cron:

#!/bin/sh 
sync; echo 3 > /proc/sys/vm/drop_caches

Tôi không nói rằng đây là một giải pháp, chỉ là một cách để giữ cho mọi thứ hoạt động và để giảm thiểu sự suy giảm khi bạn điều tra nguyên nhân thực sự của việc rò rỉ bộ nhớ.

Nhiều thông tin thêm có thế được tìm thấy ở đây.

http://www.tecmint.com/clear-ram-memory-cache-buffer-and-swap-space-on-linux/


1

Rõ ràng đây là cách PHP hoạt động - và nếu bạn đang thực hiện các vòng lặp dài nơi bạn đang phân bổ các đối tượng và ai biết nếu bạn chuyển chúng cũng qua tham chiếu, thì cách duy nhất để xử lý nó là theo N yêu cầu cho mỗi quy trình PHP để ngăn chặn nó Nếu bạn chạy PHP dưới dạng CGI, mọi yêu cầu đều khiến nó xuất hiện trở lại - vì vậy không có rò rỉ bộ nhớ và hiệu suất giảm có thể không quá lớn. Bạn cũng có thể chạy fast-cgi, ví dụ: mỗi 1000 yêu cầu quy trình php-fcgi bị hủy và bộ nhớ được giải phóng - một lần nữa không bị rò rỉ bộ nhớ. Nếu bạn chạy PHP dưới dạng mô-đun mod_php, bạn có thể thử thiết lập các câu hỏi tối đa trong httpd.conf để xem nó có giúp ích không. Tôi sẽ cố gắng thiết lập ví dụ 10 - nếu nó hoạt động, hiệu suất giảm sẽ không cao, nhưng sẽ không có rò rỉ bộ nhớ,


-1

Kiểm tra bộ nhớ trên tệp php.ini toàn cầu. không chỉ đơn giản là decalre valure như 1 G, v.v ... Tôi rất khuyến nghị rằng một php.ini cục bộ được đưa vào tài khoản đó để không ảnh hưởng đến toàn bộ máy chủ. Tôi khuyên bạn nên đặt giới hạn php.ini toàn cầu ở mức khoảng 64M vì điều này thường đủ cho hầu hết các tài khoản

kiểm tra cài đặt apache của bạn quá

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.