เหตุใดตารางหน้าของฉันจึงใช้หน่วยความจำมาก


10

พีซี Windows 7 64 บิตของฉันค่อนข้างเชื่องช้า ฉันสังเกตเห็นในตัวจัดการงานว่าการใช้หน่วยความจำของฉันใกล้ 100% - อย่างไรก็ตามการใช้งานที่รายงานสำหรับแต่ละกระบวนการไม่เพิ่มขึ้นเป็น 6GB ทั้งหมด (Firefox แสดงประมาณ 500MB ส่วนที่เหลือน้อยกว่ามาก) ฉันดาวน์โหลดRAMMapและพบว่าหน้าตารางกำลังใช้หน่วยความจำจำนวนมาก (2.5GB)

ภาพหน้าจอ RAMMap

ฉันไปที่นี่และไปที่ไหน - ตารางหน้าสามารถแยกส่วน เห็นได้ชัดว่าฉันจะรีบูตเครื่องและดูว่าจะช่วย แต่มีวิธีที่ดีกว่าในการแก้ไขหรือไม่

แก้ไข: รีบูตเครื่องและหน้าตารางมีขนาดไม่เกิน 30MB

แก้ไข 2: หลังจากสองสามวันของเวลาทำงานการใช้ตารางหน้าจะคืบคลานขึ้นอีกครั้ง ฉันทำตามคำแนะนำของ @ magicandre1981 ในคำตอบนี้เพื่อค้นหาแหล่งที่มาของการใช้ตารางหน้า น่าเสียดายที่ฉันวาดหน้าเปล่า - ตารางหน้าถูกใช้โดย "ไม่ทราบ"!

ภาพหน้าจอ WPA

ใครมีความคิดที่สดใส?


คุณต้องพิจารณาว่าอะไรคือการใช้ไฟล์หน้าของคุณเพื่อทำความเข้าใจสาเหตุการใช้งานไฟล์หน้าของคุณ (เช่นหน่วยความจำเสมือนของคุณ) สูง
Ramhound

1
ไม่ฉันคิดว่านี่เป็นหน่วยความจำกายภาพที่ใช้งานไม่ใช่แบบเสมือน ฉันคิดว่าตารางหน้าเป็นการอ้างอิงสำหรับตัวจัดการหน่วยความจำ
benshepherd

2
อย่างที่ฉันพูดในคำถามไม่มีกระบวนการใดที่ใช้หน่วยความจำ ฉันถูกภายใต้การแสดงผลที่หน้าโต๊ะเป็นสิ่งที่แตกต่างกันไปยังหน้าไฟล์
benshepherd


1
ตารางหน้าเป็นสิ่งที่แตกต่างจากไฟล์หน้า ดูคำตอบของฉันด้านล่าง นอกจากนี้ในขณะที่ pagefile สามารถแยกส่วนตารางหน้า ... ดีพวกเขามักจะแยกส่วน (เหมือนกระจายทั่ว RAM) และมันไม่สำคัญในน้อยที่สุด
เจมี่ Hanrahan

คำตอบ:


5

ฉันต้องการแสดงความคิดเห็นต่อความคิดเห็นของคำถามโดยเฉพาะความสับสนระหว่าง "ตารางหน้า" และ "ไฟล์หน้า" นี่ไม่ใช่คำตอบ แต่จะไม่พอดีกับพื้นที่ที่อนุญาตสำหรับความคิดเห็น

"ตารางหน้า" เป็นสิ่งที่แตกต่างจาก pagefile การมีRAM n MB ที่ใช้สำหรับหน้าตารางไม่ได้หมายความว่าคุณกำลังใช้พื้นที่เพจfile n MB และแม้ว่าบางรายการในตารางหน้า (PTEs ซึ่งเป็นสิ่งที่ตารางหน้าประกอบด้วย) จะอ้างถึงเนื้อหาของ pagefile ไม่ใช่ทั้งหมดที่ทำ

ตารางหน้าเป็นโครงสร้างในหน่วยความจำที่ใช้โดย MMU ของ CPU เพื่อดำเนินการแปลที่อยู่จากที่อยู่เสมือน (อีกครั้งไม่ใช่ที่หน้าไฟล์) ไปยังที่อยู่ทางกายภาพและโดยระบบปฏิบัติการเพื่อติดตามพื้นที่ที่อยู่เสมือนและช่วยแก้ไขข้อผิดพลาดของหน้า ตารางหน้าประกอบด้วยรายการตารางหน้า (PTE) PTE แต่ละตัวมีขนาด 8 ไบต์และกำหนด 4K ไบต์ของพื้นที่ที่อยู่เสมือน - นั่นคือหน้าเสมือนหนึ่งหน้า มีประมาณหนึ่ง PTE สำหรับแต่ละหน้าที่ไม่ว่างของพื้นที่ที่อยู่เสมือน

