Chiều sâu bộ nhớ Windows (phần 2) — Đời sống của một trang vật lý: năm danh sách và sự thật về tệp trang
· Go Komura · Windows, Quản lý bộ nhớ, Tệp trang, Working Set, Standby, RAMMap, Giám sát hiệu năng
Trong bài trước, «Chiều sâu bộ nhớ Windows (phần 1) — Khoảnh khắc địa chỉ ảo trở thành RAM vật lý», chúng ta theo đến lúc trình xử lý lỗi trang cấp một trang vật lý khi lần đầu chạm trang đã Commit. Vậy trang vật lý đó đi đâu sau khi bị lấy ra khỏi Working Set?
Lời giải thích thường bị rút thành «bị đuổi sang tệp trang», nhưng thực tế có nhiều trạng thái trước và sau. Trang chưa sửa có thể chuyển sang Standby với nội dung còn nguyên. Trang đã sửa trước hết chờ ghi lại trên Modified. Khi dùng lại có thể qua Free hoặc Zeroed, và nếu cần lại cùng nội dung có thể trở về từ Standby bằng lỗi mềm (soft fault).
Bài này lấy cơ sở PFN làm trục và theo một trang vật lý di chuyển qua Active, Modified, Standby, Free và Zeroed như thế nào. Việc đọc các con số tự lấy bài mở đầu «What Does Windows’ “Memory Usage” Actually Mean? — Correctly Reading Working Set, Private Bytes, Commit, and the Page File» làm tiền đề.
«Chiều sâu bộ nhớ Windows» — cả 3 phần
- Phần 1: địa chỉ ảo và lỗi trang
Chúng ta theo khi nào một trang ảo đã Commit nhận được RAM vật lý. - Phần 2 (bài này): đời sống của một trang vật lý
Chúng ta theo chuyển trạng thái của trang rời Working Set và vai trò của tệp trang. - Phần 3: đối tượng section và copy-on-write
Chúng ta theo cơ chế DLL, ánh xạ tệp và bộ nhớ dùng chung chia sẻ trang vật lý.
Câu hỏi phần 2 trả lời chỉ có một.
Trang vật lý rời Working Set biến mất, ra đĩa, hay vẫn ở RAM?
Độc giả dự kiến là nhà phát triển và vận hành muốn hiểu từ cơ chế vì sao Available cao mà Standby cũng cao, hành vi sau khi cắt Working Set, cấu hình tệp trang và nén bộ nhớ. Điều kiện tiên quyết là Windows 10/11 hoặc Windows Server hiện hành, và nền cần có là cơ bản Working Set, Commit cùng lỗi mềm/cứng. Độ khó trung cấp; chúng ta dùng thuật ngữ nội bộ như PFN và danh sách trang, nhưng tập trung vào những gì quan sát được bằng RAMMap và PerfMon mà không cần trình gỡ lỗi nhân.
1. Kết luận trước
Để bắt đầu, đây là những điểm dễ đọc sai.
- Trang rời Working Set không nhất thiết biến mất ngay.
Trang sạch ở lại Standby và có thể trở về mà không đọc đĩa nếu cần cùng nội dung. - Trang đã sửa không thể dùng lại ngay.
Nội dung riêng trở nên dùng lại được sau khi có thể ghi lại vào tệp trang; tệp được ánh xạ, sau khi có thể ghi lại vào tệp tương ứng; vân vân. - Available gồm Standby.
Standby vừa là bộ đệm còn giữ nội dung, vừa là ứng viên dùng lại có thể lấy ngay nếu cần.1 - Ghi vào tệp trang không phải công việc hàng loạt chỉ bắt đầu sau khi RAM cạn hoàn toàn.
Nó tiến ở nền theo danh sách Modified và áp lực bộ nhớ.23 - Tệp trang không chỉ là «RAM chậm».
Nó nới Commit Limit, trở thành kho lưu trữ nền cho trang riêng đã sửa, và chống đỡ dump sự cố.4 - Tắt tệp trang không sửa rò bộ nhớ.
Commit Limit giảm, và bạn có thể mất lựa chọn dùng RAM hiệu quả cùng khả năng bắt dump.
Một câu: trước khi Windows bỏ một trang, nó kiểm tra khả năng trang sẽ cần lại và liệu có chỗ để khôi phục nội dung gốc.
2. Cơ sở PFN — sổ cái phía RAM vật lý
PTE ở phần 1 biểu diễn dịch từ trang ảo sang trang vật lý. Sổ cái nhìn việc này từ phía trang vật lý và theo «trang RAM này đang dùng cho gì» là cơ sở PFN. PFN là Page Frame Number: RAM vật lý được đánh số theo đơn vị trang.
Một mục PFN theo khái niệm theo dõi các thông tin sau.
- Trạng thái hiện tại của trang vật lý
- Số tham chiếu và số chia sẻ
- PTE tương ứng
- Nó đã sửa hay chưa
- Nó thuộc danh sách trang nào
- Thông tin liên quan nút NUMA và độ ưu tiên
Trong WinDbg, !pfn hiện thông tin của một PFN cụ thể, và !memusage hiện mức dùng bộ nhớ vật lý cùng tổng từng danh sách trang.56 Để quan sát cùng thế giới mà không dùng trình gỡ lỗi nhân, có Sysinternals RAMMap. Use Counts hiện mục đích và danh sách trang, Priority Summary hiện Standby theo độ ưu tiên, Physical Pages hiện mức dùng từng trang.7
3. Nối năm trạng thái trên một hình
Bài này xử lý luồng trang vật lý thành năm trạng thái sau, đã đơn giản hóa. Nói chặt, Windows hiện hành có trạng thái và danh sách không vẽ ở đây — Standby theo độ ưu tiên, Transition, Bad và khác — và Active chỉ ít hơn một «danh sách Active» đơn mà là trạng thái được tham chiếu từ Working Set hay tương tự qua PTE hợp lệ. Dù vậy hình này hơn là hữu ích để đọc hành vi bộ nhớ của ứng dụng.
Hình 1: Trang được tham chiếu trong Working Set đi Standby nếu sạch và Modified nếu bẩn. Cùng nội dung có thể trở về; mục đích khác dùng lại trang trực tiếp hoặc qua Free/Zeroed cho cấp phát cần số không.
Mã nguồn Mermaid của hình 1
```text flowchart LR zeroed["Zeroed\nĐã điền zero"] -->|Touch đầu| active["Active / Valid\nĐược Working Set tham chiếu"] active -->|Cắt clean| standby["Standby\nỨng viên tái dùng còn nội dung"] active -->|Cắt dirty| modified["Modified\nChờ ghi lại"] modified -->|Ghi xong| standby standby -->|Quay lại bằng soft fault| active standby -->|Bỏ danh tính cũ| free["Free\nChưa điền zero"] standby -->|Tái dùng thẳng cho việc khác| active free -->|Cho cấp phát cần zero| zeroed ```Điểm quan trọng nhất của hình là rời Working Set và mất nội dung không phải một việc. Ngoài ra, khi lấy trang Standby cho mục đích khác, nó không nhất thiết đi Free/Zeroed theo thứ tự. Nếu sẽ giao cho chế độ người dùng như trang riêng demand-zero mới, phải xóa nội dung cũ; nếu cả trang sẽ bị ghi đè, như đích đọc tệp, có thể bỏ danh tính Standby và dùng lại trang trực tiếp.
4. Active / Valid — trang vật lý có thể tham chiếu ngay
Trang Active/Valid được tham chiếu từ Working Set của tiến trình hoặc không gian hệ thống qua PTE hợp lệ. CPU tới được bằng dịch địa chỉ thông thường, nên bản thân truy cập không cần lỗi trang.
Tuy nhiên không có bảo đảm trang vẫn Active. Để giữ bộ nhớ khả dụng, trình quản lý bộ nhớ nhìn kích thước Working Set, trang được dùng gần đây thế nào và các yếu tố tương tự, rồi cắt các trang ứng viên. Tài liệu Working Set của Microsoft cũng giải thích rằng trình quản lý bộ nhớ gỡ trang khỏi Working Set để tạo bộ nhớ khả dụng.8
4.1. Cắt không phải giải phóng
Điều cắt Working Set chủ yếu đổi là trạng thái thường trú có thể tham chiếu ngay qua PTE hợp lệ. Hãy phân biệt bốn việc sau thành sự kiện riêng.
- Gỡ khỏi Working Set
- Giải phóng Commit
- Giải phóng dải địa chỉ ảo
- Mất dữ liệu gốc
Chạy EmptyWorkingSet hay «Trim Working Set» của công cụ không thay VirtualFree hay giải phóng heap. Nếu chạm lại cùng trang, nó trở về bằng lỗi mềm từ Standby hoặc lỗi cứng từ kho lưu trữ nền. Vậy «tôi đã làm Working Set nhỏ hơn» không nghĩa «tôi đã sửa rò».
5. Trang sạch đi Standby
Dù trang đã bị gỡ khỏi Working Set, nếu nội dung vẫn khớp tệp gốc hoặc đã có kho lưu trữ nền an toàn, có thể đặt nó trên Standby. Ví dụ tiêu biểu:
- Mã EXE/DLL chưa sửa
- Tệp ánh xạ bộ nhớ chưa sửa
- Trang riêng đã ghi lại
- Dữ liệu còn trong bộ đệm tệp
Trang Standby giữ tương ứng với nội dung trước. Khi cùng tiến trình hoặc tiến trình khác cần nội dung đó, nếu trang chưa bị dùng lại, lỗi mềm nối lại PTE là đủ để khôi phục.
Mặt khác, nếu cấp phát khác cần trang vật lý, có thể bỏ danh tính Standby cũ và dùng lại trang. Nếu đích dùng lại là trang riêng chế độ người dùng cần khởi tạo không, sẽ chuẩn bị trang Zeroed; nếu cả trang sẽ bị ghi đè bằng nội dung tệp hoặc tương tự, có thể gán lại trực tiếp mà không làm không.
Hai mặt này chính là lý do Standby vừa là bộ đệm vừa là Available.
5.1. Vì sao Available gồm Standby
MEMORYSTATUSEX.ullAvailPhys biểu diễn bộ nhớ vật lý dùng lại ngay được mà không ghi ra đĩa, và là tổng Standby, Free và Zeroed.1
flowchart LR
accTitle: Ba danh sách trang tạo nên Available
accDescr: Bộ nhớ vật lý khả dụng là tổng Standby, Free và Zeroed; trang Active được tham chiếu trong Working Set không được gồm
standby["Standby(ứng viên dùng lại còn giữ nội dung)"] --> avail["Available(bộ nhớ vật lý khả dụng)"]
free["Free(không dùng, chưa làm không)"] --> avail
zeroed["Zeroed(không dùng và đã làm không)"] --> avail
active["Active(được tham chiếu trong Working Set)"] -.->|Không gồm| avail
Hình 2: Available là tổng Standby, Free và Zeroed. Standby vẫn giữ nội dung cũng được tính là «khả dụng».
Vậy không mâu thuẫn khi Trình quản lý tác vụ hiện «Free thấp nhưng Cached/Standby cao và Available đủ». Windows không để RAM trống nằm không; nó để tệp và mã vừa dùng trên Standby để dùng lại nhanh như bộ đệm nếu cần, và lấy nếu mục đích khác cần chúng.
Đừng kết luận «Free thấp nên ngay lập tức thiếu bộ nhớ»; hãy nhìn Available, Commit, lỗi cứng và độ trễ xử lý cùng nhau.
6. Trang bẩn chờ trên Modified
Khi ứng dụng ghi vào trang, nội dung đó không còn khớp kho lưu trữ nền gốc. Ghi đè trang bẩn đó cho mục đích khác sẽ mất dữ liệu. Vì vậy trang đã sửa bị gỡ khỏi Working Set chờ ghi lại trên Modified.
Đích ghi lại phụ thuộc loại trang.
| Loại trang | Đích ghi lại điển hình |
|---|---|
| Trang riêng đã Commit | Tệp trang |
| Tệp ánh xạ ghi được | Tệp dữ liệu tương ứng |
| Dữ liệu bẩn trong bộ đệm tệp | Tệp dữ liệu tương ứng |
| Trang EXE/DLL sạch | Không cần ghi lại. Có thể đọc lại từ ảnh gốc |
Tài liệu tệp trang của Microsoft cũng giải thích rằng .dll, .exe và tệp thường đã có trên đĩa không cần ghi lại vào tệp trang, và dữ liệu đã sửa không có bản sao đĩa gốc mới trở thành ứng viên tệp trang.2
6.1. Modified Page Writer
Modified Page Writer là worker hệ thống quét các trang bẩn được tệp trang chống đỡ mà trình quản lý bộ nhớ theo dõi, và ghi chúng ra tệp trang.3 Phía tệp ánh xạ có các đường như Mapped Page Writer, phối hợp với hệ thống tệp và trình quản lý bộ đệm để ghi lại tệp tương ứng.
Điểm quan trọng là việc ghi ra không phải sơ đồ «không làm gì đến khi RAM còn 0 byte». Windows chuẩn bị ở nền các trang dùng lại được sau này, theo danh sách Modified, Available, trạng thái tệp trang và các yếu tố tương tự. Khi ghi lại xong và không còn tham chiếu hợp lệ khác, trang tiến sang Standby với nội dung nguyên.
flowchart TB
accTitle: Đường ghi lại của trang đã sửa
accDescr: Trang đã sửa rời Working Set chờ trên danh sách Modified; với trang riêng, nếu có tệp trang, Modified Page Writer ghi vào tệp trang, và trang tệp ánh xạ được Mapped Page Writer hoặc tương tự ghi lại tệp dữ liệu tương ứng, rồi tiến sang Standby với nội dung nguyên
dirty["Trang đã sửa đã rời Working Set"] --> modified["Chờ ghi lại trên danh sách Modified"]
modified -->|"Trang riêng(khi đã cấu hình tệp trang)"| mpw["Modified Page Writer ghi vào tệp trang"]
modified -->|Trang tệp ánh xạ| mapped["Mapped Page Writer hoặc tương tự ghi lại tệp tương ứng"]
mpw --> standby["Sau ghi lại, sang Standby với nội dung nguyên"]
mapped --> standby
Hình 3: Đích ghi lại được xác định theo loại trang, và cả hai đường tiến ở nền. Trên hệ thống tắt tệp trang, phía trang riêng không có đích ghi lại nên các trang riêng đã sửa ở lại RAM.
6.2. Tách đầu ra trang và I/O riêng của tệp trang
Các bộ đếm sau dễ lẫn; hãy xác nhận chúng nghĩa gì.
Memory\\Page Writes/sec: số I/O ghi phân trang phát ra để giải phóng bộ nhớ vật lýMemory\\Pages Output/sec: số trang ghi ra đĩa bởi những lần ghi đóMemory\\Page Reads/sec: số I/O đọc đĩa phát ra để giải lỗi cứngMemory\\Pages Input/sec: số trang vào RAM từ những lần đọc đó
Lưu ý Page Writes/sec và Pages Output/sec không phải bộ đếm chỉ nhận diện tệp trang. Chúng cũng có thể tăng trên đường ghi lại trang bẩn được tệp chống đỡ, như tệp ánh xạ. Ngược lại, phía vào cũng không phân biệt tệp trang, DLL, EXE và tệp ánh xạ bộ nhớ.2 Nếu muốn nhận diện I/O riêng của pagefile.sys, đừng ước từ bốn bộ đếm này thôi; ghi File I/O và Disk I/O bằng ETW/WPA rồi xác nhận tệp đích bằng cách khớp FileObject và FileName.9
Một điểm nữa: ghi vào tệp trang trước không nghĩa đọc lại ngay từ đĩa. Nếu không truy cập trang, trang đã ghi lại có thể bị lấy ra khỏi RAM và bộ nhớ vật lý được trao cho các trang dùng thường xuyên hơn.
7. Khác biệt giữa Standby, Free và Zeroed
7.1. Standby
Trạng thái vẫn giữ tương ứng với nội dung trước.
- Nếu cần cùng nội dung, có thể trở về bằng lỗi mềm
- Nếu mục đích khác cần, có thể bỏ danh tính cũ và dùng lại
- Có danh sách Standby theo độ ưu tiên
7.2. Free
Tương ứng hợp lệ với nội dung trước đã mất, và trang có thể cấp phát. Tuy nhiên mẫu bit cũ có thể còn trong trang. Đưa nguyên cho chế độ người dùng có nguy cơ rò thông tin của tiến trình trước.
7.3. Zeroed
Nội dung là số không, và trang có thể giao an toàn như trang chế độ người dùng mới. Lỗi demand-zero ở phần 1 là trường hợp tiêu biểu lấy trang Zeroed khả dụng rồi gắn vào PTE. Chuẩn bị từ Free sang Zeroed diễn ra theo nhu cầu và trạng thái hệ thống.
Vậy dù «Free» và «Zeroed» đều trông như không dùng, chúng khác nhau về mức sẵn sàng liên quan bảo mật.
8. Kho nén bộ nhớ — tạo thêm một đích trong RAM
Từ Windows 10 trở đi, khi có áp lực bộ nhớ trình quản lý bộ nhớ trong một số trường hợp có thể nén các trang ít dùng trong RAM thay vì ghi ra đĩa ngay. Tập hợp trang đã nén đó là kho nén.
Trong triển khai Windows 10 sớm, kho nén được tính trong Working Set của tiến trình System, nhưng trên Windows hiện hành nó xuất hiện trong danh sách tiến trình của trình gỡ lỗi như tiến trình Memory Compression riêng. Vì vậy khi điều tra lượng nén hiện tại, đừng chỉ theo Working Set của tiến trình System. Bản thân mục đích — giữ nhiều ứng dụng hơn trong bộ nhớ vật lý và giảm I/O đĩa — không đổi.1011
Tuy nhiên hãy nhớ các điểm sau.
- Trang đã nén vẫn dùng RAM
- Nén và giải nén có chi phí CPU
- Nén không xóa lời hứa Commit
- Không có thứ tự cố định «luôn nén rồi mới tệp trang»
- Chính sách đổi theo loại trang, áp lực và lịch sử truy cập
«Đang dùng (đã nén)» của Trình quản lý tác vụ không nghĩa nén đã làm trống hoàn toàn bộ nhớ vật lý. Kho nén không phải tính năng khiến tệp trang thừa; nó thêm một lựa chọn dùng CPU để giảm I/O giữa RAM và lưu trữ.
9. Vai trò thật của tệp trang
Tệp trang có ít nhất ba vai trò.
flowchart LR
accTitle: Ba vai trò của tệp trang
accDescr: Tệp trang nới Commit Limit, trở thành kho lưu trữ nền cho các trang riêng đã sửa ít truy cập, và trở thành chỗ nhận dump sự cố hệ thống
pagefile["Tệp trang"] --> limit["Nới Commit Limit(dư địa phía trần)"]
pagefile --> backing["Kho lưu trữ nền cho trang riêng đã sửa"]
pagefile --> dump["Chỗ nhận dump sự cố hệ thống"]
Hình 4: Vai trò của tệp trang không chỉ là «RAM chậm». Ngay khi mức dùng là 0 nó vẫn chống đỡ trần và dump.
9.1. Nới Commit Limit
Commit Limit của hệ thống được xác định đại khái bằng RAM cộng tổng mọi tệp trang. Không có tệp trang, Commit Limit xuống mức hơi nhỏ hơn RAM đã cài. Khi Commit Total chạm trần, Commit mới thất bại và có thể dẫn tới kết thúc ứng dụng bất thường hoặc sự cố hệ thống.4
Đây là chuyện khác với «hiện đang ghi bao nhiêu GB vào pagefile.sys». Tệp trang cũng là dư địa phía trần chống đỡ lời hứa Commit.
9.2. Chống đỡ trang riêng đã sửa
Nếu các trang riêng đã sửa ít truy cập được tệp trang chống đỡ, những trang vật lý đó có thể bị lấy ra khỏi RAM và trao cho mã cùng dữ liệu dùng thường xuyên.4 Tắt tệp trang giảm lựa chọn lấy các trang như vậy ra khỏi RAM. Không thể chỉ nói «nhanh vì không có đưa trang ra đĩa».
9.3. Chống đỡ dump sự cố hệ thống
Để tạo Memory.dmp khi hệ thống sự cố, bạn cần tệp trang hoặc tệp dump riêng có thể chống đỡ phương pháp dump đã chọn.2 Dump bộ nhớ đầy đủ, dump bộ nhớ nhân và dump bộ nhớ tự động khác nhau về lượng cần.
Trong môi trường điều tra sự cố, xóa tệp trang chỉ để tiết kiệm chỗ có thể nghĩa là bằng chứng thiếu khi cần nhất. Về phương pháp thu thập, xem thêm «An Introduction to Collecting Windows Crash Dumps - WER/ProcDump/WinDbg».
10. Kích thước đúng không đồng nhất
Không nên quyết kích thước tệp trang từ công thức cố định như «1,5 lần RAM» một mình. Microsoft giải thích kích thước phù hợp khác nhau theo hệ thống ở hai điểm sau và không thể khái quát.2
- System Commit Charge đỉnh
- Dump sự cố hệ thống bạn cần
Trong thực tế, nghĩ theo thứ tự sau.
10.1. Bắt đầu từ do hệ thống quản lý làm nền
Mặc định Windows là do hệ thống quản lý. Nó lớn và nhỏ theo RAM đã cài, nhu cầu Commit, yêu cầu dump sự cố và tương tự. Trừ khi có ràng buộc đặc biệt hoặc kết quả đo, bắt đầu từ đây là lựa chọn an toàn.
10.2. Đo Commit đỉnh dưới tải đại diện
Thu thập các bộ đếm sau trong PerfMon trong thời gian dài.
Memory\\Committed BytesMemory\\Commit LimitMemory\\% Committed Bytes In UseMemory\\Modified Page List BytesPaging File(*)\\% UsageMemory\\Available MBytesMemory\\Page Reads/secMemory\\Page Writes/sec
Gồm các đỉnh thực trong kỳ thu thập — xử lý cuối tháng, sao lưu, dựng bản, nhiều người dùng cùng lúc, vân vân.
Phần trăm dùng tệp trang cao một mình không chứng minh sự cố hiệu năng lưu trữ. Tuy nhiên dính trần là cảnh báo dung lượng không đủ. Hãy nhìn cùng nhau liệu Commit có gần trần, liệu nhiều Modified đang chờ, và liệu đĩa có bão hòa.2
10.3. Quyết yêu cầu dump trước
Quyết bạn cần dump bộ nhớ đầy đủ, dump bộ nhớ nhân đã đủ, hay sẽ dùng tệp dump riêng. Nếu đổi sang kích thước cố định, nó phải thỏa không chỉ Commit đỉnh mà cả yêu cầu dump.
11. Tự xem
11.1. Nhìn danh sách trang trong RAMMap
Khởi động RAMMap với quyền quản trị rồi mở Use Counts trước.7 Các mục cần nhìn như sau.
- Active
- Standby
- Modified
- Modified no write
- Free
- Zeroed
Priority Summary cho phép xác nhận Standby được tách theo độ ưu tiên. Processes hiện Working Set từng tiến trình; File Summary và File Details cho theo dữ liệu tệp đang ở RAM.
Thử đọc một lần tệp cục bộ khá lớn, kết thúc đọc rồi Refresh. Các trang của tệp đó có thể còn trong File Summary hoặc phía Standby. Đọc lại cùng tệp có thể khôi phục các trang chưa bị dùng lại mà không I/O đĩa, hoặc với ít I/O. Kết quả đổi theo áp lực bộ nhớ, phần mềm diệt virus và kích thước tệp, nên nhìn hướng chuyển trạng thái hơn một bộ số.
Lưu ý menu Empty của RAMMap đổi trạng thái hệ thống một cách nhân tạo. Đừng xóa Standby như cải thiện hiệu năng sản xuất; chỉ dùng trên môi trường thử tách biệt.
11.2. Tách Commit và Touch bằng Testlimit
Testlimit là công cụ Sysinternals mô phỏng thiếu tài nguyên bộ nhớ, handle, tiến trình, luồng và tương tự. Trước hết chạy lệnh sau trên tệp nhị phân bạn có và xác nhận phiên bản cùng cách dùng được hiện.
.\\testlimit64.exe -?
Phần sau nhắm Testlimit v5.24. Trong cú pháp chính thức v5.24, -m [MB] cấp lượng bộ nhớ chỉ định, -d [MB] cấp và Touch, -e [seconds] là khoảng cấp, và -c [count] là số lần cấp. Chỉ định -c cuối. Nếu thấy khác ở máy, ưu tiên cách dùng đó.12
Tiếp theo thử nhỏ trên VM dùng một lần.
# -m 64: cấp 64 MiB, -e 1: khoảng 1 giây, -c 8: dừng sau 8 lần
.\\testlimit64.exe -m 64 -e 1 -c 8
# Cùng số lần và khoảng, với -d để mỗi vùng được Touch
.\\testlimit64.exe -d 64 -e 1 -c 8
Trong lúc chạy, ghi đồng thời các mục sau.
- «Committed X/Y» của Trình quản lý tác vụ
- Active, Modified và Standby của RAMMap
Memory\\Committed BytesMemory\\Commit LimitMemory\\Available MBytesMemory\\Modified Page List Bytes
Nếu thực sự tái hiện cạn Commit, đừng làm trên máy chủ; tăng số lần từng bước trên VM có ảnh chụp. Lần chạy tự cấp đến trần có thể đóng băng màn hình, kết thúc tiến trình bất thường và mất nhật ký. Mục đích không phải làm hệ điều hành mất ổn định; là quan sát rằng khi tiến gần Commit Limit, Commit mới thất bại.
12. Bốn cách đọc sai nên tránh trong thực tế
12.1. «Standby cao nên là rò bộ nhớ»
Standby là bộ đệm dùng lại được và nằm trong Available. Đoán rò theo việc đường cơ sở Commit riêng tiến trình và phân tách cấp phát có tiếp tục tăng sau khi tải kết thúc hay không.
12.2. «Cắt Working Set sẽ sửa rò»
Cắt chỉ đổi trạng thái thường trú; không giải phóng Commit hay cấp phát ảo. Khi truy cập lại trang trở về bằng lỗi.
12.3. «Mức dùng tệp trang là 0 nên thừa»
Tệp trang chống đỡ không chỉ lượng ghi hiện tại mà còn Commit Limit và dump sự cố. Quyết xóa chỉ từ mức dùng hàng ngày sẽ mất dư địa đỉnh và bằng chứng lúc sự cố.
12.4. «Nén bộ nhớ trước, rồi luôn tệp trang»
Nén không phải đường ống nối tiếp cố định. Windows chọn động theo loại trang, hiệu suất nén, tải CPU, áp lực bộ nhớ và có kho lưu trữ nền hay không.
13. Tóm tắt
- Cơ sở PFN là sổ cái theo dõi quyền sở hữu, tham chiếu, sửa đổi và trạng thái danh sách của trang vật lý.
- Trang sạch rời Working Set ở lại Standby và có thể trở về bằng lỗi mềm nếu cần cùng nội dung.8
- Trang bẩn chờ trên Modified và được ghi lại vào tệp trang nếu riêng, hoặc tệp tương ứng nếu ánh xạ.3
- Available là tổng Standby, Free và Zeroed; Standby lớn một mình không phải thiếu bộ nhớ.1
- Nén bộ nhớ nén trang trong RAM để giảm I/O, nhưng không xóa vai trò của Commit và tệp trang.10
- Tệp trang chống đỡ Commit Limit, trang riêng đã sửa và dump sự cố hệ thống.42
- Kích thước phù hợp được xác định bởi Commit đỉnh và yêu cầu dump; không quyết bằng hệ số đồng nhất.2
- Cắt Working Set và xóa Standby không phải sửa rò bộ nhớ.
Tiếp phần 3, «Đối tượng section và copy-on-write: DLL và ánh xạ tệp thực sự là gì».
Chúng ta theo vì sao các trang tệp và DLL còn trên Standby lại hiện từ nhiều tiến trình như cùng một trang vật lý.
Bài viết liên quan
- Chiều sâu bộ nhớ Windows (phần 1) — Khoảnh khắc địa chỉ ảo trở thành RAM vật lý
- What Does Windows’ “Memory Usage” Actually Mean? — Correctly Reading Working Set, Private Bytes, Commit, and the Page File
- The Depths of Windows I/O (Part 4) — Cache Manager: When Does Your WriteFile Actually Reach the Disk?
- An Introduction to Collecting Windows Crash Dumps - WER/ProcDump/WinDbg
- Process Explorer / Handle / VMMap in Practice — Chasing Hangs, Leaks, and “File in Use” from the State Right Now
Lĩnh vực tư vấn liên quan
KomuraSoft LLC xử lý điều tra áp lực bộ nhớ ứng dụng Windows, cạn Commit, phân trang, tăng Working Set và thiết kế thu thập dump sự cố.
- Phát triển ứng dụng Windows
- Điều tra lỗi và phân tích nguyên nhân gốc rễ
- Di chuyển tài sản kế thừa
- Liên hệ với chúng tôi
Liên kết tham khảo
-
Microsoft Learn, MEMORYSTATUSEX structure. Về việc
ullAvailPhyslà bộ nhớ vật lý dùng lại ngay được mà không ghi ra đĩa, và là tổng các danh sách Standby, Free và Zeroed. ↩ ↩2 ↩3 -
Microsoft Learn, How to determine the appropriate page file size for 64-bit versions of Windows. Về việc kích thước phù hợp phụ thuộc Commit đỉnh và yêu cầu dump sự cố và không thể khái quát; danh sách Modified, mức dùng tệp trang, các bộ đếm liên quan và tệp trang do hệ thống quản lý. ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8
-
Microsoft Learn, Data corruption on IO write. Về việc Modified Page Writer là worker hệ thống của trình quản lý bộ nhớ quét các trang bẩn được tệp trang chống đỡ rồi ghi ra. ↩ ↩2 ↩3
-
Microsoft Learn, Introduction to page files. Về việc tệp trang lấy các trang đã sửa ít truy cập ra khỏi RAM, nới Commit Limit và chống đỡ dump sự cố hệ thống. ↩ ↩2 ↩3 ↩4
-
Microsoft Learn, !pfn (WinDbg). Về việc có thể hiện trạng thái, tham chiếu, địa chỉ PTE và hơn nữa của một mục PFN chỉ định. ↩
-
Microsoft Learn, !memusage (WinDbg). Về việc có thể cộng mức dùng bộ nhớ vật lý và các trạng thái trang như Zeroed, Free, Standby, Modified và Active. ↩
-
Microsoft Learn, RAMMap - Sysinternals. Về việc Use Counts, Processes, Priority Summary, Physical Pages, File Summary và File Details của RAMMap hiện mục đích bộ nhớ vật lý và danh sách trang. ↩ ↩2
-
Microsoft Learn, Working Set. Về việc trình quản lý bộ nhớ cắt Working Set để tạo bộ nhớ khả dụng, và về việc có thể giải các trang còn trong Transition hoặc Working Set của tiến trình khác bằng lỗi mềm. ↩ ↩2
-
Microsoft Learn, FileIo_Name class. Về việc sự kiện File I/O ETW có FileObject và FileName, nên FileObject có thể khớp với sự kiện Disk I/O để nhận diện I/O tới tệp đích. ↩
-
Windows Insider Blog, Announcing Windows 10 Insider Preview Build 10525. Về triển khai kho nén Windows 10 sớm đặt tập hợp trang đã nén trong RAM vào Working Set của tiến trình System và giảm ghi ra đĩa. ↩ ↩2
-
Microsoft Learn, Find Process ID (PID) in Windows. Về các ví dụ danh sách tiến trình Debugging Tools for Windows hiện hành hiện tiến trình
Memory Compressionvới PID riêng dưới System. ↩ -
Microsoft Learn, Testlimit - Sysinternals. Về cú pháp chính thức Testlimit v5.24 trong đó
-mcấp bộ nhớ,-dcấp và Touch,-elà khoảng cấp và-clà số lần cấp, với-cchỉ định cuối. ↩
Bài viết liên quan
Các bài viết gần đây có cùng thẻ để tìm hiểu sâu hơn những chủ đề lân cận.
Chiều sâu bộ nhớ Windows (phần 1) — Khoảnh khắc địa chỉ ảo trở thành RAM vật lý: page fault từ đầu đến cuối
Bài viết nối VirtualAlloc, VAD, bảng trang, TLB, demand-zero và hard fault để giải thích khoảnh khắc một địa chỉ ảo được gán RAM vật lý.
Chiều sâu bộ nhớ Windows (phần 3) — Đối tượng section và copy-on-write: DLL và ánh xạ tệp thực sự là gì
Bài này nối đối tượng section, ánh xạ image và dữ liệu, cache dùng chung và copy-on-write để giải thích cách DLL và bộ nhớ dùng chung chi...
Bên trong ảo hóa Windows (Phần 3) — Máy ảo khởi động trong vài giây: Vì sao WSL2, Windows Sandbox và container lại nhẹ
Vì sao WSL2 và Windows Sandbox khởi động trong vài giây và cảm giác nhẹ đến vậy? Bài viết này giải thích các cơ chế, từ ảnh cơ sở động và...
Bên trong ảo hóa Windows (Phần 2) — Bộ nhớ ngay cả kernel cũng không thấy: VBS, HVCI và Credential Guard
Khi cài sạch trên phần cứng tương thích, VBS được bật mặc định và dùng hypervisor cùng SLAT để tạo cô lập mạnh hơn kernel. Bài viết này g...
Bên trong ảo hóa Windows (Phần 1) — Windows của bạn thực sự chạy ở đâu? Hypervisor và phân vùng
Khi bạn bật Hyper-V, chính Windows máy chủ chạy trên hypervisor như phân vùng gốc. Bài viết này giải thích nền tảng ảo hóa qua vai trò củ...
Chủ đề liên quan
Các trang này đặt chủ đề trong bối cảnh rộng hơn của dịch vụ và quyết định.
Chủ đề kỹ thuật Windows
Cổng vào phát triển Windows, điều tra lỗi và khai thác tài sản hiện có.
Dịch vụ liên quan đến chủ đề này
Bài viết liên quan trực tiếp đến các dịch vụ sau.
Phát triển ứng dụng Windows
Ứng dụng nghiệp vụ, tích hợp thiết bị và công cụ liên lạc, từ yêu cầu đến phát triển.
Câu hỏi thường gặp
Các câu hỏi thường gặp khi tư vấn về chủ đề của bài viết.
- Trang có được ghi vào tệp trang ngay khi rời Working Set không?
- Không. Trang chưa sửa chuyển sang Standby với nội dung nguyên vẹn và trở thành bộ đệm dùng lại ngay được. Trang đã sửa chuyển sang Modified, và sau khi ghi lại vào tệp trang hoặc tệp tương ứng khi cần, tiến tới trạng thái dùng lại được như Standby.
- Available trong Trình quản lý tác vụ có gồm bộ nhớ Standby không?
- Có. Bộ nhớ vật lý khả dụng mà Windows báo cáo là tổng Standby, Free và Zeroed. Standby vẫn giữ nội dung cũ, nhưng vì có thể dùng lại ngay cho mục đích khác nếu cần nên được tính là bộ nhớ khả dụng.
- Việc ghi vào tệp trang chỉ bắt đầu sau khi RAM cạn hoàn toàn?
- Không. Windows ghi lại các trang đã sửa ít truy cập ở nền, theo danh sách Modified và trạng thái bộ nhớ khả dụng. Đây không phải cơ chế đơn giản chờ hết tuyệt đối rồi đuổi tất cả một lúc.
- Tắt tệp trang có làm Windows nhanh hơn không?
- Không thể khẳng định như quy tắc chung. Tắt sẽ hạ Commit Limit, khiến khó lấy các trang đã sửa ít truy cập ra khỏi RAM, và cũng ảnh hưởng dump sự cố hệ thống. Thông thường để hệ thống quản lý rồi quyết định bằng cách đo Commit đỉnh và yêu cầu dump.
- Nếu có nén bộ nhớ thì tệp trang có trở nên thừa không?
- Không trở nên thừa. Kho nén nén trang trong RAM để giảm I/O, nhưng trang đã nén vẫn dùng bộ nhớ vật lý và không thay thế bảo đảm Commit. Việc chọn giữa nén và đưa trang ra đĩa là chính sách động của trình quản lý bộ nhớ.