Linux: จะยกเลิกการถอดทุกอย่างที่เป็นไปได้อย่างไร?


59

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

มีวิธีที่จะย้ายทุกอย่างที่เป็นไปได้อย่างชัดเจนจากการสลับกลับไปที่ RAM หรือไม่? หรืออาจไม่ใช่ทุกอย่าง แต่เป็นเพียงข้อมูลกระบวนการบางอย่างเท่านั้น

คำตอบ:


59

ฉันขอแนะนำให้อนุญาตให้สลับหน่วยความจำลินุกซ์ควบคุมปกติในสิ่งที่ใช้จริงตามที่ใช้

สิ่งเดียวที่ฉันคิดได้คือปิดสวิตช์แล้วเปิดใหม่

sudo swapoff -a
sudo swapon -a

สมมติว่าคุณมีหน่วยความจำกายภาพเพียงพอที่จะเก็บทุกอย่างไว้ในการแลกเปลี่ยน ...


4
มันใช้งานได้ช้ามาก :) ขอบคุณ! แต่ก็ยังคงผมเชื่อว่ามีเป็นทางออกที่สง่างามมากขึ้น :)
kolypto

7
ระวังด้วยวิธีนี้มันจะเอาทุกอย่างออกจากการแลกเปลี่ยนโดยการบังคับ ... ถ้ามันไม่พอดีกับหน่วยความจำกายภาพเคอร์เนลจะเริ่มต้นนักฆ่า OOM ที่อันตราย ฉันไม่รู้จัก "พยายามย้ายทุกอย่างไปยัง RAM แต่ล้มเหลวอย่างสง่างามหากไม่ได้รับคำสั่ง"
Juliano

1
ฉันลองแล้วพบว่ามันทำงานได้ช้ามาก ดังนั้นจึงเป็นไปได้ที่จะตรวจสอบฟรี RAM และฆ่าswapoffถ้าหน่วยความจำไปต่ำ: ในกรณีนี้พื้นที่ swap จะยังคงทำงาน :)
kolypto

2
ฉันไม่แน่ใจว่าการฆ่า swapoff จะหยุดการทำงานจริงหรือ ขึ้นอยู่กับวิธีการนำไปใช้
Douglas Leeder

2
ดูเหมือนว่าคำสั่ง swapoff ทำบางสิ่งเช่น "ไม่อนุญาตให้มีการเขียนเพื่อสลับใหม่" ในขณะที่กระบวนการทำงานอื่น ๆ (ซึ่งเป็น / กำลังใช้ swap) ยังคงสามารถ "ปล่อยสลับ" ได้ นี่อาจเป็นสาเหตุว่าทำไมมันถึงช้ามาก ดูเหมือนจะไม่ทำให้ OOM เป็นอย่างที่คนอื่นพูด (ฉันใช้ Ubuntu Bionic) - เป็นไปได้ว่าจะเกิดขึ้นก็ต่อเมื่อกระบวนการ "เพิ่มเติม (หรือที่มีอยู่) เริ่มใช้หน่วยความจำใหม่" (เช่น OOM จริง) ดังนั้นทั้งหมดใน swapoff / swapon เป็นทางออกที่ดีที่ดูเหมือนว่า Gentle / มั่นคง นี่ถือว่าคุณไม่ได้เริ่มต้นหน่วยความจำเพิ่มเติมโดยใช้กระบวนการ (หรือเพิ่มปริมาณการใช้ในการรัน)
Roel Van de Paar

12

คุณสามารถปรับแต่งมันสะท้อนตัวเลขบางอย่างระหว่าง 0-100 /proc/sys/vm/swappinessเข้า

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

ค่าเริ่มต้นคือ 60


13
ห้ามใช้ / proc / sys โดยตรงใช้sysctlคำสั่งแทน sysctl vm.swappiness=xในกรณีนี้ก็คือ
Juliano

7
ฉันไม่คิดว่าแม้การทำ swappiness ที่เป็นศูนย์จะทำให้หน้าเว็บที่เปลี่ยนไปถูกนำเข้าสู่หน่วยความจำหลักอย่างชัดเจนแล้วหรือไม่
Douglas Leeder

1
@ ดักลาสถูกต้อง vm.swappiness ส่วนใหญ่จะควบคุมการตัดสินใจว่าจะย้ายสิ่งต่าง ๆ เพื่อแลกเปลี่ยนหรือลดจำนวนแคชและบัฟเฟอร์เมื่อหน่วยความจำถูกร้องขอ
Juliano

@Juliano ทำไมไม่ควร / proc / sys ใช้?
James

