Tại sao tổng mức sử dụng RAM của Trình giám sát tài nguyên và Trình quản lý tác vụ thậm chí không thêm từ xa vào tổng mức sử dụng Bộ nhớ vật lý? [bản sao]


30

Tôi đã nhận thấy điều này trên nhiều máy Windows khác nhau, trong nhiều trường hợp khác nhau: việc sử dụng RAM được báo cáo bởi Trình quản lý tác vụ hoặc Trình giám sát tài nguyên dường như thường tăng thêm một lượng thấp hơn đáng kể so với lượng sử dụng thực tế.

Ví dụ, nhiều lần trên máy tính xách tay hoặc máy tính để bàn của tôi, tôi đã thấy một cái gì đó giống như 7GB đang sử dụng, và tổng số Bộ RAM hoạt động giống như 3GB. Tôi chỉ không thể tìm ra nơi nó đang được sử dụng!

Đây là một ví dụ cực kỳ tôi nhận thấy ngày hôm nay trong Resource Monitor trên máy chủ:

Giám sát tài nguyên
Nhấp để xem kích thước đầy đủ

Nếu bạn nhấp chuột phải vào hình ảnh và mở trong một tab mới và xem các số, bạn sẽ nhận thấy Bộ làm việc (không bao gồm bộ nhớ ảo phi vật lý) có thêm khoảng 1,7 GB. Tôi nhận được số tương tự bằng cách thêm sử dụng RAM trong Trình quản lý tác vụ khi "Hiển thị quy trình từ tất cả người dùng" được bật.

Bây giờ đây là một ảnh chụp màn hình của tab Trình quản lý tác vụ:

Quản lý công việc
Nhấp để xem kích thước đầy đủ

Điều này cho biết 7.6GB bộ nhớ vật lý đang được sử dụng.

Tôi thấy điều này mọi lúc, trên máy tính cá nhân, máy tính xách tay và bây giờ là máy chủ: tổng mức sử dụng RAM được báo cáo bởi các công cụ hệ thống chỉ chiếm khoảng 1/4 mức sử dụng RAM mà tôi quan sát được. WTF đang diễn ra ???

Có bất kỳ lời giải thích thỏa mãn về nơi tất cả RAM của tôi là? Cái gì đang ngấu nghiến nó, và tại sao nó không để lại dấu vết?

EDIT: Đây là hình ảnh về việc sử dụng RAM đồ họa, khi người dùng yêu cầu:

Sử dụng RamMap
Nhấp để xem kích thước đầy đủ

EDIT 2: Đáp lại phản hồi của James, đây là hình ảnh của các quá trình không được poolmon.exephân loại trong , được sắp xếp theo kích thước:

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

Những kết quả này làm tôi bối rối. poolmonnói chính xác rằng tôi có 6GB nhóm không được sử dụng, nhưng tất cả các quy trình nhóm không được phân vùng có kích thước nhỏ hơn 8 MB.

Điều này có nghĩa là gì? Là poolmonkhông phát hiện ra một số quy trình sử dụng nhóm không được phân vùng?



Bạn có thể vui lòng đăng một hình ảnh của tab Giám sát tài nguyên> Thẻ nhớ (chỉ phần dưới cùng với màu sắc và số). Đó sẽ là nói nhiều hơn.
whs

2
@Ramhound: Cảm ơn bạn đã chỉ cho tôi liên kết đó! Thật không may, như những gì vừa được yêu cầu, tôi đã tải lên một hình ảnh về bản đồ đồ họa Bộ nhớ vật lý của Resource Monitor và phần Chế độ chờ của Bộ nhớ vật lý chưa đến 2% tổng lượng RAM sử dụng. Câu trả lời của David Schwartz cho thấy rằng việc sử dụng RAM "ẩn" đến từ RAM chờ (nghĩa là RAM được sử dụng cho dữ liệu được lưu trong bộ nhớ cache và mã không được sử dụng), và đó không phải là trường hợp ở đây. Như vậy, tôi không nghĩ câu trả lời của David giải thích những gì đang diễn ra.
DumpsterDoustus

Sử dụng chương trình RamMap và khám phá với nó nhiều hơn nữa. Cho đến nay, nó có thể là một số trình điều khiển đi bonkers? nhưng thực sự nó không phải là chế độ chờ (cache). Bạn có chạy bất kỳ chương trình đặc biệt nào liên kết để sửa chữa ram, hoặc giả sử để tăng tốc máy tính không? Bất kỳ mục trình điều khiển kỳ lạ nào sẽ đặc biệt cho máy tính của bạn?
Psycogeek

