ทำไม swappiness ถูกตั้งค่าเป็น 60 โดยปริยาย?


109

ฉันเพิ่งอ่านบางอย่างเกี่ยวกับความว่องไวบน Linux ฉันไม่เข้าใจว่าทำไมค่าเริ่มต้นถูกตั้งค่าเป็น 60

ตามที่ฉันพารามิเตอร์นี้ควรตั้งค่าเป็น 10 เพื่อลดการแลกเปลี่ยน Swap อยู่บนฮาร์ดไดรฟ์ของฉันดังนั้นเราจึงช้ากว่าหน่วยความจำของฉันมาก

ทำไมพวกเขาถึงกำหนดค่าเคอร์เนลแบบนั้น?


2
@Mat ดูสิ่งนี้สำหรับวิธีการเปรียบเทียบอย่างรวดเร็ว
Geremia

คำตอบ:


133

ตั้งแต่เคอร์เนล 2.6.28, Linux ใช้กลยุทธ์การแทนที่เพจSplit Least Recent Used (LRU) เพจที่มีซอร์สระบบไฟล์เช่นข้อความโปรแกรมหรือไลบรารีที่แบ่งใช้เป็นของแคชไฟล์ เพจที่ไม่มีการสำรองข้อมูลระบบไฟล์เรียกว่าเพจที่ไม่ระบุชื่อและประกอบด้วยข้อมูลรันไทม์เช่นพื้นที่สแต็กที่สงวนไว้สำหรับแอปพลิเคชันเป็นต้นโดยทั่วไปหน้าของแคชไฟล์จะถูกกว่าเพื่อขับออกจากหน่วยความจำ . เนื่องจากเพจที่ไม่ระบุชื่อไม่มีการสำรองระบบไฟล์จึงต้องคงอยู่ในหน่วยความจำตราบใดที่โปรแกรมนั้นต้องการเว้นแต่จะมีพื้นที่สว็อปเพื่อจัดเก็บไว้

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

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

vm.swappinessตัวเลือกปรับแต่งที่มีการเปลี่ยนแปลงความสมดุลระหว่างการสลับหน้าแคชไฟล์ในความโปรดปรานของหน้าเว็บที่ไม่ระบุชื่อได้ แคชไฟล์จะได้รับค่าลำดับความสำคัญตามอำเภอใจ 200 ซึ่งvm.swappinessตัวปรับจะถูกหัก ( file_prio=200-vm.swappiness) โดยค่าเริ่มต้นหน้าไม่ระบุชื่อหน้าเริ่มต้นด้วย 60 ( anon_prio=vm.swappiness) ซึ่งหมายความว่าโดยค่าเริ่มต้นน้ำหนักที่มีความสำคัญจะอยู่ในระดับปานกลางในความโปรดปรานของหน้าเว็บที่ไม่ระบุชื่อ ( anon_prio=60, file_prio=200-60=140) พฤติกรรมที่กำหนดไว้ในmm/vmscan.cต้นไม้แหล่งเคอร์เนล

เมื่อได้รับvm.swappinessจาก100ลำดับความสำคัญจะเท่ากัน ( file_prio=200-100=100, anon_prio=100) สิ่งนี้จะเหมาะสมสำหรับระบบหนักของ I / O หากไม่ต้องการให้เพจจากไฟล์แคชถูกขับไล่เพื่อให้ได้หน้านิรนาม

ตรงกันข้ามการตั้งค่าvm.swappinessเพื่อ0จะป้องกันไม่ให้เคอร์เนลจากขี้บ่นหน้าไม่ระบุชื่อในความโปรดปรานของหน้าจากแฟ้มแคช สิ่งนี้อาจมีประโยชน์หากโปรแกรมทำการแคชส่วนใหญ่ด้วยตนเองซึ่งอาจเป็นกรณีของฐานข้อมูลบางตัว ในระบบเดสก์ท็อปสิ่งนี้อาจปรับปรุงการโต้ตอบ แต่ข้อเสียคือประสิทธิภาพการทำงานของ I / O น่าจะได้รับผลกระทบ

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


4
การติดตั้งระบบปฏิบัติการบนอุปกรณ์โซลิดสเตตมีผลต่อการแลกเปลี่ยนอย่างไร?
gerrit

3
@gerrit ประเภทของสื่อจัดเก็บข้อมูลพื้นฐานไม่เกี่ยวข้อง รายละเอียดชนิดนั้นไม่สามารถมองเห็นได้ในระบบย่อยการจัดการหน่วยความจำ
Thomas Nyman

ประเภทของสื่อจัดเก็บข้อมูลพื้นฐานนั้นไม่เกี่ยวข้องกับมุมมองการใช้หน่วยความจำ คุณอาจพิจารณาลดความว่องไวที่สื่อสนับสนุนจำนวน จำกัด ในการอ่าน / เขียน (เช่นหน่วยความจำแฟลช) เพื่อเพิ่มอายุการใช้งาน
MatrixManAtYrService

2
@MatrixManAtYrService ขอบคุณภายในระดับการสึกหรอและความซ้ำซ้อนในตัว SSD ที่ทันสมัย ​​(ซึ่งคำถามในความคิดเห็นก่อนหน้านี้หมายถึง) ได้รับการแสดงถึง 2 PB (!)ของการเขียนก่อนที่จะแสดงข้อผิดพลาด แม้กระทั่งไดรฟ์ที่ถูกกว่าในการทดลองเหล่านั้นกินเวลา 300TB ก่อนที่จะเกิดข้อผิดพลาดเกินระดับการรับประกันอย่างเป็นทางการประมาณ 100TB อย่างน้อยในความคิดของฉันปรับ swappiness เพื่อรองรับ SSD บนเวิร์กสเตชันหรือแล็ปท็อปไม่รับประกันจริง ๆ
Thomas Nyman

