Score:2

จะย้ายสลับกลับไปที่ RAM โดยอัตโนมัติได้อย่างไร

ธง cn

ปัญหาดั้งเดิมของฉันเกี่ยวกับการแลกเปลี่ยน (ความรำคาญ) คือการแลกเปลี่ยนบ่อยเกินไป (แม้แต่กับ ความรวดเร็ว=1! ).

ฉันยังคิดว่า 0 จะปิดความรวดเร็ว - ซึ่งก็คือ a ความเข้าใจผิด,
การสลับยังคงใช้งานได้แม้ว่าคุณจะตั้งค่าไว้ sudo sysctl -w vm.swappiness=0 ! :-)
(หากต้องการตั้งค่าถาวร ให้แก้ไข /etc/sysctl.conf และเพิ่ม/ปรับปรุง vm.swappiness = 0 - สำหรับโปรแกรมแก้ไขข้อความ GUI ฉันขอแนะนำ "linux notepad" "gedit" คุณสามารถทำได้ sudo gedit /etc/sysctl.conf)

ด้วยความรวดเร็วเท่านั้น 0 มันเริ่มทำงานอย่างที่คาดไว้ (การสลับเริ่มต้นที่ประมาณ 98% ของ RAM เต็ม) แต่ฉันยังคงประสบปัญหาอีกหนึ่งอย่าง - และเมื่อ RAM เพียงพอจริง ๆ แล้วว่างอีกครั้ง การสลับจะไม่กลับไปที่ RAM โดยอัตโนมัติ ไม่แม้แต่เมื่อเวลาผ่านไป

แน่นอนคุณสามารถทำได้ด้วยตนเอง sudo swapoff -a; sudo swapon -a ทุกครั้งที่ปิดการสลับซึ่งในที่สุดจะบังคับให้การสลับถูกเทลงใน RAM และจากนั้นการสลับจะเริ่มต้นใหม่อีกครั้ง

อย่างไรก็ตาม มันไม่มีประโยชน์ด้วยเหตุผล 2 ประการ ก) การสลับถูกปิดชั่วขณะ ข) เป็นการตรวจสอบ/เรียกใช้เพิ่มเติมด้วยตนเอง

มีวิธีที่จะทำให้สิ่งนี้สำเร็จหรือไม่โดยเฉพาะอย่างยิ่ง "พื้นเมือง", ทาง โดยอัตโนมัติ?

Raffa avatar
jp flag
สำหรับการตรวจสอบอัตโนมัติ: `[ "$(free | awk '/Swap:/{print $3}')" -lt "$(free | awk '/Mem:/{print $7}')" ] ​​&& echo "หน่วยความจำว่าง มากกว่าการแลกเปลี่ยนที่ใช้" || echo "หน่วยความจำว่างน้อยกว่าการแลกเปลี่ยนที่ใช้"`
user535733 avatar
cn flag
เคอร์เนลส่งคืน swap page ที่ใช้บ่อยกลับเข้าสู่ RAM ไม่ส่งคืนหน้าที่ไม่ค่อยได้ใช้อย่างรวดเร็ว...เนื่องจากไม่ค่อยได้ใช้ ดังนั้น swap จึงเป็นตำแหน่งที่เหมาะสมสำหรับหน้าเหล่านี้ หากคุณใช้ระบบที่มีข้อจำกัดของ RAM อย่ามองว่า swap เป็นเพียงการโอเวอร์โฟลว์เมื่อ RAM เต็ม ดู swap เป็นหน่วยความจำรูปแบบอื่นที่มีคุณสมบัติต่างกัน
heynnema avatar
ru flag
แก้ไขคำถามของคุณและแสดง `free -h` และ `swapon -s` และ `sysctl vm.swappiness`
jave.web avatar
cn flag
@ user535733 ปัญหาคือฉันมีบางสิ่งที่ฉันอาจไม่ต้องการในตอนนี้ แต่ฉันต้องการให้พร้อมเมื่อฉันไปที่นั่น - การแลกเปลี่ยนเป็นเพียงการหยุดพักอย่างปลอดภัยสำหรับฉัน (ดังนั้นฉันจึงมีเวลาที่จะฆ่าสิ่งที่ถูกต้อง ประมวลผลเมื่อฉันเริ่มถ่าย GB มากเกินไปใน RAM)
Score:3
ธง cn

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

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

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

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

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

