ทำไมการใช้งาน swap ถึงแม้ว่าฉันจะมีแรมมากมาย


208

ฉันคิดว่าสาระสำคัญทั้งหมดของการแลกเปลี่ยนคือการทำหน้าที่เป็นเครือข่ายความปลอดภัยในการจัดเก็บชั่วคราวเมื่อ RAM เต็ม แต่พาร์ติชัน swap ของฉันถูกใช้อย่างต่อเนื่องแม้ว่าบางครั้งฉันจะมี RAM ว่าง 3GB มากเท่า เป็นเรื่องปกติหรือไม่


3
กรุณาแบ่งปันเนื้อหาหรือผลของคำสั่งดังต่อไปนี้ / ไฟล์ให้ดีขึ้นช่วยให้เราแก้ไขปัญหาของคุณ( คำแนะนำในคำตอบนี้ ) : free -m,top -b 1
ish

จะอัปเดตคำถามด้วย Pastebins ของคำสั่งเหล่านั้นในวันพรุ่งนี้ ตอนนี้เวลา 12.00 น.: (
Mysterio

ฉันควรแก้ไขชื่อเพื่อเพิ่ม "... แต่ฉันง่วงเกินไปที่จะดูแลตอนนี้ดังนั้นพวกคุณงีบด้วย": P
ish

คำตอบ:


188

คุณสามารถลองเปลี่ยนค่า "swappiness" ของคุณ:

จากคำถามที่พบบ่อยของ Ubuntu :

Swappiness คืออะไรและฉันจะเปลี่ยนได้อย่างไร

พารามิเตอร์ swappiness ควบคุมแนวโน้มของเคอร์เนลเพื่อย้ายกระบวนการออกจากหน่วยความจำกายภาพและไปยัง swap disk เนื่องจากดิสก์ช้ากว่า RAM มากอาจทำให้เวลาตอบสนองช้าลงสำหรับระบบและแอปพลิเคชันหากกระบวนการย้ายหน่วยความจำออกจากหน่วยความจำมากเกินไป

  1. swappiness สามารถมีค่าระหว่าง 0 ถึง 100

  2. swappiness = 0 บอกเคอร์เนลเพื่อหลีกเลี่ยงการสลับกระบวนการออกจากหน่วยความจำกายภาพนานที่สุด สำหรับเคอร์เนลเวอร์ชั่น 3.5 และใหม่กว่าจะปิดการแลกเปลี่ยน

  3. swappiness = 100 บอกเคอร์เนลให้ทำการสลับกระบวนการอย่างหนักหน่วงออกจากหน่วยความจำกายภาพและย้ายมันเพื่อแลกเปลี่ยนแคช

การตั้งค่าเริ่มต้นใน Ubuntu คือ swappiness = 60 การลดค่าเริ่มต้นของ swappiness อาจจะช่วยปรับปรุงประสิทธิภาพโดยรวมสำหรับการติดตั้ง Ubuntu บนเดสก์ท็อปทั่วไป ขอแนะนำค่า swappiness = 10 แต่อย่าลังเลที่จะทดสอบ หมายเหตุ: การติดตั้งเซิร์ฟเวอร์ Ubuntu มีข้อกำหนดด้านประสิทธิภาพที่แตกต่างกันสำหรับระบบเดสก์ท็อปและค่าเริ่มต้นที่ 60 น่าจะเหมาะสมกว่า

เพื่อตรวจสอบค่า swappiness

cat /proc/sys/vm/swappiness

ในการเปลี่ยนค่า swappiness คุณสามารถทำการเปลี่ยนแปลงชั่วคราว (หายไปเมื่อรีบูต) ด้วยค่า swappiness ที่ 10

sudo sysctl vm.swappiness=10

หากต้องการทำการเปลี่ยนแปลงอย่างถาวรให้แก้ไขไฟล์กำหนดค่าด้วยเครื่องมือแก้ไขที่คุณชื่นชอบ:

gksudo gedit /etc/sysctl.conf

ค้นหา vm.swappiness และเปลี่ยนค่าตามต้องการ หาก vm.swappiness ไม่มีอยู่ให้เพิ่มลงในส่วนท้ายของไฟล์ดังนี้:

vm.swappiness=10

บันทึกไฟล์และรีบูต

นอกจากนี้คุณสามารถตรวจสอบ: https://askubuntu.com/a/103916/54187


1
การเก็งกำไรไม่ได้ทำงาน: สิ่งนี้อาจเป็นประโยชน์ต่อประสิทธิภาพการทำงาน - หน้าเว็บที่ไม่ได้รับการเข้าถึงในขณะที่สามารถคัดลอกเพื่อสลับพื้นที่ซึ่งช่วยให้ระบบปฏิบัติการที่จะขับไล่พวกเขาได้อย่างรวดเร็วหากต้องการหน่วยความจำ แต่เนื้อหาหน้ายังคงอยู่ในหน่วยความจำ .
Simon Richter

7
@SimonRichter ใช่นั่นคือความคิด Swappiness of 60 อาจจะรุนแรงเกินไปในระบบที่ทันสมัยเนื่องจากนั่นหมายความว่าคุณเริ่มเปลี่ยนไปเมื่อคุณยังมีหน่วยความจำฟรีหลายกิ๊ก
เบรนแดน Long

1
เรียกใช้sudo sysctl --load=/etc/sysctl.confหลังจากแก้ไขไฟล์เพื่อใช้การเปลี่ยนแปลง
deFreitas

92

คำถามของคุณมีแง่มุมที่แตกต่างกันเล็กน้อย

ประการแรกความหมายของคำว่า "ฟรี" คืออะไร มันไม่ง่ายอย่างที่คิดใน Linux (หรือระบบปฏิบัติการที่ทันสมัย)

Linux ใช้ RAM อย่างไร (ลดความซับซ้อนลง)

แต่ละแอปพลิเคชันสามารถใช้หน่วยความจำบางส่วนของคุณ Linux ใช้หน่วยความจำที่ว่างอยู่ทั้งหมด (ยกเว้นในช่วงไม่กี่ Mb ล่าสุด) เป็น "แคช" ซึ่งรวมถึงแคชของหน้าแคช inode เป็นต้นสิ่งนี้เป็นสิ่งที่ดี - ช่วยเพิ่มความเร็วของกอง ทั้งการเขียนไปยังดิสก์และการอ่านจากดิสก์สามารถเร่งความเร็วได้อย่างมากด้วยแคช

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

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

นี่ไม่ใช่สถานการณ์ที่ใช้เฉพาะกับ Linux - ระบบปฏิบัติการที่ทันสมัยทั้งหมดทำงานด้วยวิธีนี้ ระบบปฏิบัติการที่แตกต่างกันอาจรายงานว่า RAM ว่างแตกต่างกัน: บางระบบมีแคชเป็นส่วนหนึ่งของสิ่งที่พวกเขาพิจารณาว่า "ฟรี" และบางระบบอาจไม่

เมื่อคุณพูดถึงแรมฟรีมันมีความหมายมากกว่าที่จะรวมแคชเพราะมันฟรีจริง - มันใช้ได้ถ้าแอปพลิเคชันใด ๆ ร้องขอมัน บน Linux freeคำสั่งรายงานทั้งสองวิธีบรรทัดแรกมีแคชในคอลัมน์ RAM ที่ใช้และบรรทัดที่สองมีแคช (และบัฟเฟอร์) ในคอลัมน์ว่าง

Linux ใช้การแลกเปลี่ยนอย่างไร (ลดความซับซ้อนมากยิ่งขึ้น)

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

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

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

มีสถานการณ์ที่รู้จักกันดีว่าการสลับเป็นอันตรายต่อประสิทธิภาพการรับรู้บนระบบเดสก์ท็อปและนั่นคือความรวดเร็วของแอปพลิเคชันที่สามารถตอบสนองการป้อนข้อมูลของผู้ใช้อีกครั้งหลังจากที่ไม่ได้ใช้งานเป็นเวลานาน สำรองข้อมูลข้ามคืน) ทำงาน นี่เป็นความซบเซาที่มองเห็นได้ แต่ไม่เพียงพอที่จะพิสูจน์ว่าการปิดสวิตช์ทั้งหมดเข้าด้วยกันและยากมากที่จะป้องกันในระบบปฏิบัติการใด ๆ ปิดการสลับและความเชื่องช้าเริ่มต้นหลังจากการสแกนสำรอง / ไวรัสอาจไม่เกิดขึ้น แต่ระบบอาจทำงานช้าลงเล็กน้อยตลอดทั้งวัน นี่ไม่ใช่สถานการณ์ที่ จำกัด เฉพาะ Linux เช่นกัน