อย่างไรก็ตามถึงแม้ว่า pagefile สามารถประสบกับการแตกแฟรกเมนต์ทั้งภายนอกและภายใน (โดยปกติแล้วจะไม่ค่อยมีปัญหา แต่อย่างใดสามารถแก้ไขได้โดยการทำให้ไฟล์มีขนาดใหญ่ขึ้นสี่เท่าตามที่จำเป็น) ตารางหน้าไม่สามารถทำได้ พวกมันแยกส่วนอยู่แล้วและมันก็ไม่สำคัญอะไร

แต่ละ PTE มีบิต "ที่ถูกต้อง" สำหรับหน้า "ที่ถูกต้อง", aka "ที่อยู่อาศัย" PTE จะมีหมายเลขหน้าทางกายภาพที่สอดคล้องกับหมายเลขหน้าเสมือนที่เชื่อมโยงกับ PTE; สิ่งนี้ถูกใช้โดยตรงโดย MMU

สำหรับหน้า "ไม่ถูกต้อง" MMU จะยกข้อผิดพลาดของหน้าและ PTE นั้นจะมีรูปแบบและการตีความที่เป็นไปได้มากมาย

หมายเหตุ: ทั้งหมดข้างต้นใช้กับระบบปฏิบัติการใด ๆ ที่เปิดใช้งานการเพจใน x86 / x64 ต่อไปนี้เป็นส่วนใหญ่โดยเฉพาะกับ Windows แต่แนวคิดจำนวนมากนำไปใช้กับระบบปฏิบัติการอื่น ๆ ที่มีความแตกต่างในรายละเอียดของการใช้งาน

สำหรับหน้าในแคชหน้า PTE ยังคงมีหมายเลขหน้าจริง สำหรับเพจที่สูญหายจาก RAM และเขียนไปยัง pagefile PTE จะมีหมายเลข pagefile และอ็อฟเซ็ตภายใน pagefile ที่มีการเขียนเนื้อหาของหน้า เนื้อหา PTE ที่เป็นไปได้อื่น ๆ คือการอ้างอิงถึงตัวบอกที่อยู่เสมือนการอ้างอิงถึง "ต้นแบบ PTEs" อ้างอิงถึงความต้องการศูนย์หน้า ฯลฯ ซึ่งฉันจะไม่เข้าไป พอเพียงเพื่อบอกว่ามีเพียง PTE บางตัวเท่านั้นที่อ้างถึงที่ตั้งในหน้าไฟล์

ฉันพูดถึงทั้งหมดนี้ส่วนใหญ่เพื่อแสดงว่า pagefile และตารางหน้าในขณะที่เกี่ยวข้องไม่แน่นอนเหมือนกัน

ตารางหน้าถูกจัดระเบียบเป็นโครงสร้างแบบต้นไม้ มีทรีหรือคอลเลกชันของตารางหน้าแตกต่างกันสำหรับแต่ละกระบวนการ - นี่คือสิ่งที่อนุญาตให้แต่ละกระบวนการกำหนดอินสแตนซ์ของพื้นที่ที่อยู่เสมือนของตนเอง ตารางเพจที่รูทของทรีต้องอยู่ใน RAM ตลอดเวลา คนอื่น ๆ สามารถเพจได้; พวกเขายังไม่มีอยู่ที่พวกเขาจะสอดคล้องกับพื้นที่ขนาดใหญ่ (ขั้นต่ำ 2 MB) ของพื้นที่ที่ไม่ได้กำหนดหรือฟรีที่อยู่เสมือน

รายการตารางหน้าในตารางที่ "ใบไม้" ของต้นไม้ตรงกับหน้าของพื้นที่ที่อยู่เสมือน PTE ในตารางระดับสูงขึ้น - ใกล้กับรูท (และรูทนั้นเอง) - บอกตำแหน่งของตารางระดับล่างถัดไป (ถ้ามีอยู่)

หมายเลขที่แสดงโดย RAMmap คือหน่วยความจำกายภาพ (RAM) ที่ครอบครองโดยตารางหน้าของถิ่นที่อยู่ (ใน RAM) สำหรับกระบวนการทั้งหมดรวมถึงระบบปฏิบัติการ

สิ่งสำคัญคือระบบ OQ มี RAM 2.5 GB เชื่อมโยงกับหน้าตาราง นั่นหมายความว่าอย่างน้อยมีการกำหนดตารางเพจ 2.5 GB เนื่องจากหน้าตารางสามารถเพจได้เองขนาดเสมือนอาจใหญ่กว่าขนาดฟิสิคัลซึ่ง RAMmap ทั้งหมดสามารถแสดงให้เราเห็นได้ แต่ถือว่าเป็น "เท่านั้น" 2.5 GB ที่แปดไบต์ต่อ PTE นั่นคือประมาณ 320 ล้าน PTE เนื่องจากแต่ละ PTE กำหนดหนึ่งหน้า - 4K ไบต์ - ของพื้นที่ที่อยู่เสมือนนั่นหมายความว่ามากกว่า 1.2 เทราไบต์ของพื้นที่ที่อยู่เสมือนถูกกำหนดโดยตารางหน้าในหน่วยความจำ

