ทำไม OS X ใช้ swap เมื่อมี“ หน่วยความจำที่ไม่ได้ใช้งาน” จำนวนมาก?


22

ฉันใช้ OS X จากไม่กี่เดือน (Lion และตอนนี้ Mountain Lion) ฉันมีมินิของฉัน 8 GB และเกือบทุกวันตอนนี้มันใกล้เคียงกับมันแล้ว บนเครื่อง Windows 7 ที่มี 8 GB ฉันไม่เคยมีปัญหาแบบนั้น อย่างไรก็ตามฉันอ่านผ่านเน็ตว่าหน่วยความจำที่ไม่ใช้งานคือแคชแอพของโปรแกรมที่เพิ่งปิดและสามารถใช้สำหรับการเปิดใหม่ได้เร็วขึ้นและหน่วยความจำที่ไม่ได้ใช้งานนี้สามารถปล่อยให้แอปใหม่ได้ถ้าจำเป็น มันไม่ได้เปิดตัว แต่ OS X จะเริ่มทำการแลกเปลี่ยน ดังนั้นคำถามของฉันคือทำไม OS X ใช้ swap เมื่อมี "หน่วยความจำไม่ได้ใช้" มาก? นี่คือหน้าจอที่แสดงสิ่งที่ฉันหมายถึง:

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

ฉันหวังเป็นอย่างยิ่งว่าจะมีอะไรอีกมากมายที่จะทำให้ OS X ใช้งาน 2.69 GB ก่อนที่จะทำการแลกเปลี่ยนฉันทำจริงๆ


ใช่มันแปลก เป็นแอปพลิเคชั่นเดียวที่ใช้ RAM ทั้งหมดหรือไม่ บางที OSX จำกัด แอปพลิเคชั่นไม่ให้ใช้ RAM มากกว่า 80% ในคราวเดียว ไม่ใช้งานไม่ได้หมายความว่าฟรี มันถูกสงวนไว้สำหรับบางสิ่ง
Piotr Kula

ไม่ - มีแอพเบราว์เซอร์ Eclipse และอื่น ๆ มากมายจากสิ่งที่ฉันอ่านมันฟรีเพราะเป็นแอพที่เพิ่งปิดแคชควรมีวิธีทำให้ OS X ไม่สลับเมื่อมีหน่วยความจำที่ไม่ได้ใช้งาน
Balchev

ฉันสามารถทำซ้ำได้ตลอดเวลาและสามารถสร้างหน้าจอของการตรวจสอบกิจกรรมหากจำเป็น
Balchev

2
หน่วยความจำที่ไม่ได้ใช้งานไม่ใช่หน่วยความจำที่ว่าง
kinokijuf

2
@kinokijuf อย่างไรก็ตามควรทำหน้าที่เป็นหน่วยความจำว่างเมื่อไม่มีหน่วยความจำว่าง หากหน่วยความจำที่ไม่ได้ใช้งานถูกสลับไปยังดิสก์อยู่ตลอดเวลาจะไม่มีจุดที่แท้จริงในการแยกความแตกต่างที่แอ็คทีฟ - ไม่ใช้งาน
Pieter

คำตอบ:


18

เห็นได้ชัดว่าการแลกเปลี่ยนเกิดขึ้นเมื่อหน้า RAM ที่ไม่ได้ใช้งานทำงานจริง

( อัปเดต:เนื่องจากมีความชัดเจนในความคิดเห็นนี่ไม่ใช่กรณีของคุณดังนั้นผู้ที่มีปัญหาเดียวกันสามารถข้ามไปยังกฎแนวนอนได้)

นั่นคือคุณมีโปรแกรมมากมายที่รันและเคอร์เนลสลับบางหน้า จากนั้นคุณเลิกโปรแกรมบางโปรแกรม เคอร์เนลทำเครื่องหมายหน้าเพจ RAM ว่าไม่ทำงาน แต่จะไม่สลับหน้ากลับไปที่ RAM จนกว่าจะต้องใช้หน้าเหล่านี้ ซึ่งส่งผลให้มีหน้าทั้งที่ไม่ใช้งานและสลับเปลี่ยน

ทำไมไม่แลกหน้าใน preemptively? เพราะนั่นจะเป็นการเดิมพันกับราคา: ในระยะยาวคุณจะแพ้ ลองนึกถึงตัวอย่างง่าย ๆ : สองโปรแกรม A และ B ที่ไม่พอดีกับ RAM ในเวลาเดียวกัน โปรแกรม A ยังคงทำงานอยู่และหน้าที่สลับเปลี่ยนทั้งหมดเป็นของ A โปรแกรม B ได้ถูกเลิกใช้และหน้าทั้งหมดที่ไม่ได้ใช้งานเป็นของ B