เมื่อเลือกสิ่งที่จะสลับไปยังดิสก์ระบบจะพยายามเลือกหน่วยความจำที่ไม่ได้ใช้จริง - อ่านหรือเขียนจาก มันมีอัลกอริธึมที่ค่อนข้างง่ายสำหรับการคำนวณสิ่งนี้ซึ่งเลือกได้เกือบตลอดเวลา

หากคุณมีระบบที่คุณมี RAM จำนวนมาก (ในขณะที่เขียน, 8GB เป็นจำนวนมากสำหรับ distro Linux ทั่วไป) จากนั้นคุณแทบจะไม่เคยเจอสถานการณ์ที่จำเป็นต้องมีการแลกเปลี่ยนเลย คุณอาจลองปิดการแลกเปลี่ยน ฉันไม่เคยแนะนำให้ทำเช่นนั้น แต่เพียงเพราะคุณไม่เคยรู้เมื่อ RAM เพิ่มเติมอาจช่วยให้คุณประหยัดจากแอพพลิเคชั่นหยุดทำงาน แต่ถ้าคุณรู้ว่าคุณไม่ต้องการมันคุณก็สามารถทำได้

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

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

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

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

เมื่อข้อมูลอยู่ในการแลกเปลี่ยนข้อมูลจะออกมาอีกเมื่อใด

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


