Sử dụng bộ nhớ thực tế của một quá trình


20

Sau đây là việc sử dụng bộ nhớ mysqlapachetương ứng trên máy chủ của tôi. Theo đầu ra của pmapnói, mysqlđang sử dụng khoảng 379M và apacheđang sử dụng 277M.

[root@server ~]# pmap 10436 | grep total
 total           379564K

[root@server ~]# pmap 10515 | grep total
 total           277588K

So sánh điều này với đầu ra của top, tôi thấy các giá trị gần như khớp với nhau.

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
10515 apache    20   0  271m  32m 3132 S  0.0  6.6   0:00.73 /usr/sbin/httpd
10436 mysql     20   0  370m  21m 6188 S  0.0  4.3   0:06.07 /usr/libexec/mysqld --basedir=....

Bây giờ các giá trị này chắc chắn không phải là mức sử dụng bộ nhớ hiện tại của hai quy trình đó, vì nếu nó đã vượt quá 512M ramtrên hệ thống của tôi và tôi hiểu thực tế rằng đây là kích thước của các trang được gán cho hai quy trình này và không thực sự kích thước của bộ nhớ được họ tích cực sử dụng. Bây giờ, khi chúng ta sử dụng pmap -x, tôi thấy một phần bổ sung Dirtycho thấy việc sử dụng bộ nhớ ít hơn nhiều cho quy trình. Như đã thấy trong ví dụ hiển thị bên dưới, Dirtycoloumn hiển thị 15M so với 379M trong coloumn đầu tiên. Câu hỏi của tôi là: Giá trị theo coloumn Dirtycó phải là lượng bộ nhớ 'thực' được sử dụng tích cực trong quá trình đó không? Nếu không, thì làm thế nào chúng ta có thể tìm ra cách sử dụng bộ nhớ thực của một quá trình? Không pstopvì những lý do tương tự ở trên. Chúng ta có gì dưới đây không/proc Điều đó sẽ cung cấp thông tin này?

[root@server ~]# pmap -x 10436 | grep total
total kB          379564   21528   15340
[root@server ~]#


[root@server ~]# free -m
             total       used       free     shared    buffers     cached
Mem:           489        447         41          0         52        214
-/+ buffers/cache:        180        308
Swap:         1023          0       1023
[root@server ~]#

Câu trả lời:


18

Không có lệnh nào cung cấp cho việc sử dụng bộ nhớ thực tế của một quy trình vì vì không có việc sử dụng bộ nhớ thực tế của một quy trình .

Mỗi trang bộ nhớ của một quá trình có thể là (trong số các phân biệt khác):

  • Lưu trữ tạm thời được sử dụng bởi quá trình đó một mình.
  • Được chia sẻ với các quá trình khác bằng cách sử dụng một loạt các cơ chế.
  • Được sao lưu bởi một tập tin đĩa.
  • Trong bộ nhớ vật lý hoặc trao đổi.

Tôi nghĩ rằng con số dơ bẩn của cộng đồng cộng lại mọi thứ trong RAM (không phải trao đổi) và không được hỗ trợ bởi một tập tin. Điều này bao gồm cả bộ nhớ chia sẻ và bộ nhớ không chia sẻ (mặc dù trong hầu hết các trường hợp khác ngoài máy chủ, bộ nhớ dùng chung chỉ bao gồm các tệp ánh xạ bộ nhớ).

Các thông tin được hiển thị bởi pmapđến từ và . Đó là việc sử dụng bộ nhớ thực của quá trình - nó không thể được tóm tắt bằng một số duy nhất./proc/PID/maps/proc/PID/smaps


6

Tôi sẽ trích dẫn một cái gì đó tôi đã viết trong trang hướng dẫn cho một ứng dụng phân tích tương tự như trên và rút ra thông tin từ cùng một nguồn như pmap(ví dụ /proc/[N]/maps):

KHÔNG GIAN ĐỊA CHỈ VIRTUAL VS. BỘ NHỚ VẬT LÝ