หากเคอร์เนลสลับหน้าเพจ A ของ preemptively และ imediately หลังจาก:

  • โปรแกรม A ต้องการเข้าถึงหน้ามัน -> คุณชนะ - หน้าต่างๆอยู่ใน RAM แล้ว
  • คุณเปิด B อีกครั้ง -> คุณแพ้ - คุณ "จ่าย" ค่าใช้จ่ายในการนำหน้าเว็บไปที่ RAM และตอนนี้คุณต้องส่งมันกลับมา
  • คุณเปิดโปรแกรมอื่น C -> คุณจะเสียถ้า A และ C ไม่พอดีกับ RAM ในเวลาเดียวกัน หากพวกเขาพอดีคุณจะได้

นอกจากนี้ยังคำนึงถึงว่าการแลกเปลี่ยน (เขียนไปยังดิสก์) มีราคาแพงกว่าการแลกเปลี่ยน (อ่านจากดิสก์) ซึ่งทำให้ "เดิมพัน" นี้ยิ่งขี้เหร่มากขึ้น

กล่าวโดยย่อ: เชื่อใจเคอร์เนลของคุณและอย่าพยายามเอาชนะมัน


อัปเดต: ปรากฎว่าหน่วยความจำที่ไม่ได้ใช้งานไม่ทำงานเนื่องจากการใช้การตรวจสอบกิจกรรมเพื่ออ่านบทความหน่วยความจำระบบทำให้หลายคนเชื่อว่ามันใช้งานได้ คำจำกัดความที่ให้ไว้ในบทความสำหรับหน่วยความจำที่ไม่ได้ใช้งานถูกต้อง:

ข้อมูลนี้อยู่ในหน่วยความจำ RAM แต่ไม่ได้ใช้งานอย่างรวดเร็ว แต่ก็ถูกใช้งานเมื่อไม่นานมานี้

แต่ตัวอย่างต่อไปนี้เป็นความเข้าใจผิดและเข้าใจง่ายเกินไป (เช่นตัวอย่างของฉันที่จะเปิดเผย):

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

ฉันค้นหาแหล่งข้อมูลออนไลน์เพิ่มเติมและจบลงที่หัวข้อนี้ในรายการส่งเมลเคอร์เนลของดาร์วินซึ่งค่อนข้างมีข้อมูล Quoting Jim Magee (จากทีมดาร์วิน - ฉันคิดว่า):

กล่าวโดยย่อคือระบบเคอร์เนล VM เมื่อต้องรับมือกับความดันหน่วยความจำจะสแกนผ่านหน้าเว็บที่ใช้งานอยู่และพยายามรักษาระดับความสมดุลระหว่างการทำเครื่องหมายที่ใช้งานและไม่ได้ใช้งาน หน้าเว็บที่ไม่ใช้งานจะถูกสแกนเพื่อนำมาใช้ซ้ำในขณะที่ทำเครื่องหมายว่าไม่ใช้งาน หากมีการใช้ซ้ำหน้าเหล่านั้นจะถูกทำเครื่องหมายเป็นใช้งานอยู่และหน้าอื่น ๆ จะต้องย้ายจากใช้งานเป็นสถานะไม่ใช้งานเพื่อตรวจสอบว่ามีการใช้งานอยู่หรือไม่ ดังนั้นการไม่ใช้งานจึงเป็นการเรียกชื่อผิด มันเป็นชวเลขสำหรับ "อาจไม่ได้ใช้งานให้ลองยืนยันว่า"

ตามที่คุณค้นพบยอดคงเหลือภายในที่เรา (ปัจจุบัน) ตั้งเป้าไว้คือประมาณ 2/3 ที่ใช้งานอยู่กับ 1/3 ที่ไม่ได้ใช้งาน ...

สิ่งนี้อธิบายพฤติกรรมที่คุณสังเกตเห็น เช่นหน้าเว็บที่ไม่ใช้งานซึ่งคุณเห็นว่าเป็นของโปรแกรมที่ไม่ได้ใช้งาน ดังนั้นเมื่อคุณเริ่มโปรแกรมใหม่หน้าเว็บที่ไม่ใช้งานจะถูกสลับเป็น ในเวลาเดียวกันหน้าเว็บจากโปรแกรมอื่น ๆ ถูกทำเครื่องหมายว่าไม่ใช้งานเพื่อรักษาอัตราส่วน 2/1 ของการใช้งานกับการไม่ใช้งาน

