เป็นความคิดที่ดีหรือไม่ที่จะสร้างสคริปต์ cron ที่ทำให้การแลกเปลี่ยนว่างเปล่าทุกชั่วโมง?


26

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

ฉันทำcronคำสั่งสั้น ๆเพื่อทำสิ่งนี้โดยอัตโนมัติและฉันก็มีผลลัพธ์ที่ดี:

#! /bin/sh

echo "* */1 * * * root swapoff -a && swapon -a" >> /etc/crontab

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


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

5
ทำไมคุณถึงอยากทำเช่นนี้? ทำไมคุณถึงคิดว่าการใช้งาน swap บางอย่างเป็นสิ่งที่ไม่ดี? เรากำลังพูดถึงการใช้ swap มากแค่ไหน?
marcelm

25
ฉันงงงวย คุณกำลังพูดถึง "ปัญหา" อยู่ แต่ไม่ได้อธิบายถึงผลกระทบเชิงลบใด ๆ ทำไมคุณถึงคิดว่าเป็นปัญหา
David Schwartz

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

12
จะดีไปกว่าการปล่อยให้สลับกันอย่างไร
user253751

คำตอบ:


51

ใช้มันแบบนั้น: ใช่ไม่ดี คุณต้องตรวจสอบว่ามีหน่วยความจำเพียงพอหรือไม่ก่อนที่คุณจะปิดการสลับ ดูhttps://askubuntu.com/a/90399/15811สำหรับรุ่นที่ดีกว่า

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


3
รออะไร? หากหน่วยความจำไม่เพียงพอที่จะให้ swapoff สำเร็จให้ swapoff ถูกฆ่าโดย OOM killer ก่อน ใช่พวกเขาฮาร์ดโค้ดจริง ๆ (ตรวจสอบโดยการเรียกของระบบ)
Joshua

@ โจชัวแน่นอน แต่เขาต้องการให้มันทำงานโดยอัตโนมัติ ไม่ผิดพลาด
Rinzwind

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

@Rinzwind cron ทำงานได้ดีกับงานที่ผิดพลาดและสคริปต์ที่เชื่อมโยงใช้ไม่ได้vmstatเช่นกัน
jpaugh

41

ฉันว่ามันเป็นความคิดที่ไม่ดี หากคุณคิดว่าคุณมีหน่วยความจำว่างและกระบวนการที่ใช้งานอยู่ไม่ได้ถูกย้ายจาก swap ไปยัง RAM คุณอาจไม่มีหน่วยความจำว่างอย่างที่คุณคิดหรือกระบวนการนั้นไม่ได้ทำงานอย่างที่คุณคิด คือ.

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


1
+1: เรื่องใหญ่อะไร ไม่เคยเปลี่ยนระบบที่ใช้งานอยู่ฉันไม่คิดว่าเราควรยุ่งกับฟังก์ชั่นหลักของระบบเช่นนั้นโดยเฉพาะอย่างยิ่งไม่จำเป็นต้องมี
ของหวาน

3
บางครั้งฉันมีปัญหาที่ฉันฆ่ากระบวนการที่มีการรั่วไหลของหน่วยความจำ (ซึ่งบังคับให้ทุกอย่างออกเป็น swap) ทำให้ฉันใช้ RAM ~ 10% ... ดังนั้นทุกครั้งที่คุณสัมผัสบางสิ่งมันจะมีการหน่วงเวลาสองวินาที ฉันสามารถดูว่า OP มาจากไหนและมันจะดีถ้าให้มันทำโดยอัตโนมัติ แต่นี่ไม่ใช่วิธีที่ถูกต้อง
คนอยู่ที่ไหนสักแห่ง

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

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

@ บางคนดูเหมือนว่าคุณเข้าใจผิดว่าระบบหน่วยความจำทำงานอย่างไร คุณไม่จำเป็นต้องมีกระบวนการทั้งหมดใน RAM จริง: การแลกเปลี่ยนถูกจัดการที่ระดับย่อยของหน้าเดียว หน้าใด ๆ ที่ไม่ได้ถูกใช้เป็นเวลานานจะต้องถูกสลับออกไปและหน้าเว็บที่ประกอบด้วยหน่วยความจำที่รั่วไหลออกทั้งหมดจะไม่ถูกใช้อีกครั้งดังนั้นจะไม่มีการสลับกลับมาหลังจากที่สลับเป็น
David Richerby

34

มันเป็นความคิดที่ไม่ดี

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

โดยทั่วไปที่เกิดขึ้นส่วนใหญ่สำหรับหน้าเว็บที่ไม่ได้รับการเข้าถึงเป็นเวลานานซึ่งเป็นตัวบ่งชี้ที่ดีว่าไม่น่าที่พวกเขาจะสามารถเข้าถึงได้ในไม่ช้า

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

เคอร์เนลจะใช้พื้นที่สว็อปทันทีเสมอเมื่อหน่วยความจำกายภาพสูงกว่า 50% ดังนั้นตัวเลขเหล่านี้จะไม่เป็นศูนย์แม้ว่าคุณจะมีหน่วยความจำเพียงพอ