2
Liên kết đến "đã trả lời trước" không bao gồm trường hợp này.
Jamie Hanrahan

Câu trả lời:


30

Tôi xin lỗi, tôi biết điều này nghe có vẻ như một câu trả lời thiếu sót ... nhưng câu trả lời cho câu hỏi trong tiêu đề của bạn là "bởi vì họ không được phép."

Hoặc nói một cách lịch sự hơn: Có rất nhiều việc sử dụng RAM không có trong các bộ làm việc riêng tư của các quy trình. Một số trong số đó là trong các bộ làm việc được chia sẻ của các quy trình - nhưng bạn không thể có được một khái niệm đáng tin cậy về việc sử dụng thực tế ở đó, vì chia sẻ; cộng các số của quy trình sẽ cho kết quả quá lớn.

Các nội dung khác chiếm RAM, như nhóm không được phân vùng, phần thường trú của nhóm phân trang và các phần thường trú của các sử dụng không gian nhân khác, hoàn toàn không hiển thị trong màn hình "quy trình" của Trình quản lý tác vụ.

Về vấn đề cụ thể của bạn:

Trên màn hình Trình quản lý tác vụ, xem phần "bộ nhớ kernel"? Bạn có 6 GB "bộ nhớ không được phân vùng" (đó là nhóm không được phân vùng). Đó là một phần của phần "Đang sử dụng" trong biểu đồ thứ hai của bạn. Nhóm không được phân vùng không bị tính phí cho bất kỳ quy trình nào, đó là lý do tại sao việc cộng các số trên mỗi quy trình trong trình quản lý tác vụ không gần với tổng số sử dụng. Một số trình điều khiển rất có thể sử dụng nó. Đây là một số tiền quá mức; nó phải dưới 1 GB. bất cứ điều gì trình điều khiển chịu trách nhiệm cho phần quá mức của việc sử dụng hồ bơi không được quản lý là lỗi không thể nghi ngờ.

RAMmap có thể xác nhận điều này (trên tab "Số lượng sử dụng" của nó, hãy xem tổng số cho "Nhóm không được phân vùng") nhưng nó không thể giúp bạn tìm ra trình điều khiển nào gây ra nó.

Đây là cách tìm: Lấy bản sao của công cụ Microsoft "poolmon". Nó là một công cụ chế độ nhân vật (cậu bé, đã từng) được phân phối với Windows Driver Kit. Đối với Windows 7, WDK là bản tải xuống miễn phí . Bạn phải tải xuống toàn bộ (đó là ISO) và cài đặt nó từ đó, nhưng bạn có thể chọn chỉ cài đặt các công cụ, nếu đó là tất cả những gì bạn muốn.

Tìm poolmon trong các thư mục WDK - hãy chắc chắn chọn đúng, 32 hoặc 64 bit - và chạy nó từ dấu nhắc lệnh của quản trị viên. Bạn sẽ nhận được một màn hình như thế này:

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

Bây giờ, nhấn phím "p" (không, tôi không đùa. Không có menu nào ở đây!) Cho đến khi cột "Loại" chỉ hiển thị "Nonp". Sau đó nhấn "b" (hai lần nếu cần) để sắp xếp màn hình theo thứ tự giảm dần theo cột Byte (đã được thực hiện trong mẫu ở đây).

Sau đó nhìn vào cột "Tag" cho dòng trên cùng. Trong trường hợp (rõ ràng là nhân tạo) được hiển thị ở đây, đó là "Rò rỉ". (Hệ thống này đang chạy trình điều khiển bị lỗi cố ý gây ra sự cố này - đó là "bể" không bị rò rỉ.)

btw, các dòng được tô sáng là những dòng đã thay đổi kể từ lần cập nhật trước cho màn hình cổ xưa này.

Bây giờ hãy tìm kiếm c: \ Windows \ System32 \ Trình điều khiển cho tệp .sys chứa chuỗi đó. Trong trường hợp này, bạn sẽ tìm kiếm "Rò rỉ", như thế này:

c:\windows\system32> findstr /s Leak *.sys

Sau đó tìm kiếm trên web để tham khảo chuỗi đó và / hoặc tên trình điều khiển đó.

Trở lại đây và báo cáo tên đầy đủ, tên nhà sản xuất, v.v. từ tệp .sys cũng sẽ hữu ích.