5
+1 สำหรับคำอธิบายโดยละเอียด ฉันยังต้องการเก็บสลับ 2GiB ในคอมพิวเตอร์ของฉัน หากมีสิ่งใดไม่ดี - การรั่วไหลของหน่วยความจำ ฯลฯ คุณสามารถเห็นการสลับขึ้นและค้นหาปัญหาก่อนที่หน่วยความจำจะเกิดขึ้น มันเป็นเครือข่ายความปลอดภัยเช่นเดียวกับเครื่องมือประสิทธิภาพ
Joe

1
บนเน็ตบุ๊กของฉันซึ่งมี RAM เพียง 2GB ฉันยังคงสลับ 4GB นี่เป็นเพราะฉันใช้เน็ตบุ๊กมากกว่าที่ตั้งใจไว้และโปรแกรมของฉันมักต้องการหน่วยความจำมากกว่า 2GB เนื่องจากลีนุกซ์ทำงานได้ไม่ดีนักเมื่ออยู่ในสถานการณ์หน่วยความจำไม่เพียงพอฉันจึงอยากมีเครือข่ายความปลอดภัยขนาดใหญ่ และฉันมีพื้นที่ดิสก์มากมาย
Scott Severance

หากโปรแกรมของคุณต้องการหน่วยความจำมากกว่า 2GB บ่อยครั้งฉันควรพิจารณาการเพิ่ม RAM ในนั้น (มันราคาถูกมาก!) เพราะ RAM ที่หมดไปนั้นจะส่งผลเสียต่อประสิทธิภาพการทำงาน เพื่อประโยชน์ของผู้อ่านอื่น ๆ : ทำให้ว่าคุณไม่ได้เพียงแค่มองไปที่หน่วยความจำแคชซึ่งเป็นที่ควรจะหมู RAM ที่มี - free -mดูอ้างอิงอื่น
thomasrutter