@James เนื่องจาก / proc / sys เป็นอินเทอร์เฟซระดับต่ำกว่าที่ใช้ในการเปลี่ยนแปลงและสอบถามการกำหนดค่าเคอร์เนล (เป็น "รายละเอียดการใช้งาน") Linux จัดเตรียมsysctlคำสั่งระดับสูงกว่าสำหรับการโต้ตอบกับผู้ใช้ ผลลัพธ์ที่ได้จะเหมือนกัน แต่โดยทั่วไปแล้วจะต้องการอินเตอร์เฟสระดับสูงกว่าเพื่อให้ผู้ใช้โต้ตอบโดยตรง ค่อนข้างเหมือนสตาร์ทเครื่องยนต์โดยลัดวงจรสายไฟ (ระดับต่ำกว่า) แทนที่จะแค่หมุนกุญแจ (ระดับที่สูงขึ้น)
Juliano

5

Linux จัดการงานหน่วยความจำได้ดีและคุณไม่ควรยืนหยัด การตั้งค่า vm.swappiness (กล่าวถึงก่อนหน้านี้) ไม่ได้เข้าทาง คุณมีแนวโน้มที่จะพบปัญหาแปลก ๆ ที่ทำสิ่งอื่นใด

สิ่งที่คุณเปิดตัวที่หน่วยความจำหิวมาก? สามารถปรับได้ไหม หากไม่มีคำสั่ง จำกัด หน่วยความจำของตัวเองคุณสามารถดู ulimit ได้เช่นกัน


convert -density 200 file.pdf jpegs/file.jpgในกรณีของฉันมันเป็น ด้วยเหตุผลบางอย่างมันใช้หน่วยความจำจำนวนมาก แต่คุณพูดถูก: สามารถปรับได้ อย่างไรก็ตามสถานการณ์เป็นไปได้กับแอปพลิเคชันใด ๆ :)
kolypto

1
ฉันเห็นด้วยกับคำตอบนี้ - คุณควรปล่อยให้การดำเนินงานปกติบนเครื่องเพื่อสลับในสิ่งที่จำเป็นจริง
Douglas Leeder

convertมี-limitเหตุผลในการควบคุมหน่วยความจำกับการใช้ดิสก์และคุณควรอ่านมัน การตั้งค่า-limit memory 512MBหรือคล้ายกันจะดี มันอาจจะเป็นการดีที่จะระบุ MAGICK_TEMPORARY_PATH ที่ชัดเจนและล้างข้อมูลให้ดีขึ้นหลังจากคำสั่งของคุณเสร็จสิ้น
slacy

3

หากคุณมีหน่วยความจำสำหรับทุกแอปพลิเคชันของคุณมันก็โอเคที่จะตั้งค่า swappiness เป็น 0 ดังนั้นสิ่งต่างๆจะไม่สลับกัน ตัวอย่างเช่น qemu-kvm เป็นเป้าหมายใหญ่ที่ VMM จะถูกสลับสับเปลี่ยนเพราะ "ปรากฏ" เป็นเวลาส่วนใหญ่ ฉันเห็นหน่วยความจำสูงสุดถึง 80% ของหน่วยความจำ qemu-kvm ที่เขียนขึ้นเพื่อแลกเปลี่ยน VMs ที่ทำงานใน qemu-kvm จะไม่ตอบสนองเพราะใกล้จะหมด (แม้ว่าแขกไม่ทราบว่ามันเกิดขึ้น) VM แขกจะคิดว่ามันทำงานได้อย่างยอดเยี่ยมที่สุดแม้ว่าในความเป็นจริงมันจะลากไปอย่างน่ากลัว เมื่อฉัน VMs "ตื่น" และเริ่มทำสิ่งต่าง ๆ มันสามารถขัดขวางค่าเฉลี่ยการโหลดได้สูงถึง 30 แม้กระทั่งฮาร์ดแวร์ระดับองค์กรที่มีหน่วยความจำและดิสก์ที่รวดเร็วเพียงพอ ฉันเดาว่านี่เป็นความล้มเหลวในการออกแบบ qemu-kvm นอกกรอบ

หวังว่านี่จะช่วยใครซักคน


ฉันกลัวว่านี่ไม่ถูกต้องนัก
Marc.2377

2

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


9
มีบางกรณีที่ฉันต้องการทำในสิ่งที่ OP ต้องการ ถ้าฉันปล่อยให้กระบวนการทำงานโดยไม่ตั้งใจและใช้ RAM + swap ทั้งหมดของฉันฉันสามารถรอ 15 วินาทีทุกครั้งที่ฉันสลับแอปพลิเคชันเพื่อให้หน่วยความจำหลุดออกจากการสับเปลี่ยนหรือบังคับให้มันทำงานได้เร็วตามปกติ
อเล็กซ์

