จะล้างค่า swap ได้อย่างไรถ้ามี RAM ว่าง


314

เมื่อฉันเปิดแอพที่ใช้แรมมาก (VirtualBox ตั้งไว้ที่ 2GB ของ RAM) โดยทั่วไปจะใช้พื้นที่สว็อปบางอย่างขึ้นอยู่กับว่าฉันเปิดอะไรในเวลานั้น

อย่างไรก็ตามเมื่อฉันออกจากแอปพลิเคชันล่าสุดนั้น RAM 2GB จะถูกปล่อยออกไป แต่การใช้พื้นที่สว็อปเดียวกันยังคงอยู่

ตัวอย่างเช่นตอนนี้ประมาณสองชั่วโมงหลังจากปิด VirtualBox ฉันมี RAM 1.6GB ฟรีและยังคงเป็น 770MB ในการสลับ

ฉันจะบอกให้ Ubuntu หยุดใช้ swap นั้นและเปลี่ยนกลับไปใช้ RAM ได้อย่างไร


สิ่งที่ง่ายที่สุดในการรีบูตอุปกรณ์ของคุณและประหยัดเวลาในการรับมือกับ ram และ ram ฟรีประหยัดพลังงานของแล็ปท็อปและซีพียูอุณหภูมิ
Mohamed Slama

5
สมมติฐานที่ยิ่งใหญ่ที่การเปลี่ยนวัสดุทั้งหมดในคอมพิวเตอร์ของคุณใช้เวลาน้อยกว่านั้น
jQwierdy

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

คำตอบ:


167

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

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

นี่คือผลลัพธ์ของการทำงานvmstat 1ซึ่งคุณจะเห็นว่าเครื่องของฉันไม่ได้ทำการแลกเปลี่ยนเลย

procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 0  0  78588 230788   9596  72196    0    0     0     0  543  652 12  6 78  0
 0  0  78588 230780   9596  72196    0    0     0     0  531  410  1  0 99  0
 0  0  78588 230796   9596  72196    0    0     0     0  300  335  1  1 97  0
 1  0  78588 230788   9608  72224    0    0    40     0  737  762  4  4 84  8
 5  0  78588 230788   9608  72224    0    0     0     0  415  385  9  3 84  0
 0  0  78588 230540   9616  72224    0    0     0    44  611  556 55  5 31  0
 0  0  78588 230532   9616  72224    0    0     0     0  574  662  1  6 89  0

แต่ที่นี่topคุณจะเห็นว่าฉันมีพื้นที่สว็อปที่จัดสรร:

Mem:    475236k total,   245076k used,   230160k free,     9720k buffers
Swap:   491512k total,    78588k used,   412924k free,    72476k cached

32
“ ไม่มีเหตุผลที่ต้องกังวล” จนถึงตอนที่ฉันยังคงใช้แอพพลิเคชั่นบางตัวที่เปลี่ยนมา จากนั้นนรกก็แตกสลาย
törzsmókus

207
โพสต์นี้ไม่ตอบคำถาม
emchristiansen

18
หลักฐานของคำถามขึ้นอยู่กับความเข้าใจผิด โพสต์นี้เน้นความเข้าใจผิด
popey

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

39
หลังจากใช้งานแอพพลิเคชั่นที่ใช้หน่วยความจำมากแอปพลิเคชั่นอื่น ๆ ของฉันจะไม่ตอบสนองเมื่อฉันสลับไปใช้พวกมันน่าจะเกิดจากการสลับ วิธีบอกให้ระบบยกเลิกการแลกเปลี่ยนข้อมูลให้มากที่สุด (ตามด้วยช่วงพักดื่มกาแฟ) จะดีกว่าการรอ 20 วินาทีทุกครั้งที่ฉัน Alt + Tab
Mark K Cowan

423

เคอร์เนล Linux พื้นฐาน Ubuntu จะ "สลับ" หน้าเหล่านั้นจากดิสก์เป็น RAM ตามความจำเป็นโดยอัตโนมัติดังนั้นโดยทั่วไปฉันจะบอกว่าปล่อยให้มันเกิดขึ้นตามธรรมชาติ

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

sudo swapoff -a
sudo swapon -a

หรืออีกวิธีหนึ่งเป็นบรรทัดเดียว

swapoff -a; swapon -a

ระวังการทำเช่นนี้เพราะคุณอาจทำให้ระบบของคุณไม่เสถียรโดยเฉพาะอย่างยิ่งถ้า RAM มีน้อย


8
นั่นเป็นกลอุบายการแลกเปลี่ยนถูกคัดลอกไปยังหน่วยความจำ ฉันเดาว่าคุณต้องทำให้แน่ใจว่ามีจำนวน swap อย่างน้อยที่ใช้เป็น ram ฟรีก่อนที่จะใช้ swapoff ใช่ไหม?
jfoucher

