ฉันคิดว่าสาระสำคัญทั้งหมดของการแลกเปลี่ยนคือการทำหน้าที่เป็นเครือข่ายความปลอดภัยในการจัดเก็บชั่วคราวเมื่อ RAM เต็ม แต่พาร์ติชัน swap ของฉันถูกใช้อย่างต่อเนื่องแม้ว่าบางครั้งฉันจะมี RAM ว่าง 3GB มากเท่า เป็นเรื่องปกติหรือไม่
ฉันคิดว่าสาระสำคัญทั้งหมดของการแลกเปลี่ยนคือการทำหน้าที่เป็นเครือข่ายความปลอดภัยในการจัดเก็บชั่วคราวเมื่อ RAM เต็ม แต่พาร์ติชัน swap ของฉันถูกใช้อย่างต่อเนื่องแม้ว่าบางครั้งฉันจะมี RAM ว่าง 3GB มากเท่า เป็นเรื่องปกติหรือไม่
คำตอบ:
คุณสามารถลองเปลี่ยนค่า "swappiness" ของคุณ:
Swappiness คืออะไรและฉันจะเปลี่ยนได้อย่างไร
พารามิเตอร์ swappiness ควบคุมแนวโน้มของเคอร์เนลเพื่อย้ายกระบวนการออกจากหน่วยความจำกายภาพและไปยัง swap disk เนื่องจากดิสก์ช้ากว่า RAM มากอาจทำให้เวลาตอบสนองช้าลงสำหรับระบบและแอปพลิเคชันหากกระบวนการย้ายหน่วยความจำออกจากหน่วยความจำมากเกินไป
swappiness สามารถมีค่าระหว่าง 0 ถึง 100
swappiness = 0 บอกเคอร์เนลเพื่อหลีกเลี่ยงการสลับกระบวนการออกจากหน่วยความจำกายภาพนานที่สุด สำหรับเคอร์เนลเวอร์ชั่น 3.5 และใหม่กว่าจะปิดการแลกเปลี่ยน
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
sudo sysctl --load=/etc/sysctl.conf
หลังจากแก้ไขไฟล์เพื่อใช้การเปลี่ยนแปลง
คำถามของคุณมีแง่มุมที่แตกต่างกันเล็กน้อย
ประการแรกความหมายของคำว่า "ฟรี" คืออะไร มันไม่ง่ายอย่างที่คิดใน 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 ดังนั้นเพื่อลดความซับซ้อนของสิ่งต่าง ๆ การแลกเปลี่ยนเกิดขึ้นเพราะระบบของคุณกำลังจมอยู่แทนที่จะเป็นวิธีอื่น
เมื่อข้อมูลอยู่ในการแลกเปลี่ยนข้อมูลจะออกมาอีกเมื่อใด
การถ่ายโอนข้อมูลจากการแลกเปลี่ยนคือ (สำหรับฮาร์ดไดรฟ์แบบดั้งเดิมอย่างน้อย) เช่นเดียวกับใช้เวลานานเหมือนกับที่ใส่ไว้ในนั้น เคอร์เนลของคุณจะไม่เต็มใจที่จะลบข้อมูลออกจากการแลกเปลี่ยนโดยเฉพาะอย่างยิ่งหากไม่ได้ใช้งานจริง (เช่นอ่านหรือเขียนไป) หากคุณมีข้อมูลในการแลกเปลี่ยนและไม่ได้ใช้งานจริง ๆ แล้วมันเป็นสิ่งที่ดีที่มันจะยังคงอยู่ในการแลกเปลี่ยนเนื่องจากมันทำให้หน่วยความจำมากขึ้นสำหรับสิ่งอื่น ๆ ที่มีการใช้อาจเร่งระบบของคุณ
free -m
ดูอ้างอิงอื่น
การตั้งค่า 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 ไม่เพียงพอก็จะปฏิเสธที่จะสลับสลับ ฉันใช้สคริปต์นี้โดยไม่มีปัญหามาเกือบห้าปีแล้ว
โดยทั่วไปการแลกเปลี่ยนยังคงไม่ได้ใช้ในระบบในปัจจุบัน จากประสบการณ์ของผมกระบวนการที่กำลังทำงานเป็นเวลานานโดยไม่ต้องมีการดำเนินการอย่างเข้มข้นถูกเปลี่ยนเป็นลินุกซ์
ทำให้โปรแกรมที่ได้รับผลกระทบบางตัวทำงานช้า
หากคุณมี ram จำนวนมากคุณสามารถปิดการสลับได้โดยเรียกใช้คำสั่ง:
swapoff -av
(คุณต้องมีsudo
สิทธิ์สำหรับมัน)
หากคุณไม่ชอบการปิด swap คุณสามารถเปิดสวิตช์ได้โดยใช้คำสั่งแบบสมมาตร:
swapon -av
( sudo
ต้องการอีกครั้ง)
เมื่อสลับถูกใช้สำหรับโปรแกรมมันจะยังคงแมปตลอดชีวิตของโปรแกรม หลายโปรแกรมมีรหัส (และข้อมูล) ซึ่งไม่ค่อยได้ใช้ .. เมื่อหน่วยความจำถูกสลับมันก็ไม่น่าจะถูกสลับ
วิธีหนึ่งในการบังคับให้หน้าเหล่านี้เข้าสู่หน่วยความจำคือการปิดอุปกรณ์สลับ หากคุณมีสองคุณสามารถปิดหนึ่งเปิดอีกครั้งแล้วปิดที่สอง หากจำเป็นต้องสลับก็จะย้ายระหว่างอุปกรณ์ คุณสามารถปิดอุปกรณ์ swap (หรือไฟล์) ได้ แต่ถ้าคุณต้องการพื้นที่ swap อย่างมากสิ่งที่อาจเกิดขึ้นได้
นอกเหนือจากสิ่งปกติในหน่วยความจำ tempfs ใช้พื้นที่สว็อปและจะสลับออกมาเหมือนส่วนที่เหลือของหน่วยความจำ หากคุณเรียกใช้บางสิ่งที่ต้องใช้ดิสก์ชั่วคราวจำนวนมากมันอาจบังคับให้เพจเปลี่ยนเป็น เมื่อสร้างไฟล์ temp แล้วจะไม่สามารถใช้งานได้หลังจากผ่านไปสองสามนาทีและเป็นตัวเลือกที่ดีที่จะย้ายไปยังอุปกรณ์ swap
ในการหยิกคุณสามารถใช้ไฟล์เป็นอุปกรณ์สลับ สิ่งนี้มีประโยชน์หากคุณต้องการพื้นที่สว็อปพิเศษชั่วคราว
ฉันแก้ไขสคริปต์ของ 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
free -m
,top -b 1