Điều quan trọng là phải hiểu sự khác biệt giữa không gian địa chỉ ảobộ nhớ vật lý trong việc diễn giải một số thống kê ở trên. Như tên của nó, không gian địa chỉ ảo là không có thật; về cơ bản nó là bản đồ của tất cả bộ nhớ hiện được phân bổ cho một tiến trình. Giới hạn về kích thước của bản đồ này là giống nhau cho từng quy trình (nói chung là 2-4 GB) và nó không được tích lũy (nghĩa là bạn có thể có hàng chục hoặc hàng trăm quy trình, mỗi quy trình có địa chỉ ảo 2-4 GB của riêng mình không gian, trên một hệ thống chỉ thực sự có 512 MB bộ nhớ vật lý ).

Dữ liệu thực sự không thể được lưu trữ hoặc lấy từ không gian địa chỉ ảo; dữ liệu thực đòi hỏi bộ nhớ thực, vật lý. Đây là công việc của kernel để quản lý cái này liên quan đến cái khác. Số liệu thống kê không gian ảo (VirtualSz, Data + Stack và Priv & Write) rất hữu ích để xem xét cấu trúc của một quá trình và mối quan hệ với việc sử dụng bộ nhớ vật lý, nhưng liên quan đến lượng RAM thực sự được sử dụng, các số liệu thống kê bộ nhớ vật lý (ResidentSz, Share và Tỷ lệ) là những gì tính.

pmapchủ yếu là báo cáo cho bạn thông tin về không gian địa chỉ ảo . Quan sát của bạn rằng "các giá trị gần như khớp" trong topđầu ra có lẽ đề cập đến hình VIRT, rất khác so với hình RES. Chúng tương ứng chính xác với những gì ở trên tôi đã gắn nhãn "VirtualSz" và "ResidentSz" (VIRT dành cho ảo, RES dành cho cư dân).

Bây giờ, khi chúng ta sử dụng pmap -x, tôi thấy thêm một phần Dirty coloumn cho thấy việc sử dụng bộ nhớ ít hơn nhiều cho quá trình. Như đã thấy trong ví dụ hiển thị bên dưới, Dirty coloumn hiển thị 15M so với 379M trong coloumn đầu tiên. Câu hỏi của tôi là: Giá trị theo coloumn Dirty có phải là lượng bộ nhớ 'thực' được sử dụng tích cực trong quá trình đó không?

Không, nhưng loại. Bộ nhớ "bẩn" đề cập đến dữ liệu đã được tải từ đĩa và sau đó được sửa đổi; vì nó đã được sửa đổi, nó phải là một phần của bộ nhớ lưu trú vì những thay đổi này hiện được lưu trữ trong RAM. Tuy nhiên, nó không đồng nghĩa với nó.


Tôi đồng ý. Tuy nhiên, 2 đến 4GB là dành cho hệ thống 32 bit. Hầu hết các hệ thống ngày nay có lẽ là 64 bit.
ctrl-alt-delor

3

Bộ nhớ ảo giống như số quay số nhanh, ngoại trừ có khoảng 3 tỷ hoặc chúng (đối với hệ thống 32 bit, 4 tỷ cho ứng dụng 32 bit trên kernel 64 bit, nhiều hơn cho ứng dụng 64 bit) và bạn không thể quay số trực tiếp, chúng có được ánh xạ để quay số nhanh.

Một số quy trình có thể có ánh xạ khác nhau (số quay số nhanh) cho cùng một địa chỉ (số điện thoại). Ví dụ, họ có thể chia sẻ một số thư viện, vì vậy có địa chỉ ảo cho toàn bộ thư viện (bạn có thể thấy điều đó trong pmap). Họ thậm chí có thể chia sẻ cùng một thực thi, ví dụ 2 trường hợp bash.

Cho đến nay điều này giải thích làm thế nào phụ của tất cả các địa chỉ ảo có thể phù hợp, nhưng có nhiều hơn nữa. Một tiến trình có thể có quá nhiều bộ nhớ ảo mà nó không phù hợp, làm thế nào? Một số phần của thư viện hoặc có thể thực thi được có thể không được sử dụng, chúng sẽ không được sao chép từ đĩa vào ram, hoặc ram bị đầy và các bit được tải từ đĩa bị hủy, vì chúng có thể được tải lại từ đĩa nếu cần, hoặc bộ nhớ không được sao lưu, đĩa của tôi được ánh xạ để trao đổi, sao chép ra để trao đổi và sau đó bị hủy. Sau đó nó có thể được đọc từ trao đổi nếu và khi cần thiết. Nếu bất kỳ chiến lược nào trong số này được sử dụng quá nhiều thì hệ thống sẽ trở nên chậm chạp.

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.