2
@neon_overload: ฉันควรทราบว่าตาม HP, RAM สูงสุดของเน็ตบุ๊กของฉันคือ 1GB ตอนนี้ฉันมี 2GB แล้วและแหล่งอินเทอร์เน็ตแนะนำว่า 2GB นั้นสูงสุดจริง ดังนั้นความจำเป็นในการแก้ไขปัญหาเหล่านี้
Scott Severance

@thomasrutter: คำตอบของคุณเปลี่ยนไปอย่างไรสำหรับเซิร์ฟเวอร์ขนาดใหญ่หนึ่งในของฉันมี 1TB (ใช่หนึ่งเทราไบต์เต็ม) ของ RAM และยังคงใช้ swap; การตั้งค่าความรวดเร็วแบบใดและพาร์ทิชั่นการแลกเปลี่ยนขนาดที่คุณจะแนะนำ
chrisinmtown

24

การตั้งค่า swappiness ไม่ทำงานในทุกสถานการณ์ ถ้ามันเหมาะกับคุณมาก ถ้าไม่ฉันได้เขียนสคริปต์เพื่อล้าง swap เป็นระยะโดยการปิดและเปิดใหม่อีกครั้ง

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

#!/bin/bash

# Make sure that all text is parsed in the same language
export LC_MESSAGES=en_US.UTF-8
export LC_COLLATE=en_US.UTF-8
export LANG=en_US.utf8
export LANGUAGE=en_US:en
export LC_CTYPE=en_US.UTF-8

# Calculate how much memory and swap is free
free_data="$(free)"
mem_data="$(echo "$free_data" | grep 'Mem:')"
free_mem="$(echo "$mem_data" | awk '{print $4}')"
buffers="$(echo "$mem_data" | awk '{print $6}')"
cache="$(echo "$mem_data" | awk '{print $7}')"
total_free=$((free_mem + buffers + cache))
used_swap="$(echo "$free_data" | grep 'Swap:' | awk '{print $3}')"

echo -e "Free memory:\t$total_free kB ($((total_free / 1024)) MB)\nUsed swap:\t$used_swap kB ($((used_swap / 1024)) MB)"

# Do the work
if [[ $used_swap -eq 0 ]]; then
    echo "Congratulations! No swap is in use."
elif [[ $used_swap -lt $total_free ]]; then
    echo "Freeing swap..."
    swapoff -a
    swapon -a
else
    echo "Not enough free memory. Exiting."
    exit 1
fi

คุณต้องเรียกใช้สคริปต์นี้ในฐานะ root (เช่นด้วยsudo) สคริปต์นี้จะไม่ทำให้ระบบของคุณไม่ตอบสนอง หากคุณมี RAM ไม่เพียงพอก็จะปฏิเสธที่จะสลับสลับ ฉันใช้สคริปต์นี้โดยไม่มีปัญหามาเกือบห้าปีแล้ว


+1 สำหรับสคริปต์ คุณอาจต้องการปรับให้ทันสมัยขึ้นเล็กน้อยโดยการเปลี่ยน MB เป็น MiB ในผลลัพธ์ ฉันเขียนสคริปต์ที่คล้ายกันโดยไม่มีการทดสอบความปลอดภัย (ดี) ทั้งหมดที่คุณมี ในสมุดบันทึกเก่าของฉันที่มีการใช้ swap อย่างหนักมันต้องใช้เวลาสักครู่ในการรัน - หนึ่งหรือสองนาที แต่ไม่ได้ทำร้ายอะไรเลย เมื่อสักครู่มันจะล้มเหลวเพราะมีหน่วยความจำว่างไม่เพียงพอที่จะให้ทำงาน แต่นั่นก็ไม่ได้ทำให้เกิดปัญหาใด ๆ เพิ่มเติม ฉันต้องรีบูทเพื่อล้างสิ่งต่าง ๆ เมื่อมันเกิดขึ้น มันเกี่ยวข้องกับสิ่งที่ดูเหมือนว่าหน่วยความจำรั่วในระบบส่งกำลัง (ตั้งแต่ฉันได้รับการแก้ไขแล้ว) และมี ram เพียง 2GiB
Joe

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

