วิธีวินิจฉัยการใช้ OS X kernel_task และการใช้หน่วยความจำแบบมีสายบอลลูน


18

ฉันมีปัญหาที่แปลกมากซึ่งฉันมีปัญหาในการวินิจฉัยสาเหตุที่แท้จริง

ฉันมีMac Pro (2008, 8-core 2.8 GHz, 8800GT) พร้อม RAM ขนาด 14 GB (อัปเกรดเมื่อเร็ว ๆ นี้เนื่องจากปัญหานี้!)

เมื่อฉันบูตระบบและล็อกอิน vm_stat / top / Activity Monitor จะแสดงว่า kernel_task มีการจัดสรรประมาณ 150 MB และเครื่องมีหน่วยความจำแบบใช้สายประมาณ 800 MB

แม้ในตอนแรก 800 MB ดูเหมือนว่าจะมีการจัดสรรหน่วยความจำแบบใช้สายจำนวนมากโดยไม่มีแอปพลิเคชั่นทำงาน แต่มันก็แย่ลง (หมายเหตุ: สายถูกล็อคหน่วยความจำที่ไม่สามารถใช้งานได้)

หลังจากช่วงเวลาสั้น ๆ บางครั้งถูกทริกเกอร์โดยบางสิ่งที่ง่ายพอ ๆ กับการเปิดตัวเทอร์มินัล kernel_task จะส่งไปยังหน่วยความจำจริง (RSIZE) 8-900 MB และหน่วยความจำแบบใช้สายจะเร่งความเร็วไปที่ 1.6 GB RAM แบบมีสายในเคอร์เนล)

หากฉันออกจากทุกอย่าง (IE: ไม่มีแอปพลิเคชันที่กำลังทำงานอยู่ให้ตรวจสอบกิจกรรมหรือเทอร์มินัลเพื่อดูด้านบน) ไม่มีการลดลงอย่างเห็นได้ชัดใน kernel_task RSIZE หรือการใช้หน่วยความจำแบบมีสาย การไปในทางตรงกันข้ามและการโหลดระบบพร้อมงานก็แสดงให้เห็นว่าหน่วยความจำแบบใช้สายไม่ได้ลดลง - และที่สำคัญคือไม่ลดลงในการเลือกการแลกเปลี่ยนที่หนักหน่วง

หากฉันออกจากระบบและกลับเข้าสู่ระบบอีกครั้งจะลดลงเล็กน้อย (450 MB kernel_task, 1.28 GB Wired) แต่ไม่กลับสู่จุดเริ่มต้น

ฉันไม่ได้เรียกใช้kextแปลกประหลาดใด ๆ- และยิ่งกว่านั้น kextstat แสดงให้เห็นว่าไม่มีการจัดสรรหน่วยความจำขนาดใหญ่ที่นั่น; com.apple.nvidia.nv50hal ที่ใหญ่ที่สุดคือหน่วยความจำประมาณ 4 MB

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

ดังนั้นฉันมีคำถามสองสามข้อ:

1) มีวิธีที่ดีในการวิเคราะห์สิ่งที่จัดสรรหน่วยความจำแบบมีสายทั้งหมดนี้หรือไม่? บ่อยครั้งกว่าขนาด kernel_task 2 เท่าโดยไม่เรียกใช้แอปพลิเคชัน ยอดรวมหน่วยความจำที่แท้จริงดูเหมือนจะไม่เพิ่มขึ้น - ดูเหมือนว่ามี RAM จำนวนมากที่ไม่ได้ถูกคิดรวมอยู่ที่ใด

2) เกิดอะไรขึ้นที่จะทำให้เคอร์เนลต้องการหน่วยความจำมากถึง 6 เท่า?


1
อาจมีความเกี่ยวข้องกับcode.google.com/p/chromium/issues/detail?id=345664
jackkav

คำตอบ:


5

เพื่อตรวจสอบสาเหตุที่เคอร์เนลใช้หน่วยความจำมากกว่าปกติคุณสามารถใช้เครื่องมือต่าง ๆ ได้

  1. เรียกใช้การตรวจสอบกิจกรรมเพื่อตรวจสอบกระบวนการที่ใช้หน่วยความจำส่วนใหญ่ดังนั้นจึงเป็นได้ว่าkernel_taskไม่ใช่งานอื่น ๆ ที่ใช้หน่วยความจำมากกว่าปกติ
  2. เรียกใช้ใน Terminal vm_stat 1เพื่อดูสถิติหน่วยความจำตามเวลาจริงและหากหน่วยความจำของคุณเพิ่มขึ้นทุกวินาที
  3. เครื่องมือ Run fs_usage(as root) เพื่อตรวจสอบการโทรของระบบและข้อบกพร่องของหน้าเว็บแบบเรียลไทม์
  4. ในการตรวจสอบผลรวมของการจัดสรรสกปรก / ไม่ระบุชื่อของกระบวนการหลาย ๆ ตัวที่รันใน Terminal:

    sudo footprint -all -categories -swapped -collapseSharing
    

    มันจะรวบรวมข้อมูลหน่วยความจำเช่นปริมาณการแลกเปลี่ยน (ต่อผู้ใช้หรือหน่วยความจำเคอร์เนล)

  5. ยิ่งไปกว่านั้นถ้าคุณคิดว่าเป็นเคอร์เนลที่ใช้หน่วยความจำส่วนใหญ่ให้ลองzprintใช้เครื่องมือ:

    sudo zprint -t -s | head -n20
    

    มันจะแสดงข้อมูลเกี่ยวกับโซนเคอร์เนล

หากคุณต้องการบังคับให้แคชดิสก์ถูกลบทิ้ง (เพื่อเพิ่มหน่วยความจำ) คุณอาจลอง:

sync && sudo purge

ดูเพิ่มเติม: วิธีตรวจสอบการใช้งานหน่วยความจำเคอร์เนลสูงได้อย่างไร ที่ AD SE


3

ส่วนขยายเคอร์เนลเป็นเพียงหนึ่งในหลาย ๆ ชิ้นส่วนรหัสจำนวนมากที่สามารถดำเนินการโดยระบบปฏิบัติการโดยที่คุณไม่รู้ตัว ฉันมียูทิลิตี้ Python ขนาดเล็กที่เรียกว่า Consultant's Canary ซึ่งจะช่วยให้คุณค้นหาได้บ้าง:

ถ้านั่นไม่เปิดโอกาสให้ผู้ร้ายเกิดอะไรขึ้นฉันก็จะบอกว่าบู๊ตจากการติดตั้งใหม่ทั้งหมดและดูว่าคุณสามารถสร้างปัญหาขึ้นมาใหม่ได้หรือไม่

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