นั่นเป็นไปไม่ได้ แต่มันค่อนข้างมาก

สำหรับการอ้างอิงในระบบของฉัน ATM ฉันมี RAM ประมาณ 125 MB ในตารางหน้า สิ่งนี้จะบ่งบอกถึงพื้นที่ที่อยู่เสมือนเพียง 65 GB เท่านั้น การใช้งานเสมือนจริงของฉันนั้นสูงขึ้นมาก (125 TB สำหรับกระบวนการ) แต่นั่นเป็นเพราะตารางหน้าส่วนใหญ่ไม่ได้อยู่ใน RAM "หน้าใหญ่" อีกอย่างหนึ่งที่ฉันไม่ควรเข้าไปที่นี่สามารถช่วยคิดอัตราส่วนต่าง ๆ ระหว่างขนาดของตารางหน้าเทียบกับขนาดของพื้นที่ที่อยู่เสมือนที่ใช้งานอยู่

ดังนั้น: เพื่อค้นหาผู้กระทำผิดก่อนอื่นฉันจะไปดูในการตรวจสอบประสิทธิภาพภายใต้หมวดหมู่กระบวนการสำหรับกระบวนการที่มีค่าตัวนับ "ไบต์เสมือน" สูง


4

Lenovo "RapidBoot Shield"เป็นผู้ร้ายสำหรับฉัน

หลังจากหนึ่งสัปดาห์โดยไม่มีการรีบูต "หน้าตาราง" ของฉันใช้ 4GB + มันกลับกลายเป็นว่าทุกกระบวนการที่สิ้นสุดนั้นติดอยู่รอบ ๆ โดยใช้ RAM 20K (ส่วนตัว 4K, ตารางหน้า 16K) ดังที่แสดงในแท็บ "กระบวนการ" ของ RamMap และมี ~ 200,000 คน!

การรีบูตช่วยลดรายการ แต่มันก็เริ่มเติบโตอีกครั้ง มันสามารถทำซ้ำได้โดยการเปิดแผ่นจดบันทึกฆ่ามันและสังเกตว่ามันอยู่ในรายการกระบวนการของ RamMap

ตามคำแนะนำเกี่ยวกับเธรดเทคนิคนี้ฉันถอนการติดตั้ง "RapidBoot Sheild" รีบูตเครื่องและจากนั้นกระบวนการจะไม่อยู่ต่อเมื่อถูกฆ่าอีกต่อไป แก้ไขปัญหา!


3

ในกรณีของเหล่านี้เป็นAksdf.sys และ Hardlock.sys ควบคุมตัวกรองจากคนขับรถ ฉันมีการจัดการเพื่อหาคำตอบที่ใช้ RAMMap ด้วย มันแสดงหน่วยความจำบริโภคโดยกระบวนการยุติ กระบวนการถูกลบออกจากรายการกระบวนการ Windows แต่ยังคงอยู่ในแผนผังหน่วยความจำ ไดรเวอร์ดูเหมือนจะป้องกันการยกเลิกกระบวนการอย่างสมบูรณ์


1

ฉันถามแผนกไอทีของฉันเกี่ยวกับเรื่องนี้และพวกเขาก็ไผ่เหมือนกัน ฉันลงเอยด้วยการใช้DriverEasyเพื่ออัพเดทไดรเวอร์ของฉัน สิ่งที่ดูเหมือนจะสร้างความแตกต่างอย่างน่าประหลาดก็คือไดรเวอร์จอภาพ ก่อนหน้านี้ฉันมีไดรเวอร์ "Generic PnP Monitor" มาตรฐานของ Windows แต่เมื่อฉันอัปเดตสิ่งเหล่านั้นให้เป็นยี่ห้อและรุ่นที่ถูกต้องของจอภาพปัญหาดูเหมือนจะหายไป


1

เปิดแท็บ "กระบวนการ" ใน RamMap และเรียงลำดับตามชื่อ ค้นหากระบวนการเดียวกันจำนวนมากอย่างน่าสงสัย ในเครื่องของฉัน "SynTPEnh.exe" เป็นผู้ร้าย (ส่วนหนึ่งของไดรเวอร์ทัชแพด) หลังจากเวลาผ่านไปหนึ่งสัปดาห์มีการรวบรวมข้อมูลหลายหมื่นรายการในตารางหน้าแต่ละขนาด 32kb

ขนาดตารางเพจของฉันคือ 1 GB หลังจากรีบูตเครื่องมีเพียง 50 MB

ป้อนคำอธิบายรูปภาพที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.