ด้ายนอกจากนี้ยังมีคำแนะนำบางอย่างที่จะเรียนรู้เพิ่มเติมเกี่ยวกับ internals ดาร์วิน นอกจากนี้ยังมีข้อเสนอแนะบางอย่างในกรณีที่คุณเริ่มตรวจสอบการใช้หน่วยความจำเนื่องจากปัญหาเกี่ยวกับ beachball (ซึ่งมักจะมีส่วนเกี่ยวข้องกับเรื่องนี้เล็กน้อย)

ข้อสรุปยังคงเหมือนเดิม: วางใจเคอร์เนลของคุณและอย่าพยายามเอาชนะใคร :-)


1
สวัสดีไม่แน่ใจว่าคุณเข้าใจฉัน - ฉันกำลังพูดถึงช่วงเวลาที่คุณมีหน่วยความจำฟรีเช่น 100-200MB, 2.6 GB "ไม่ได้ใช้งาน" และเริ่มโปรแกรมอื่นให้พูด eclipse, xcode และอื่น ๆ สิ่งที่เกิดขึ้นคือมันไม่ได้ใช้ 2.6 GB และแลกเปลี่ยนแทนจาก memory.Not ใช้งานแน่ใจว่าคุณจะได้รับสิ่งที่ฉัน mean.Anyway ขอบคุณสำหรับคำตอบของคุณ
Balchev

ตอนนี้ชัดเจนแล้ว บางทีคุณควรเพิ่มตัวอย่างในความคิดเห็นนี้ในคำถามของคุณ ฉันได้เพิ่มข้อมูลเพิ่มเติมซึ่งฉันคิดว่าให้คำอธิบายที่เพียงพอสำหรับสิ่งที่คุณสังเกต
m000

ไม่แน่ใจว่าฉันจะแก้ไขคำตอบเดิมของฉันได้ไหม มันอธิบายกรณีอื่น (เนื่องจากฉันไม่ได้รับคำถามของคุณก่อนความคิดเห็นของคุณ) และอาจทำให้ผู้คนสับสน
m000

ดังนั้นตามที่ Radoo กล่าวในความคิดเห็นของเขา - "OS X เป็นสัตว์ร้ายที่หิวโหย" ฉันไม่ได้คาดหวังว่า OS X จะหิวมากหน่วยความจำ (ทั้ง Lion และตอนนี้ Mountain Lion) และนั่นเป็นสาเหตุที่ฉันคิดว่ามีบางอย่างที่นี่คาวขอขอบคุณสำหรับคำตอบที่อัพเดตของคุณ
Balchev

6

คุณสามารถปิดใช้งานการเพจได้อย่างปลอดภัยหากคุณมี RAM เพียงพอ

ลองใช้คำสั่งเหล่านี้

sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.dynamic_pager.plist
sudo rm /private/var/vm/swapfile*

จากนั้นรีสตาร์ทและตรวจสอบว่ากระบวนการ dynamic_pager ไม่ทำงานอีกต่อไป

ให้แน่ใจว่าไม่มี swapfiles /private/var/vm/ถูกสร้างขึ้นใน

หากต้องการเปิดใช้งานลองคำสั่งต่อไปนี้อีกครั้ง:

sudo launchctl load -wF /System/Library/LaunchDaemons/com.apple.dynamic_pager.plist

คุณยังสามารถปิดการใช้งาน Spotlight เพื่อเพิ่ม RAM และลดกิจกรรมของดิสก์ คำสั่งต่อไปนี้ใช้เพื่อปิดใช้งานและเปิดใช้งาน Spotlight

sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.metadata.mds.plist
sudo launchctl load -wF /System/Library/LaunchDaemons/com.apple.metadata.mds.plist

ฉันอ่านผ่านเน็ตที่ปิดการใช้งานการสลับบน OSX อาจนำไปสู่พฤติกรรมที่ไม่คาดคิดของระบบและขัดข้อง มันเป็นเรื่องจริงเหรอ?
Balchev

เมื่อหน่วยความจำของคุณอยู่ในระดับต่ำมันจะ แต่ถ้าคุณมีหน่วยความจำเพียงพอเช่น 8 Gb จะไม่ทำให้เกิดปัญหาใด ๆ
arundevma

2
“ หน่วยความจำเพียงพอเช่น 8 Gb” - ขอโทษมันน่ารักมาก… :)
Bombe

0

มีไม่มากที่คุณสามารถทำได้ ทำไมมันทำอย่างนั้น? เพราะมันเป็นเพียงการทำงานของ OS X ส่วนที่น่าสนใจคือหน่วยความจำที่ถูกครอบครองมีขนาดใหญ่ขึ้นทุกครั้งที่เครื่อง Mac ได้รับ