2
@ThomasNyman คุณสร้างจุดดีสำหรับผู้ใช้ส่วนใหญ่มันไม่คุ้มค่าที่จะกังวล กรณีที่นำฉันไปที่โพสต์นี้เกี่ยวข้องกับพื้นที่สว็อปในการ์ด SD ซึ่งฉันจำได้ว่าเป็นกรณีขอบ
MatrixManAtYrService

9

ปัญหาคือไม่มีค่าเริ่มต้นที่เหมาะสมกับทุกความต้องการ การตั้งค่าตัวเลือก swappiness เป็น 10 อาจเป็นการตั้งค่าที่เหมาะสมสำหรับเดสก์ท็อป แต่ค่าเริ่มต้นที่ 60 อาจเหมาะสมกว่าสำหรับเซิร์ฟเวอร์ กล่าวอีกอย่างคือความไม่แน่นอนของ swappiness ต้องถูกปรับตามกรณีการใช้งานเช่นเดสก์ท็อปกับเซิร์ฟเวอร์, ประเภทแอปพลิเคชันและอื่น ๆ

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

บทความนี้อาจทำให้ไฟในหัวข้อเช่นกัน โดยเฉพาะอย่างยิ่งวิธีการประเมินแนวโน้มการแลกเปลี่ยน


ฉันไม่เข้าใจว่าทำไม 60 เหมาะสำหรับเซิร์ฟเวอร์มากกว่า ฉันมีเซิร์ฟเวอร์และกระบวนการบางอย่างเปลี่ยนไปแม้ว่าเราจะมี RAM อิสระ 40% ก็ตาม ไม่สมเหตุสมผลสำหรับฉัน
Hugo

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


ลิงก์ไปยังบทความที่จะตาย แต่คุณยังสามารถดูได้จากเครื่อง Wayback
DRS

บทความที่เชื่อมโยงเป็นข้อมูล ขอขอบคุณที่แบ่งปัน
Pistos

5

การเพิ่มรายละเอียดเพิ่มเติมในคำตอบข้างต้น
ในขณะที่เราใช้ VM มากขึ้นโฮสติ้ง linux อาจเป็น vm บนหนึ่งในสภาพแวดล้อมคลาวด์เหล่านี้ ในตัวอย่างที่ 1 และ 2 เรามีความคิดที่ดีเกี่ยวกับแอพพลิเคชั่นที่ใช้งานและปริมาณ RAM ที่ใช้ไป ใน 3 ไม่มาก

  • ตัวอย่างที่ 1
    คลาวด์ส่วนบุคคลที่มีประสิทธิภาพสูง (คิดว่าธนาคารส่วนใหญ่จะจ่ายเป็นล้าน) หนึ่งที่ดิสก์จัดทำโดยอาเรย์การจัดเก็บข้อมูลราคาแพงมากที่มี IO ดีมาก ส่วนหนึ่งของที่เก็บข้อมูลนั้นอาจอยู่ใน RAM (ในอาร์เรย์ดิสก์) ที่สำรองข้อมูลโดย SSD ดิสก์ที่สำรองไว้โดยดิสก์ทั่วไปที่มีแกนหมุน ในสถานการณ์นี้ดิสก์ที่ VM เห็นอาจช้ากว่า RAM ที่สามารถเข้าถึงได้เพียงเล็กน้อยเท่านั้น สำหรับ vm เดี่ยวไม่มีความแตกต่างระหว่าง swap และ ram มากนัก
  • ตัวอย่างที่ 2
    เหมือนกับตัวอย่าง 1 แต่แทนที่จะเป็น vm เดี่ยวคุณมีหลายร้อยหลายพันหรือมากกว่า ในสถานการณ์นี้เราพบว่าเซิร์ฟเวอร์ (hypervisor) RAM มีราคาถูกและมีจำนวนมากซึ่งพื้นที่เก็บข้อมูลมีราคาแพง (ค่อนข้างจะพูด) หากเราแบ่งข้อกำหนด RAM ระหว่าง Hypervisor RAM และ SWAP ที่จัดเก็บโดยอาร์เรย์ที่มีราคาแพงมากเราพบว่าเราใช้ RAM ทั้งหมดในอาร์เรย์ที่จัดเก็บข้อมูลอย่างรวดเร็วบล็อกจะถูกใช้งานโดย SSD และสุดท้ายคือแกนหมุน ทันใดนั้นทุกคนก็เริ่มช้าลงจริงๆ ในกรณีนี้เราอาจต้องการกำหนด RAM จำนวนมาก (จากไฮเปอร์ไวเซอร์) ไปยัง VM และตั้งค่า swappiness เป็น 0 (สลับเฉพาะเพื่อหลีกเลี่ยงเงื่อนไขหน่วยความจำ) เนื่องจากผลกระทบสะสมของ vm เหล่านั้นทั้งหมดจะมีผลต่อประสิทธิภาพของ การจัดเก็บ
  • ตัวอย่างที่ 3 แล็ปท็อปหรือเดสก์ท็อปที่ทันสมัยอาจมี SSD ความต้องการของหน่วยความจำนั้นไม่เป็นที่รู้จัก เบราว์เซอร์ใดที่ผู้ใช้จะใช้พวกเขาจะเปิดแท็บกี่แท็บพวกเขาจะแก้ไขเอกสารรูปภาพ RAW หรือวิดีโอพวกเขาทั้งหมดจะใช้ RAM การตั้งค่า swappiness ให้เป็นค่าต่ำและปรับแต่งระบบไฟล์อื่น ๆ จะหมายความว่ามีการเขียนลง SSD น้อยลงและมันจะมีอายุการใช้งานนานขึ้น

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