1

หากคุณสามารถรีบูทระบบที่ควรทำ (และอาจใช้เวลาน้อยกว่าการลองโซลูชันอื่น ๆ )


1

เพื่อคัดลอกคำตอบของฉันจากคำถามนี้

เพื่อให้คุณรู้ว่าการปรับค่าได้อย่างรวดเร็ว สิ่งนี้ใช้งานได้โดยบอกให้ระบบย่อย VM ค้นหาหน้าเพื่อสลับเมื่อ% ของหน่วยความจำที่แมปกับประมวลผลหน้าตาราง + ค่า swappiness คือ> 100 ดังนั้นการตั้งค่าที่ 60 จะทำให้ระบบเริ่มต้นเพจเก่าออกจากตารางหน้ากระบวนการ เมื่อใช้มากกว่า 40% ของหน่วยความจำระบบของคุณ หากคุณต้องการอนุญาตให้โปรแกรมของคุณใช้หน่วยความจำเพิ่มเติมโดยใช้แคชคุณจะต้องลดค่า swappiness


ฉันไม่คิดว่าหน่วยความจำของโปรแกรมเทียบกับแคชเป็นปัญหาที่นี่ - ฉันคิดว่าเป็นแอปพลิเคชันหน่วยความจำกับหน่วยความจำที่ไม่ได้ใช้ และฉันไม่คิดว่าความรวดเร็วจะส่งผลกระทบต่อสิ่งนั้น
Douglas Leeder

0

กระบวนการยังคงทำงานอยู่หรือไม่ เปิดเทอร์มินัลแล้วดูว่าคุณสามารถสังเกตเห็นกระบวนการที่เปิดตัวได้หรือไม่ (ps aux | grep processname อาจทำให้ง่ายขึ้นเล็กน้อย) ใช้ kill -9 PID เพื่อฆ่าพวกมันหากยังคงทำงานอยู่ ระวังสิ่งที่คุณฆ่า หากคุณไม่ทราบว่ากระบวนการคืออะไรอย่าฆ่ามัน! นอกจากนี้โพสต์เอาต์พุตของฟรี -m เพื่อให้เราสามารถดูว่าคุณยังใช้ swap อยู่มากมายหรือไม่

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


0

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

สรุป: เพียงแค่ให้ Linux ค่อยๆเรียกคืนประสิทธิภาพตามปกติ ระบบย่อย VM นั้นมีการจัดระเบียบในลักษณะที่มันพยายามอย่างต่อเนื่องและย้ายไปสู่สถานะสมดุลในอุดมคติ


-2

การล้างแคชของบัฟเฟอร์

หากคุณต้องการล้างข้อมูลเหล่านั้นคุณสามารถใช้คำสั่งกลุ่มนี้ได้

$ free && sync && echo 3 > /proc/sys/vm/drop_caches && free

             total       used       free     shared    buffers     cached
Mem:       1018916     980832      38084          0      46924     355764
-/+ buffers/cache:     578144     440772
Swap:      2064376        128    2064248
             total       used       free     shared    buffers     cached
Mem:       1018916     685008     333908          0        224     108252
-/+ buffers/cache:     576532     442384
Swap:      2064376        128    2064248

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

หมายเหตุ:ล้างหน่วยความจำในสิ่งที่ไม่จำเป็น (เคอร์เนล 2.6.16 หรือใหม่กว่า) ให้แน่ใจว่าใช้การซิงค์ก่อนเพื่อล้างสิ่งที่มีประโยชน์ออกไปในดิสก์ !!!

  • หากต้องการเพิ่ม pagecache:

    $ echo 1 > /proc/sys/vm/drop_caches
    
  • หากต้องการฟรี Dentuts และ inodes:

    $ echo 2 > /proc/sys/vm/drop_caches
    
  • หากต้องการเพิ่ม pagecache, dentries และ inodes:

    $ echo 3 > /proc/sys/vm/drop_caches
    

ด้านบนมีความหมายที่จะเรียกใช้เป็นราก หากคุณพยายามที่จะใช้ sudo คุณจะต้องเปลี่ยนไวยากรณ์เล็กน้อยเป็นดังนี้:

$ sudo sh -c 'echo 1 >/proc/sys/vm/drop_caches'
$ sudo sh -c 'echo 2 >/proc/sys/vm/drop_caches'
$ sudo sh -c 'echo 3 >/proc/sys/vm/drop_caches'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.