(Đặt cược của tôi là thẻ bạn tìm thấy sẽ là ECMC, trình điều khiển là intmsd.sys và được liên kết với một sản phẩm có tên ExpressCache hoặc IntelliMemory. Tôi sẽ "gỡ cài đặt" sản phẩm đó. với phiên bản cố định tôi chưa bao giờ thấy hiệu năng của hệ thống được cải thiện bởi sản phẩm này, về cơ bản nó sao chép chức năng đã có trong Windows.)

Nếu bạn không thể tìm thấy nó theo cách đó, bước tiếp theo là sử dụng "Bộ công cụ hiệu suất Windows". Tìm kiếm diễn đàn này cho chuỗi đó, với câu trả lời của magicandre1981, để biết cách thực hiện. Bỏ qua các câu trả lời đề cập đến xperf - đây là phiên bản cũ hơn của công cụ.

CẬP NHẬT: Theo các bình luận, OP đã làm như trên và thấy rằng mặc dù poolmon đã báo cáo tổng kích thước của hồ bơi không bị ảnh hưởng là rất lớn, nhưng tất cả các phần được phân bổ rõ ràng là rất nhỏ. Giả thuyết của tôi (cũng trong các bình luận) là do điều này tôi sẽ gọi là pool "cồng kềnh": Pool đã được phân bổ, sau đó được giải phóng, nhưng vì một số lý do, lượng RAM được phân bổ cho pool không bị thu hẹp để phản ánh "giải phóng" . Theo thủ tục được mô tả trong câu trả lời này bởi Magicandre có thể xác định thủ phạm.


Cảm ơn bạn đã tham gia điều tra hơn những người khác có! Tôi sẽ chọc cho rò rỉ bằng cách sử dụng poolmonngày hôm nay nếu tôi có thời gian, và cố gắng đọc câu trả lời của bạn chặt chẽ hơn để đảm bảo tôi hiểu nó. Bạn đang nói có lẽ có một rò rỉ bộ nhớ? Nếu vậy, điều đó hoàn toàn hợp lý, vì chúng tôi đang làm việc trên phần mềm được biết là có một số rò rỉ bộ nhớ khủng khiếp.
DumpsterDoustus

@DumpsterDoustus: Có. Có thể có một rò rỉ bộ nhớ trong trình điều khiển chế độ kernel. Điều này khác với rò rỉ bộ nhớ trong một ứng dụng.
Jamie Hanrahan

Vì vậy, cuối cùng tôi đã có xung quanh để chạy poolmon.exetrên máy chủ trong câu hỏi và chỉnh sửa câu hỏi của tôi để bao gồm một ảnh chụp màn hình. poolmontrạng thái Tôi có nhóm 6GB không được phân vùng (như bạn đã chỉ ra từ ảnh chụp màn hình Trình quản lý tác vụ của tôi), nhưng khi tôi chỉ nhìn vào các quy trình "Nonp" và sắp xếp theo kích thước, tất cả chúng đều nhỏ xíu (lớn nhất là 8 MB). Bạn có biết tại sao poolmonkhông phát hiện ra phần lớn việc sử dụng nhóm không được phân nhóm không?
DumpsterDoustus

2
À ... vấn đề ở đây là từ "cách sử dụng". Vì vậy, bạn có 6 GB nonpaged pool, nhưng có vẻ như chỉ một phần của nó được sử dụng tại thời điểm này. Than ôi không có gì tôi biết (không phải TM, không phải poolmon, không phải RAMmap) cho thấy có bao nhiêu pool thực sự được sử dụng. Tôi đoán là đã có một người sử dụng hồ bơi nặng một lần, vì vậy hồ bơi đã được mở rộng để chứa nó, và sau đó người dùng nặng đã biến mất. Do cách xử lý pool, không dễ để giải phóng RAM một khi được phân bổ cho nó, trừ khi việc phân bổ nằm trong các khối lớn liền kề nhau. Tôi sẽ đề nghị xem điều này sau khi khởi động hệ thống mới.
Jamie Hanrahan

Có một phiên bản poolmon.exe có sẵn trong Công cụ hỗ trợ cho máy chủ 2003 ( serverfault.com/questions/84479/ mẹo ) - hơi cũ, nhưng chỉ là tải xuống 5,2 MB và vẫn chạy trên (ít nhất là) Server 2016.
mwfearnley
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.