jave.web avatar
cn flag
ปัญหาคือฉันมีบางอย่างที่อาจไม่ต้องการในตอนนี้ แต่ฉันต้องการให้พร้อมเมื่อฉันไปที่นั่น - การแลกเปลี่ยนเป็นเพียงการหยุดพักอย่างปลอดภัยสำหรับฉัน ดังนั้นฉันจึงมีเวลาที่จะฆ่ากระบวนการที่เหมาะสมเมื่อ ฉันเริ่มถ่าย GB มากเกินไปใน RAM ซึ่งเป็นสิ่งที่เกิดขึ้นหรือฉันต้องทำอย่างสม่ำเสมอ (และฉันจะไม่เรียกมันว่ากลอุบาย) BTW: ฉันรู้สึกว่าย่อหน้าสุดท้ายเท่านั้นที่ตอบคำถามจริงๆ นอกจากนี้ฉันยังเห็นแนวโน้มของการแลกเปลี่ยนคำตอบที่หลีกเลี่ยงสิ่งที่หลีกเลี่ยงไม่ได้ - มีปัญหาที่ต้องการวิธีแก้ไข (ซึ่งอาจยังไม่มี แต่ปัญหายังคงอยู่) :-)
vanadium avatar
cn flag
ส่วนแรกคือการบอกใบ้ว่าสิ่งที่คุณคิดว่าเป็นปัญหานั้นอาจไม่ใช่ปัญหา ท้ายที่สุด สิ่งที่สำคัญที่สุดคือ: ซื้อ RAM ให้เพียงพอกับความต้องการของคุณ ไม่มีวิธีอื่นใดที่จะช่วยคุณได้จริงๆ คุณได้เพิ่มข้อมูลบางอย่างเกี่ยวกับจำนวน RAM ที่คุณมีปัญหาหรือไม่ ฉันเห็นว่าในระหว่างนี้มีคนใจดีพอที่จะเขียนบทให้คุณตามที่ฉันพูดถึง
vanadium avatar
cn flag
ย้าย "คำตอบ" ไปที่ด้านบน ;)
jave.web avatar
cn flag
นั่นเป็นอีกเทรนด์หนึ่งที่ฉันไม่ชอบ - "ซื้อ X" ฉันคิดว่ามันชัดเจน (ขออภัยหากไม่ใช่) หากฉันสามารถซื้อ/อัปเกรดเป็น RAM ได้เพียงพอ ฉันจะไม่ถามสิ่งนี้ ฉันขอโทษที่ไม่ได้ให้ข้อมูล RAM - มี 2 กรณี - 16GB และ 32GB อย่าเข้าใจฉันผิด ฉันดีใจจริงๆ ที่คุณเต็มใจช่วย :) แค่ผิดหวังนิดหน่อยกับวิธีการของอินเทอร์เน็ตที่มีต่อผู้คนที่ต้องการวิธีแก้ปัญหาสำหรับสถานการณ์ปัจจุบันของพวกเขา
jave.web avatar
cn flag
อย่างไรก็ตาม สำหรับกรณีของฉันโดยเฉพาะ การอัปเกรด RAM จะไม่ใช่ตัวเลือกอยู่ดี เนื่องจากไม่มีผลลัพธ์ **พฤติกรรม** เหมือนกัน (ดังที่ฉันอธิบายไว้ในความคิดเห็นที่ 1) และ RAM โอเวอร์โหลด ฉันจับได้ด้วยการสลับ ได้ **แทบไม่จำกัด** :)
vanadium avatar
cn flag
ฉันเข้าใจความต้องการของคุณ แต่ไม่เข้าใจ "สาเหตุ" ของความต้องการของคุณ และคำถามของคุณไม่ได้ทำให้ชัดเจน เนื่องจากคุณแทบจะไม่ได้บันทึกกรณีการใช้งานเฉพาะที่อาจนำไปสู่สถานการณ์ของคุณ คุณต้องใช้สคริปต์ด้วยตัวเองตามที่ฉันระบุไว้ในคำตอบนี้ ฉันเห็นว่าในระหว่างนี้คุณยอมรับคำตอบของผู้ที่จัดเตรียมสคริปต์
jave.web avatar
cn flag
แม้ว่าฉันจะไม่ได้บันทึกกรณีการใช้งาน แต่ฉันคิดว่าฉันได้อธิบายอย่างชัดเจนถึงความต้องการและสิ่งที่ฉันกำลังทำอยู่ ซึ่งหมายความว่าฉันได้ผ่านคำถาม & คำตอบทั่วไปแล้ว ดังนั้นฉันจึงพบคำตอบส่วนใหญ่ของคุณนอกหัวข้อ - เป็น ชัดเจน - นั่นคือเหตุผลที่ฉันไม่ยอมรับ ** ไม่ใช่ ** เพราะไม่มีรหัส แต่ถ้าคุณสนใจ - กรณีการใช้งานทั่วไปคือการรั่วไหลของหน่วยความจำแบบสุ่ม/ขยะแคชที่สร้างโดยแอปซึ่งฉันไม่สามารถควบคุมได้เลย แต่จะเกิดขึ้นเป็นครั้งคราวและเมื่อฉันสร้างเนื้อหาโดยใช้หน่วยความจำ RAM โดยตั้งใจ แต่ ด้วยข้อมูลที่สามารถคาดเดาไม่ได้ :)
jave.web avatar
cn flag
อย่างไรก็ตาม ขอขอบคุณสำหรับความคิดเห็นของคุณ ฉันไม่ต้องการที่จะฟังดูเนรคุณ :)
Score:1
ธง jp

ถ้าคุณต้องทำอย่างนั้น เปลี่ยน เป็นทางไป. คุณสามารถทำให้กระบวนการนี้เป็นไปโดยอัตโนมัติโดยใช้สคริปต์ทุบตีดังนี้:

#!/bin/bash

sysctl -w vm.swappiness=0

ในขณะที่จริง
ทำ
    total_m=$(ฟรี | awk '/Mem:/{print $2}')
    free_m=$(ฟรี | awk '/Mem:/{print $7}') 
    used_s=$(free | awk '/Swap:/{print $3}')
    total_m_percent=$(("$total_m" / 100))
    free_m_percent=$(("$free_m" / "$total_m_percent"))
    # ปิดใช้งานการสลับและย้ายเพจไปที่ RAM หากมีที่ว่างเพียงพอใน RAM และ RAM ว่างมากกว่า 30%
    [ "$used_s" -gt 0 ] && [ "$used_s" -lt "$free_m" ] && [ "$free_m_percent" -gt 30 ] && สลับ -a
    # เปิดใช้งานการแลกเปลี่ยนหาก RAM ว่างที่เหลืออยู่น้อยกว่า 5%
    [ "$used_s" -eq 0 ] && [ "$free_m_percent" -lt 5 ] && แลกเปลี่ยน -a
    # พักเป็นเวลา 10 วินาทีเพื่อหลีกเลี่ยงการรัดระบบ
    นอน10
เสร็จแล้ว

เรียกใช้สคริปต์ด้วย sudo bash scriptfile.sh หรือเพิ่ม ระบบ บริการเรียกใช้สคริปต์โดยอัตโนมัติเมื่อระบบเริ่มทำงาน

jave.web avatar
cn flag
ดูน่าสนใจ - ดังนั้นจึงไม่มีวิธีใดที่จะย้ายสิ่งที่สลับโดยไม่ต้องสลับ ? :(
Raffa avatar
jp flag
@jave.web [การจัดการหน่วยความจำ](https://www.kernel.org/doc/html/latest/admin-guide/mm/index.html) มีความซับซ้อนและจำเป็นสำหรับระบบ ⦠เคอร์เนล Linux กำลังดำเนินการ ดูแลเรื่องนั้นเป็นอย่างดี—ดังนั้นสิ่งที่ควรทำคือ “เปลี่ยน” และปล่อยให้เวทมนตร์เกิดขึ้น :) ⦠âมีวิธีอื่นหรือไม่?â แน่นอน⦠âมีวิธีอื่นที่ดีกว่า ทาง â ฉันสงสัย ⦠สคริปต์ในคำตอบของฉันจัดทำขึ้นโดยเฉพาะเพื่อตอบสนองความต้องการของคุณและควรทำงานได้อย่างไร้ที่ติในฐานะบริการ `systemd`
muru avatar
us flag
การตรวจสอบโค้ด: เมื่อกำหนดการแทนที่คำสั่งให้กับตัวแปร (`var=$(foo)`) ไม่จำเป็นต้องใส่เครื่องหมายอัญประกาศรอบๆ การแทนที่คำสั่ง (แต่มันก็ไม่เสียหายอะไร) แต่เมื่อใช้ตัวแปรในคำสั่ง `[ "$used_s" ...]` ควรอ้างอิงตัวแปร
Raffa avatar
jp flag
@muru ขอบคุณสำหรับการตรวจสอบรหัสของคุณ ฉันเห็นด้วยกับคุณโดยสิ้นเชิงเกี่ยวกับแนวคิดของแนวปฏิบัติที่ดี ... อย่างไรก็ตาม ตัวแปรเหล่านั้นคาดว่าจะมีค่าตัวเลขเท่านั้น ดังนั้นจึงไม่จำเป็นต้องใช้เครื่องหมายคำพูดรอบๆ ตัวแปรเหล่านั้น (แต่มันก็ไม่เสียหาย) .. ฉันเห็นความกังวลของคุณเกี่ยวกับ `$used_s` แต่ถึงแม้จะปิดใช้งาน swap ตัวแปรนี้จะมีค่าตัวเลขเป็น `0` ... อย่างไรก็ตาม ความคิดเห็นของคุณเกี่ยวกับเรื่องนี้มีน้ำหนักมากกว่าทางด้านขวา :)
Raffa avatar
jp flag
@muru ฉันต้องแก้ไขและเพิ่ม `[ "$used_s" -gt 0 ]` และ `[ "$used_s" -eq 0 ]` เพื่อป้องกันการออกคำสั่ง `swapoff` / `swapon` โดยไม่จำเป็น ... ฉันยังพบ มันเป็นโอกาสที่จะแยกแยะธุรกิจคำพูดระหว่างทาง :) ... ขอบคุณสำหรับความคิดเห็นของคุณและขอขอบคุณอีกครั้ง
jave.web avatar
cn flag
@Raffa ฉันแค่สงสัยว่าเคอร์เนลสามารถย้ายสิ่งต่าง ๆ จาก RAM เพื่อแลกเปลี่ยนได้หรือไม่หากสามารถทำได้ด้วยวิธีอื่นในขณะที่ยังคงแลกเปลี่ยนไว้ในกรณีที่หน่วยความจำขนาดใหญ่อื่นเริ่มจัดสรร :)

โพสต์คำตอบ

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