12
การแลกเปลี่ยนไม่ได้ถูกคัดลอกไปยัง RAM มันถูกปิดการใช้งานเท่านั้น คุณควรตรวจสอบให้แน่ใจว่ากล่องไม่ได้ถูกสลับก่อนที่จะทำสิ่งนี้ หากคุณทำเช่นนั้นเคอร์เนลจะเห็นหน่วยความจำหายไปและ OOM-Killer อาจเริ่มต้นฆ่าแอปพลิเคชันโดยพลการ ไม่มีเหตุผลที่คุณควรจะต้อง 'ทำความสะอาด' การแลกเปลี่ยนในลักษณะนี้ (ดูความคิดเห็นอื่น ๆ ของฉัน) :)
popey

51
จริงๆแล้วการแลกเปลี่ยนคือโดยทั่วไปแล้วคัดลอกไปที่ ram หรือมากกว่าอย่างแม่นยำหน้าจะถูกสลับกลับจากดิสก์ไปยัง RAM ก่อนที่จะปิดการแลกเปลี่ยน
SpamapS

14
หน้าจะถูกคัดลอกไปยัง RAM เฉพาะในกรณีที่บางกระบวนการยังต้องการ บางครั้งหน้าการสลับเป็นของกระบวนการที่เสร็จสิ้นแล้วและเคอร์เนลไม่สนใจที่จะลบหน้าเหล่านี้ออกจากการแลกเปลี่ยนทันที
BrunoJCM

6
นี่ควรเป็นคำตอบที่ถูกต้องเนื่องจากเป็นหนทางที่จะทำให้หน้าเว็บที่เปลี่ยนกลับมาเป็น RAM แล้วจึงล้างหน่วยความจำ swap ให้หมด
Alfonso Jiménez

144

นอกจากนี้คุณยังสามารถตั้งค่า "swappiness" ของคุณจากค่าเริ่มต้นที่ 60 วิธีนี้การแลกเปลี่ยนจะไม่ขยายใหญ่จนเริ่มต้น ทำไมค่าเริ่มต้นการจัดส่งถูกตั้งค่าเป็น 60 เมื่อค่าที่แนะนำคือ 10 ทำให้ฉันงง จาก Ubuntu SwapFAQ :

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

ด้วยการเปลี่ยนค่านี้เป็น 10 หรือ 0 คุณสามารถเพิ่มการเร่งความเร็วที่สำคัญและสามารถรับรู้ได้ในระบบเก่าโดยใช้ไดร์ฟช้า การตั้งค่านี้เป็น 0 จะไม่ปิดการแลกเปลี่ยนสำหรับเคอร์เนลลินุกซ์ 3.4 และต่ำกว่า แต่ด้วย 3.5+ คุณจะต้องใช้ค่า 1 หากคุณต้องการคงไว้ที่การตั้งค่าต่ำสุด *

ฉันไม่เห็นเหตุผลที่จะไม่ตั้งค่านี้เป็น 0 เนื่องจากสิ่งใดก็ตามที่พบดิสก์ช้ากว่า RAM ฉันมีคอร์เสมือน 8 คอร์, SSD ที่รวดเร็วและหน่วยความจำ 8 GB และการสลับของฉันถูกตั้งค่าเป็น 0 ณ ขณะนี้ฉันมีเครื่องเสมือน 3 เครื่องที่ทำงานอยู่, การใช้หน่วยความจำของฉันคือ 7.1 จาก 7.7 GB, swap ที่ใช้แล้ว 952MB และระบบทั้งหมดทำงานได้อย่างราบรื่น!

จาก Ubuntu SwapFAQ :

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

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

ด้านล่างนี้เป็นคำแนะนำพื้นฐานสำหรับการตรวจสอบความว่องไวล้างข้อมูลการแลกเปลี่ยนของคุณและเปลี่ยนความรวดเร็วเป็น 0:

วิธีตรวจสอบค่า swappiness:

cat /proc/sys/vm/swappiness

หากต้องการตั้งค่า swap ชั่วคราวเป็น 0 ( ตามที่ SpamapS แนะนำ ):

การทำเช่นนี้จะทำให้การแลกเปลี่ยนของคุณว่างเปล่าและโอนการแลกเปลี่ยนทั้งหมดกลับสู่หน่วยความจำ ก่อนอื่นตรวจสอบให้แน่ใจว่าคุณมีหน่วยความจำเพียงพอที่จะใช้งานได้โดยดูที่แท็บทรัพยากรของ gnome-system-monitor หน่วยความจำว่างของคุณควรมากกว่า swap ที่ใช้ กระบวนการนี้อาจใช้เวลาสักครู่ใช้ gnome-system-monitor เพื่อตรวจสอบและตรวจสอบความคืบหน้า

sudo swapoff --all