@neon: จำไว้ว่าเครื่องของฉันมี RAM 2GB และ 3GB ตามลำดับซึ่งค่อนข้างน้อยในปัจจุบัน หลักฐานอยู่ในการปฏิบัติงาน ตัวอย่างเช่นการนำเมนูขึ้นมาหรือการสลับโปรแกรมอาจช้าเนื่องจากการสลับสับเปลี่ยนเช่นเดียวกับเอฟเฟ็กต์ visosal Compos ความเชื่องช้านี้ได้รับการรักษาโดยการสลับการสลับดังนั้นแสดงให้เห็นว่าอย่างน้อยในบางสถานการณ์อัลกอริธึมการปรับให้เหมาะสมของเคอร์เนลนั้นไม่ดีเท่าที่ควร ฉันไม่สามารถโต้เถียงกับประสบการณ์ซ้ำ
Scott Severance

วุ้ย!! นี่เพิ่งเพิ่มเป็น 0% ของการแลกเปลี่ยน .... ฉันไม่มีเวลามากพอที่จะค้นหาคำถามและคำตอบที่สมบูรณ์ แต่ฉันชอบที่จะอ่านเมื่อฉันได้รับเวลาว่าง
AzkerM

ทำไมคุณไม่ตั้งค่าความรวดเร็วให้เป็นค่าต่ำ? ดูเหมือนว่าจะทำในสิ่งเดียวกันกับสคริปต์ของคุณ แต่ในแบบที่ควบคุมได้มากกว่า
jhfrontz

4

โดยทั่วไปการแลกเปลี่ยนยังคงไม่ได้ใช้ในระบบในปัจจุบัน จากประสบการณ์ของผมกระบวนการที่กำลังทำงานเป็นเวลานานโดยไม่ต้องมีการดำเนินการอย่างเข้มข้นถูกเปลี่ยนเป็นลินุกซ์
ทำให้โปรแกรมที่ได้รับผลกระทบบางตัวทำงานช้า
หากคุณมี ram จำนวนมากคุณสามารถปิดการสลับได้โดยเรียกใช้คำสั่ง:
swapoff -av(คุณต้องมีsudoสิทธิ์สำหรับมัน)
หากคุณไม่ชอบการปิด swap คุณสามารถเปิดสวิตช์ได้โดยใช้คำสั่งแบบสมมาตร:
swapon -av( sudoต้องการอีกครั้ง)


12
เปิดแลกออกทั้งหมดเป็น overkill ตั้งแต่ swapiness = 0 จะเป็นสิ่งเดียวกัน แต่ปลอดภัยมากขึ้น (ถ้าคุณทำจบลงด้วยสิ่งที่มากเกินไปในหน่วยความจำก็จะโยนอะไรบางอย่างในการแลกเปลี่ยน)
เบรนแดน Long

@BrendanLong จุดยุติธรรม .. ขอบคุณที่สอนฉัน :)
drake01

3

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

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

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

ในการหยิกคุณสามารถใช้ไฟล์เป็นอุปกรณ์สลับ สิ่งนี้มีประโยชน์หากคุณต้องการพื้นที่สว็อปพิเศษชั่วคราว


2

ฉันแก้ไขสคริปต์ของ Scott Severanceเพื่อให้ตรงกับเวอร์ชันที่ใหม่กว่าซึ่งฟรีมีฟิลด์หน่วยความจำที่มีอยู่ทั้งหมด

#!/bin/bash

free_mem="$(free | grep 'Mem:' | awk '{print $7}')"
used_swap="$(free | grep 'Swap:' | awk '{print $3}')"

echo -e "Free memory:\t$free_mem kB ($((free_mem / 1024)) MiB)\nUsed swap:\t$used_swap kB ($((used_swap / 1024)) MiB)"
if [[ $used_swap -eq 0 ]]; then
    echo "Congratulations! No swap is in use."
elif [[ $used_swap -lt $free_mem ]]; then
    echo "Freeing swap..."
    sudo swapoff -a
    sudo swapon -a
else
    echo "Not enough free memory. Exiting."
    exit 1
fi
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.