2015-04-01 23 views
13

Ok vì vậy tôi đang sử dụng WMI (.net/C#) để liên tục thu thập dữ liệu về một quy trình cụ thể đang chạy trên máy. Tôi lấy dữ liệu qua lớp Win32_PerfFormattedData_PerfProc_Process. Lớp đó có nhiều thuộc tính nhưng những thứ mà chúng tôi quan tâm như sau:Cách tính toán mức sử dụng bộ nhớ như Trình quản lý Tác vụ?

uint64 PageFileBytes; 

Giá trị tính theo byte, quá trình này đã được sử dụng trong (các) tệp hoán trang. Tệp hoán trang lưu trữ các trang của bộ nhớ được sử dụng bởi quá trình không được chứa trong các tệp khác. Tệp hoán trang được chia sẻ bởi tất cả các quy trình và thiếu không gian trong các tệp hoán trang có thể ngăn các quá trình phân bổ bộ nhớ khác.

uint32 PoolNonpagedBytes; 

giá trị, tính bằng byte, trong hồ bơi nonpaged, một khu vực của bộ nhớ hệ thống (bộ nhớ vật lý được sử dụng bởi hệ điều hành) cho các đối tượng mà không thể được ghi vào đĩa, nhưng phải ở lại trong bộ nhớ vật lý miễn là họ được phân bổ. PoolNonpagedBytes trong Win32_PerfFormattedData_PerfOS_Memory được tính toán khác với thuộc tính PoolPagedBytes trong Win32_PerfFormattedData_PerfProc_Process, vì vậy nó có thể không bằng tổng cộng của PoolPagedBytes cho tất cả các phiên bản của Win32_PerfFormattedData_PerfProc_Process. Thuộc tính này chỉ hiển thị giá trị quan sát cuối cùng; nó không phải là trung bình.

uint32 PoolPagedBytes; 

Giá trị, tính bằng byte, trong vùng phân trang, vùng nhớ có thể được ghi vào đĩa khi chúng không được sử dụng. Thuộc tính PoolNonpagedBytes trong Win32_PerfFormattedData_PerfOS_Memory được tính khác với thuộc tính PoolPagedBytes trong Win32_PerfFormattedData_PerfProc_Process, vì vậy nó có thể không bằng tổng số của PoolPagedBytes cho tất cả các phiên bản của Win32_PerfFormattedData_PerfProc_Process. Thuộc tính này chỉ hiển thị giá trị quan sát cuối cùng; nó không phải là trung bình.

uint64 PrivateBytes; 

Giá trị hiện tại, tính theo byte, quy trình này đã phân bổ không thể chia sẻ với các quy trình khác.

uint64 VirtualBytes; 

Kích thước hiện tại tính theo byte, của không gian địa chỉ ảo mà quá trình đang sử dụng. Việc sử dụng không gian địa chỉ ảo không nhất thiết ngụ ý việc sử dụng tương ứng của một trong hai trang đĩa hoặc bộ nhớ chính. Không gian ảo là hữu hạn và, bằng cách sử dụng quá nhiều, quá trình có thể hạn chế khả năng tải thư viện của nó.

uint64 WorkingSet; 

Số lượng tối đa, tính bằng byte, trong quá trình làm việc của quy trình này tại bất kỳ thời điểm nào. Bộ làm việc là tập hợp các trang bộ nhớ được các chủ đề trong quá trình xử lý gần đây. Nếu bộ nhớ trống trong máy tính vượt quá ngưỡng, các trang sẽ được để trong bộ làm việc của một quá trình ngay cả khi chúng không được sử dụng. Khi bộ nhớ trống rơi xuống dưới ngưỡng, các trang được cắt từ bộ làm việc. Nếu chúng được yêu cầu, chúng sau đó được mềm trở lại vào bộ làm việc trước khi chúng rời khỏi bộ nhớ chính.

Tôi hiện đang sử dụng trường WorkingSet để báo cáo quá trình sử dụng bộ nhớ. Tuy nhiên điều đó không phù hợp với những gì Task Manger đang hiển thị. Tôi đã thử với PrivateBytes nhưng đó không phải là "chính xác" quá. Quá trình mà ứng dụng giám sát là một quá trình .NET (nếu có vấn đề gì) và nó được ứng dụng báo cáo sử dụng ít nhất 100MB bộ nhớ nhiều hơn những gì Task Manager đang hiển thị cùng một lúc.

Vì vậy, câu hỏi đặt ra là "công thức" để tính toán mức độ sử dụng bộ nhớ gần đúng nhất của quy trình như được trình quản lý tác vụ hiển thị?

enter image description here

Trả lời

3

Win32_PerfFormattedData_PerfProc_Process là lớp chính xác. Tài sản mà nó kéo từ là WorkingSetPrivate. Không cần công thức/tính toán.

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