Sử dụng procrank để kiểm tra tình trạng sử dụng bộ nhớ trên linux

Một trong những câu hỏi thường thấy của các developers là: Ứng dụng của họ chiếm bao nhiêu bộ nhớ? Đây có thể là một câu hỏi dơn giản, nhưng với một hệ điều hành sử dụng bộ nhwos ảo như Linux, câu trả lời thường khá phức tạp. Những con số trả về từ ps và top không thực sự trả lời được câu hỏi này. Vì vậy, procrank là một tool thường được sử dụng bởi Android platform developer để có một câu trả lời chính xác hơn.

Code:
https://github.com/csimmonds/procrank_linux.git

Lý thuyết

Vss – Virtual set size, còn được gọi là VIRT và VSZ là tổng số bộ nhớ ảo của process đã được map, không kể tới phần bộ nhớ ảo này đã được map tới bộ nhớ vật lý hay chưa.

Rss – Resident set size, còn được gọi là RES và RSS, là tổng số bộ nhớ đang được map.

Chỉ số Vss thường cao hơn so với bộ nhớ ứng dụng cần sử dụng bởi ứng dụng thường allocate nhiều hơn số lượng cần và chẳng bao giờ sử dụng tới. Rss là một thước đo khả dĩ hơn, nhưng vẫn là cao hơn nhiều vì nó không cho biết số lượng memory page mà được chia sẻ giữa các process.. Lấy ví dụ, chỉ có một bản copy của thư viện C tồn tại trong bộ nhớ bởi vì nó được chia sẻ giữa tất cả các process – trong trường hợp này, Rss lại cộng cả vào.

Một vài năm trước, Matt Mackall them hai chỉ số là Uss – Unique set size và Pss – Proportional set size và thay đổi kernel để lấy thông tin cần thiết và tính toán chúng, ta có thể xem tại /proc/[PID]/smaps

Uss – Unique set size, là dung lượng bộ nhớ private của process và không được chia sẻ với các process khác.

Pss – Proportional set size, là dung lượng bộ nhớ chia sẻ với các process khác, được chia bởi số lượng process chia sẻ mỗi page.

Tham khảo hình vẽ dưới để có thể thấy đơn giản hơn:

Lấy ví dụ với 3 process như hình vẽ dưới và mỗi page đã được map với địa chỉ ảo. Page đã được đánh dấu với các chữ cái A, B, C. Trong đó:

  • A = phần bộ nhớ riêng của process, đã được map với trang bộ nhớ vật lý của RAM. Phần này bao gồm cả stack và heap đang được trực tiếp sử dụng
  • B = phần bộ nhớ chia sẻ giữa các process (các thư viện) đã được map
  • C = phần bộ nhớ đã được allocate nhưng không được sử dụng

Vậy, với mỗi process thì:

  • Vss = A + B + C
  • Rss = A + B
  • Uss = A
  • Pss = A + B/n với n là số lượng process chia sẻ thư viện đó

Ta có thể tính số Pss của ba process:

Pss(1) = 2 + 3/3 + 2/2 = 4
Pss(2) = 2 + 3/3 + 2/2 = 4
Pss(3) = 2 + 3/3 = 3
Sum(Pss) = 11 = tổng số page sử dụng

Như bạn có thể thấy, Pss cho ta thấy đánh giá chính xác về dung lượng bộ nhớ một process đang sử dụng, đã tính cả phần bộ nhớ được chia sẻ giữa các process. Tổng dung lượng bộ nhớ được sử dụng bởi tất cả các process là tổng của Pss của tất cả các process.

Chỉ số Uss cũng hữu dụng bởi vì nó hiển thị số page là duy nhất. Có thể tưởng tưởng nó là cái giá (dung lượng bộ nhớ) mà bạn phải bỏ ra để fork process đó để tạo một bản copy.

Thay cho procrank thi ta có thể sử dụng smem, được phát triển bởi Matt Mackall. Nhưng phần mềm này yêu cầu Python để chạy. Vì vậy, android developer đã viết procrank bằng C, chạy trực tiếp trên command line, sử dụng thư biện BIONIC C.

Leave a Reply

Your email address will not be published. Required fields are marked *