คุณทำอะไรได้บ้าง:

  1. อัพเกรดแรม
  2. เรียกใช้คำสั่ง " purge " อันศักดิ์สิทธิ์เพื่อล้างหน่วยความจำที่ไม่ได้ใช้งานส่วนใหญ่เมื่อใดก็ตามที่จำเป็น
  3. ปิดใช้งานการแลกเปลี่ยนhttp://osxdaily.com/2010/10/08/mac-virtual-memory-swap/

สวัสดีฉันใช้คำสั่งล้างข้อมูล แต่ส่วนใหญ่เวลาว่างน้อยกว่าครึ่งหนึ่งของหน่วยความจำ "ไม่ได้ใช้งาน" ฉันอ่านว่าการปิดการใช้งาน swap บน OSX อาจนำไปสู่พฤติกรรมที่ไม่คาดคิดของระบบและล่มดังนั้นฉันไปกับ 1) ตอนนี้มันใช้ได้ดีกับ 16 gb :) เพียงแค่จำนวนหน่วยความจำที่ใช้สำหรับเซิร์ฟเวอร์ไม่ใช่บนเดสก์ท็อป :) คำตอบของคุณ
Balchev

ฉันมี 16GB บน Macbook pro ของฉันนั่นไม่ใช่เซิร์ฟเวอร์ :) เป็นที่ทราบกันดีว่า OS X เป็นสัตว์ร้ายที่หิวกระหายเมื่อพูดถึงหน่วยความจำโดยเฉพาะอย่างยิ่งเมื่อมีการใช้แอปขนาดกลาง / ใหญ่หลายรายการพร้อมกัน ฉันจัดการให้เต็ม 16GB ทั้งหมดโดยไม่ต้องเปิดซอฟต์แวร์แก้ไขภาพ / วิดีโอเพียงแค่เกมและแอพขนาดเล็ก หน่วยความจำที่ไม่ได้ใช้งานอยู่ที่ประมาณ 4GB ...

คุณต้องคำนึงว่าแอพ OS X จำนวนมากเป็น 64 บิตอยู่แล้ว แอพ 64 บิตจัดสรรหน่วยความจำได้มากกว่าแอพ 32 บิตเนื่องจากการจัดการพื้นที่ว่างให้ใหญ่ขึ้น

0

ระบบทำงานตามที่ออกแบบไว้ แม้ว่าจะไม่มีแรงกดดันด้านหน่วยความจำ แต่ก็สามารถเขียนหน้าบางอย่างที่ไม่สามารถทิ้งได้ แต่ไม่ได้ใช้เพื่อสลับเมื่อระบบไม่ว่าง ด้วยวิธีนี้หากมีแรงกดดันหน่วยความจำในภายหลังหน้าเหล่านี้สามารถขับออกจาก RAM โดยไม่ต้องเขียนเพื่อสลับก่อนในขณะที่ระบบไม่ว่าง


1
มันออกแบบมาไม่ดีแล้ว มันก้าวร้าวเกินไปในการจัดสรรและใช้พื้นที่สว็อป
mendota

ทำไมมันถึงสำคัญ? หากมีการแลกเปลี่ยนจำนวนมากฟรีการจัดสรรพื้นที่สว็อปไม่มีอันตราย นี่เป็นเรื่องจริงโดยเฉพาะอย่างยิ่งเมื่อการสลับไม่มีข้อมูลที่ต้องการเนื่องจากการลบการจัดสรรไม่มีค่าใช้จ่าย นี่คือการออกแบบที่ดี - ทำงานหนักเมื่อมันเกือบจะไร้ค่าแทนที่จะชะลอตัวลงไปในภายหลังเมื่อระบบอยู่ภายใต้แรงกดดัน
David Schwartz

2
มันเป็นการออกแบบที่ไม่ดีเมื่อมันก้าวร้าวเกินไปและทำให้เกิดการพูดติดอ่างหรือแฮงค์ในโปรแกรมที่ผิดพลาดแท็กเป็นไม่ได้ใช้งานและเริ่มเปลี่ยนเป็น swap ในขณะที่มีอีกแปดกิ๊กฟรีใน RAM: /
mendota

ฉันเห็นด้วยกับ mendota เมื่อฉันปิดการใช้งาน swap อย่างสมบูรณ์ระบบของฉันก็จะทำงานได้อย่างราบรื่นโดยไม่มีการพูดติดอ่าง
Anton Kuzmin

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