ในการตั้งค่าใหม่เป็น 0:

sudo sysctl vm.swappiness=0 

ในการเปิดใช้งานการสลับกลับ:

sudo swapon --all

หากต้องการตั้งค่า swappiness อย่างถาวรเป็น 0:

  1. sudoedit /etc/sysctl.conf
  2. เพิ่มบรรทัดนี้ vm.swappiness = 0
  3. sudo shutdown -r now # เริ่มระบบใหม่

* ด้วยเคอร์เนลเวอร์ชัน 3.5+ การตั้งค่า swappiness ให้เป็น 0 จะปิดทั้งหมดและแนะนำให้ตั้งค่า 1 หากคุณต้องการอัลกอริทึม swappiness ต่ำสุด แหล่งที่มา: https://www.percona.com/blog/2014/04/28/oom-relation-vm-swappiness0-new-kernel/


1
ฉันเพิ่งปรับปรุงคำตอบเพื่อรวมวิธีถาวรในการตั้งค่าความรวดเร็ว ไม่แน่ใจว่ามันเพิ่มขึ้นมากได้อย่างไรฉันเดาว่าไม่มีใครทดสอบ
Elijah Lynn

1
อ่านเพิ่มเติมเกี่ยวกับความว่องไวในคำตอบนี้ => askubuntu.com/a/103916/11929
Elijah Lynn

3
ฉันไม่แน่ใจว่าสิ่งนี้จะใช้ได้เมื่อผู้เขียนโพสต์คำตอบ แต่มีค่า swappiness ของ "60" สำหรับเซิร์ฟเวอร์ที่ติดตั้ง ubuntu เนื่องจากสภาพแวดล้อมนั้นมีข้อกำหนดที่แตกต่างกันสำหรับการทำงาน help.ubuntu.com/community/…
Frito

1
การตั้งค่านี้มีประสิทธิภาพในการควบคุมขนาดของการแลกเปลี่ยน ระบบของฉันมี RAM 16G และ 16G swap บางครั้งฉันทำงานกับ VM และแอพพลิเคชั่นบางตัวของฉันเปลี่ยนไป เมื่อฉันปิด VM การใช้ RAM จะลดลง แต่การใช้ swap ยังคงเหมือนเดิมและระบบของฉันจะล่าช้าเมื่อเปลี่ยนแอปพลิเคชัน การเปลี่ยนความคล่องตัวมีประสิทธิภาพที่ดีขึ้นสำหรับฉัน
kapad

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

53

ฉันพบว่าการล้างตะกอนสามารถช่วยได้มากในระบบที่มีดิสก์ช้าและ RAM จำกัด sudo swapoff -a; sudo swapon -aของหลักสูตรดังกล่าวแล้ววิธีการที่จะทำเช่นนี้คือการทำงาน ปัญหาที่นี่คือถ้ามี RAM ไม่เพียงพอการทำเช่นนั้นจะทำให้เกิดปัญหาทุกประเภท

ฉันเขียนสคริปต์ที่ฉันเรียกtoggle_swapว่าใช้งานได้สำหรับหลายปีที่ผ่านมา ตรวจสอบว่ามี RAM ว่างเพียงพอก่อนปิดใช้งานการสลับจริง นี่มันคือ:

#!/bin/bash

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)"
if [[ $used_swap -eq 0 ]]; then
    echo "Congratulations! No swap is in use."
elif [[ $used_swap -lt $total_free ]]; then
    echo "Freeing swap..."
    sudo swapoff -a
    sudo swapon -a
else
    echo "Not enough free memory. Exiting."
    exit 1
fi

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

2
ฉันอัปเดตรหัสแล้วและได้สร้าง gist based gist.github.com/Jekis/6c8fe9dfb999fa76479058e2d769ee5c
Jekis

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

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

ขึ้นอยู่กับจำนวนหน่วยความจำที่คุณมี หากมีหน่วยความจำว่างเพียงพอที่จะเก็บทุกอย่างไว้ในการแลกเปลี่ยนและกระบวนการใหม่ก็ไม่มีปัญหา ถ้าไม่เช่นนั้นคุณพูดถูก
Scott Severance

25

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

ถ้าคุณไม่มีเหตุผลที่ดีที่ต้องการดิสก์นั้นกลับมาฉันจะปล่อยให้มันเป็นไป


2
ฉันมีบางอย่างในการแลกเปลี่ยน vmstat แสดงให้ฉันเห็นว่าการสลับและการสลับเกิดขึ้นและ Chrome ก็ล้าหลังในขณะที่ CPU ของฉันแทบจะไม่ได้ใช้ เหตุผลที่ดีพอไม่?
Xerus

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

-1

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


10
ใช่ แต่หากมีการสลับบางอย่างมันจะส่งผลต่อประสิทธิภาพดังนั้นคำถามนี้
quant

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