2016-07-28 22 views
8

Tôi nhận thấy có sự khác biệt giữa báo cáo top hoặc ps là mức sử dụng bộ nhớ cho quy trình PHP, so với quá trình tự nghĩ rằng quá trình sử dụng (với memory_get_usage).PHP thực sự sử dụng bao nhiêu bộ nhớ?

Quá trình thực sự sử dụng bao nhiêu bộ nhớ?

Khi chạy đoạn mã sau cùng với một trong những ứng dụng của tôi:

echo "Memory usage: " . pretty_bytes(memory_get_usage()) . PHP_EOL; 
echo "Peak memory usage: " . pretty_bytes(memory_get_peak_usage()) . PHP_EOL; 
echo "'Actual' memory usage: " . pretty_bytes(memory_get_usage(true)) . PHP_EOL; 
echo "'Actual' peak memory usage: " . pretty_bytes(memory_get_peak_usage(true)) . PHP_EOL; 

$ps_output = exec("ps --pid " . getmypid() . " --no-headers -o rss"); 

echo "'Memory usage according to ps: " . pretty_bytes(intval($ps_output) * 1000); 

Sản lượng tại một điểm ngẫu nhiên là:

Memory usage: 4.77 MB 
Peak memory usage: 4.99 MB 
'Actual' memory usage: 5.00 MB 
'Actual' peak memory usage: 5.00 MB 
Memory usage according to ps: 17.66 MB 

Trong trường hợp đặc biệt của tôi, đây là một mối quan tâm vì tôi m chạy khá một vài công nhân và daemon.

Khi tôi đặt giới hạn bộ nhớ PHP thành ví dụ: 128 MB cho mỗi daemon này, các quá trình sẽ chỉ bị giết khi chúng đạt 128 MB theo các phép đo của PHP. Tuy nhiên, theo ps, các quy trình sẽ sử dụng khoảng 200 MB mỗi lần đó.

Trả lời

2

Cần nhấn mạnh những gì chính xác giá trị được báo cáo bởi psmemory_get_usage(true) là.

ps -o rss báo cáo số thực tế Kích thước bộ thường trú. Dựa vào giá trị này hoàn toàn là một cạm bẫy, vì nó không bao gồm cuối cùng hoán đổi trí nhớ. Nói chung, bạn muốn có USS, Kích thước thiết lập duy nhất, bộ nhớ cơ bản không được chia sẻ (có xem smem(8) cho điều đó). Đó là số lượng bộ nhớ không chia sẻ hạt nhân thực sự có các trang được ánh xạ cho quá trình đó, tức là bộ nhớ không được chia sẻ hiện tại trong RAM hoặc swapfiles. Điều này là gần như bạn có thể nhận được cho việc sử dụng bộ nhớ "thực". [Cũng tham khảo /proc/$PID/smaps để biết tổng quan chi tiết, như được đề cập trong câu trả lời của IVO GELOV, nơi bạn có thể tính toán kỹ thuật bộ nhớ mà bạn muốn tự tính bằng cách phân tích cú pháp tệp ảo đó.]

Về memory_get_usage(), điều này báo cáo bộ nhớ heap thực sự được phân bổ bởi hệ thống bằng cách sử dụng trình quản lý bộ nhớ trong của PHP. Điều này có nghĩa, các thư viện trực tiếp sử dụng các trình quản lý bộ nhớ khác của hệ thống (mmap(2) hoặc malloc(3)) không để lộ mức sử dụng bộ nhớ của chúng ở đây. [Đây là ví dụ tại sao mysqlnd không hiển thị sử dụng bộ nhớ nhiều trong khi libmysqlclient không -. Sau này sử dụng malloc() nội]

Nếu bạn vượt qua true như tham số đầu tiên, tức là memory_get_usage(true), nó sẽ trả về tổng dung lượng bộ nhớ quản lý bộ nhớ trong PHP đã yêu cầu từ hệ thống. Con số này nói chung là hơi, nhưng không cao hơn nhiều so với số memory_get_usage(false). Nó cũng là số mà cài đặt INI memory_limit được so sánh với.

Nếu bạn muốn xem bạn có thể chạy bao nhiêu công nhân, lưu ý rằng PHP không chia sẻ nhiều bộ nhớ, ngoại trừ hạt nhân có thể chia sẻ bộ nhớ thư viện và opcache, chia sẻ cấu trúc (opcodes, thông tin lớp, v.v.). Do đó, bộ nhớ dùng chung thay vì không quan trọng đối với bạn. Giá trị quan trọng nhất cho bạn do đó nên là USS.

+0

Cảm ơn @bwoebi. Câu trả lời này và Ivo đã cho chúng tôi một mức độ thấu đáo đầy đủ về vấn đề này để giải quyết vấn đề trong tầm tay. – Robbert

6

memory_get_usage báo cáo bộ nhớ được phân bổ bởi quy trình PHP để chạy tập lệnh của bạn. ps báo cáo bộ nhớ được sử dụng bởi chính quá trình PHP, bao gồm bộ nhớ được sử dụng cho tập lệnh của bạn. Quá trình PHP sử dụng nhiều thư viện bên ngoài, tất cả đều có thể phân bổ bộ nhớ của chúng mà không cần quá trình PHP nhận thức được điều đó.

Vì vậy, memory_get_usageps vốn đã đo lường những thứ khác nhau và nên báo cáo các số khác nhau. Tất cả đều đi xuống như thế nào để bạn xác định "sử dụng bộ nhớ thực tế". Tôi hiểu rằng trong trường hợp của bạn, bạn quan tâm nhiều hơn đến việc sử dụng bộ nhớ của tiến trình PHP. Sau đó, đầu ra của ps phù hợp hơn với bạn. Nhưng bạn có thể dễ dàng tìm ra rằng ngay cả giá trị RSS được báo cáo bởi ps không quá đen và trắng trong thế giới của các hệ điều hành hiện đại và những kỷ niệm được chia sẻ.

Xem thêm:

+0

Cảm ơn Erki. Đây là một khởi đầu hữu ích, nhưng chúng tôi vẫn thiếu một số chi tiết mà @bwoebi có thể cung cấp trong câu trả lời của anh ấy. – Robbert

2

Bạn có thể tìm thấy những điều thú vị khi phát hành một trong các lệnh này:

cat /proc/PID_NUMBER/smaps 
pmap -d PID_NUMBER 
+0

Một số kết quả bí mật mà không diễn giải (mặc dù có khả năng giáo dục) có lẽ không phải là cách tiếp cận phù hợp cho SO. ; o) – Jakumi

+0

Thông tin bổ sung có sẵn ở nhiều nơi như –

+0

có thể rất tốt, nhưng trừ khi bạn liên kết với một số địa điểm đó, câu trả lời của bạn không tự cung cấp bất kỳ thông tin chi tiết nào. – Jakumi

Các vấn đề liên quan