4
เสมอ : ฉันคิดว่าคุณกำลังสันนิษฐานว่า/proc/sys/vm/swappinessเป็นค่าเริ่มต้น70ซึ่งเป็นสิ่งที่ดีสำหรับเซิร์ฟเวอร์และค่อนข้างหน้าออกหน้าสกปรกจากกระบวนการที่ไม่ได้สัมผัสพวกเขาในขณะที่เพื่อให้มีพื้นที่ว่างสำหรับ pagecache เพิ่มเติม สิ่งนี้มักจะไม่ดีสำหรับเดสก์ท็อปเนื่องจากแท็บ alt อาจทำงานช้า
Peter Cordes

@PeterCordes หากหน้าถูกขับออกมาจริง ๆ แคชได้เห็นการเข้าถึงมากกว่าหน้าแอปพลิเคชันที่เป็นปัญหาดังนั้นจึงมีประโยชน์สุทธิในการใช้สิ่งเหล่านี้เป็นแคชดิสก์ ฉันเห็นว่าผู้ใช้มองเห็นประสิทธิภาพการทำงานของ Alt-Tab ได้อย่างไรเช่นรวบรวมเวลาสำหรับโครงการขนาดใหญ่ แต่พบว่าเป็นการยากที่จะกำหนดนโยบายที่รับประกันการตอบสนองแบบทันทีโดยไม่ต้องเสียสละประสิทธิภาพมากเกินไป
Simon Richter

1
กล่าวอีกนัยหนึ่ง: เคอร์เนลถูกปรับเพื่อรับส่งข้อมูล ( swappiness=70) แต่เวลาในการตอบสนองมีความสำคัญต่อประสบการณ์ผู้ใช้มากกว่าบนเดสก์ท็อป มันเป็นการแลกเปลี่ยน หากคุณรวบรวมสิ่งของที่มีขนาดใหญ่เกินไปเล็กน้อยที่จะอยู่ใน pagecache เป็นประจำตรวจสอบว่าให้swappinessสูงขึ้นเล็กน้อยเช่น 20 หรือ 30 แทน 5 หรือ 10 ดูakitaonrails.com/2017/01/17/optimizing-linux- สำหรับ -slow การดูที่vm.vfs_cache_pressureต่ำกว่า 100 ยังช่วยให้การแคชข้อมูลเมตาของ inode / ไดเรกทอรีผ่านหน้าข้อมูลซึ่งเป็นสิ่งที่ดีสำหรับการตอบสนองของ UI
Peter Cordes

1
tunables อื่น ๆ : เขียนหลังเกณฑ์lonesysadmin.net/2013/12/22/... ควบคุมว่า Linux จะเริ่มเขียนข้อมูลลงในดิสก์ได้เร็วแค่ไหนหลังจากมีบางสิ่งเขียนไปยังไฟล์และอนุญาตให้มีหน้าสกปรกกี่หน้า (เช่นจำนวนหน่วยความจำที่สามารถใช้ในการแคชการเขียน)
Peter Cordes

21

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

โดยทั่วไปคุณมีสองกรณี:

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

ดังนั้นจึงมีสองประเด็นหลัก:

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

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

หากคุณต้องการที่จะปรับพฤติกรรมของเคอร์เนลให้ดูที่พารามิเตอร์ swappiness

ressources เพิ่มเติมสองรายการสนับสนุนโดย @ peter-cordes:

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


1
ดูเพิ่มเติมที่akitaonrails.com/2017/01/17/optimizing-linux-for-slow-computersและlonesysadmin.net/2013/12/22/…สำหรับคำแนะนำ / รายละเอียดการปรับแต่งเพิ่มเติม
Peter Cordes

5

คุณสามารถได้ผลลัพธ์เดียวกันโดยบอกให้เคอร์เนลเพิ่มแคช:

echo 3 > /proc/sys/vm/drop_caches

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


0

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


  • ดังนั้นเมื่อทำการล้างหน่วยความจำ SWAP อย่างต่อเนื่องภาระงานบนเครื่องของคุณจะเพิ่มขึ้นอย่างมาก
  • การใช้งานแอพพลิเคชั่นที่มีหน่วยความจำใน SWAP Partition นั้นอาจเสียหายได้

แต่ฉันขอแนะนำให้คุณศึกษาhtopอย่างใกล้ชิดว่าแอปพลิเคชันใดที่ใช้หน่วยความจำของคุณในบรรทัดคำสั่งกับแอปพลิเคชันและตัดสินใจปิดแอปพลิเคชัน gnome-system-monitorสามารถให้คุณมีความเข้าใจที่ดีเช่นกันในกระบวนการของแท็บ
หากคุณมีแอพพลิเคชั่นขนาดใหญ่ที่ใช้แรมเยอะ อย่าเรียกใช้พวกเขาทั้งหมดในครั้งเดียว

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