ฉันต้องการพื้นที่สว็อปถ้าฉันมี RAM มากกว่าจำนวนเพียงพอหรือไม่


91

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

นี่เป็นสิ่งที่ดีสำหรับเมื่อคุณอยู่ในเครื่องที่มี RAM จำนวนเล็กน้อยและไม่ต้องการที่จะพบปัญหาหากคุณหมด อย่างไรก็ตามหากระบบของคุณมีRAM 16 GBหรือ32 GBและสมมติว่าคุณไม่ได้ใช้ฐานข้อมูล MySQL สำหรับ StackExchange หรือแก้ไขภาพยนตร์ความยาว 1080p เต็มรูปแบบใน Linux ควรใช้พาร์ติชัน swap หรือไม่


16
@ ไมค์เซอร์คุณรู้ไหมฉันอยากจะยอมรับจดหมายสองฉบับนี้เป็นคำตอบสำหรับเอฟเฟ็กต์ตลก ๆ
IQAndreas

3
@ Janis - มีค่าใช้จ่ายมาก และคุณสามารถทำได้อย่างง่ายดายโดยไม่ต้องสลับกับแม้แต่เครื่อง 1GB หากคุณใช้การจัดการหน่วยความจำเสียง สลับค่าใช้จ่ายประสิทธิภาพ - เมื่อคุณมีเคอร์เนลจะใช้มันอย่างหลีกเลี่ยงไม่ได้ ดังนั้นใน 1TB หรือดิสก์ขนาดใดก็ตามที่สร้างพาร์ติชัน swap นั้นเป็นการเชิญให้เคอร์เนลใส่หน้าหน่วยความจำบนดิสก์แทนที่จะเก็บไว้ใน RAM หรือวางมันลงอย่างสิ้นเชิง ด้วย 16gb ผู้ใช้ทั่วไปจะไม่ใช้มันทั้งหมด - ฉันมี 24gb RAM ที่ใช้ / 2gb และแคช10gb (เพราะฉันใช้ฝนตกหนัก/tmp)หลังจาก 3 วันทำงาน
mikeserv

5
@mikeserv คุณผิดฉันกลัว; ฉันสังเกตุตัวชี้วัดดิสก์ที่แสดงอยู่ ตราบใดที่มีหน่วยความจำว่างการสลับไม่ได้ถูกใช้เฉพาะเมื่อหน่วยความจำถูกเติมเต็มการแลกเปลี่ยนเริ่มต้น ฉันคิดว่ามันขึ้นอยู่กับว่าคุณใช้คอมพิวเตอร์ของคุณอย่างไร ระบบเดสก์ท็อปที่ถูกปิดทุกเย็นจะไม่ค่อยประสบปัญหาหน่วยความจำ แต่ระบบของฉันใช้เวลาไม่กี่เดือน ใช่เปลี่ยนค่าใช้จ่ายประสิทธิภาพ แต่ถ้าไม่มีพื้นที่แรมเหลืออยู่ระบบของคุณสามารถทำงานต่อไปได้ ตัวเลือกของคุณมีอะไรบ้าง? บางทีคุณสามารถอธิบายรายละเอียดเกี่ยวกับอาร์กิวเมนต์การจัดการหน่วยความจำได้ ฉันใช้ระบบ Linux ของฉันตามที่กำหนดไว้ล่วงหน้า
Janis

40
@mikeserv คุณแสดงความคิดเห็นสั้นกว่า 15 อักขระอย่างไร
immibis

คำตอบ:


98

ใช่.

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

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

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

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

  1. ล้างหน้าจากแคชบัฟเฟอร์
  2. ล้างหน้าจากการแมป (มีประสิทธิภาพเหมือนกับ # 1 ในระบบส่วนใหญ่)
  3. ย้ายหน้าเว็บที่ไม่ได้เข้าถึงเป็นเวลานาน - ไม่ควรสลับ - (อันที่จริงแล้วอาจเกิดขึ้นได้ในเชิงรุกไม่จำเป็นต้องเป็นช่วงเวลาสุดท้าย)
  4. ฆ่ากระบวนการของคุณหรือฆ่ากระบวนการแบบสุ่ม (OOM)
  5. เคอร์เนลตกใจ

ตัวเลือก # 4 และ # 5 ไม่เป็นที่พึงปรารถนาและจะเกิดขึ้นหากระบบปฏิบัติการไม่มีตัวเลือกอื่น ตัวเลือก # 1 และ # 2 หมายความว่าคุณทิ้งบางสิ่งบางอย่างไปซึ่งคุณอาจต้องการอีกครั้งในไม่ช้า สิ่งนี้ส่งผลเสียต่อประสิทธิภาพ

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

โดยการลบตัวเลือก # 3 คุณได้ จำกัด ระบบปฏิบัติการอย่างมีประสิทธิภาพเพื่อทำ # 1 หรือ # 2 การโหลดเพจจากดิสก์เหมือนกับการโหลดซ้ำจาก swap ยกเว้นการโหลดจาก swap มักจะมีโอกาสน้อยกว่า (เนื่องจากการตัดสินใจเลือกเพจที่เหมาะสม)

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

[แก้ไข]

ผู้อ่านอย่างระมัดระวังของmmap manpageโดยเฉพาะคำอธิบายMAP_NORESERVEจะสังเกตเห็นอีกเหตุผลที่ดีว่าทำไมการแลกเปลี่ยนจึงค่อนข้างจำเป็นแม้ในระบบที่มีหน่วยความจำกายภาพ "เพียงพอ":

"เมื่อไม่ได้ทำการสำรองพื้นที่สว็อปหนึ่งอาจได้รับ SIGSEGV เมื่อมีการเขียนหากไม่มีหน่วยความจำกายภาพ"

- เดี๋ยวก่อนนั่นหมายความว่าไง?

หากคุณแมปไฟล์คุณสามารถเข้าถึงเนื้อหาของไฟล์ได้โดยตรงราวกับว่าไฟล์นั้นอยู่ในพื้นที่ที่อยู่ของโปรแกรม สำหรับการเข้าถึงแบบอ่านอย่างเดียวระบบปฏิบัติการต้องการหลักการไม่เกินหน้าเดียวของหน่วยความจำทางกายภาพซึ่งสามารถ repopulate กับข้อมูลที่แตกต่างกันทุกครั้งที่คุณเข้าถึงหน้าเสมือนที่แตกต่างกัน (สำหรับเหตุผลด้านประสิทธิภาพแน่นอนว่าไม่ใช่สิ่งที่ทำ โดยหลักการคุณสามารถเข้าถึงเทราไบต์ของข้อมูลด้วยหน้าหน่วยความจำกายภาพเดียว) ตอนนี้จะเกิดอะไรขึ้นถ้าคุณยังเขียนไปที่การแมปไฟล์? ในกรณีนี้ระบบปฏิบัติการต้องมีฟิสิคัลเพจ - หรือพื้นที่สว็อป - พร้อมสำหรับทุกเพจที่เขียนไป ไม่มีวิธีอื่นในการเก็บข้อมูลไว้รอบ ๆ จนกว่ากระบวนการ writeback หน้าสกปรกจะทำงานของมัน (ซึ่งอาจเป็นเวลาหลายวินาที) ด้วยเหตุผลนี้ OS ขอสงวนพื้นที่สลับ (แต่ไม่จำเป็นต้องผูกมัด) ดังนั้นในกรณีที่คุณเขียนลงในแผนที่ในขณะที่ไม่มีหน้าทางกายภาพที่ไม่ได้ใช้ (เป็นไปได้มากและเป็นสภาพปกติ) คุณ ' อีกครั้งรับประกันว่ามันจะยังคงทำงาน

ตอนนี้จะเกิดอะไรขึ้นถ้าไม่มีการแลกเปลี่ยน? หมายความว่าไม่สามารถสำรอง swap ได้ (duh!) และหมายความว่าทันทีที่ไม่มีหน้าทางกายภาพว่างเหลืออยู่และคุณกำลังเขียนไปยังหน้าเว็บคุณกำลังประหลาดใจในรูปแบบของกระบวนการรับ ความผิดพลาดในการแบ่งส่วนและอาจถูกฆ่า

[/ แก้ไข]

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

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

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

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


7
ไม่จริงทั้งหมด: อาจเป็นประโยชน์สำหรับเคอร์เนลที่จะไม่ใช้ดิสก์โดยเฉพาะอย่างยิ่งถ้าคุณได้กำหนดค่า OOM ให้กับข้อมูลจำเพาะของคุณ หาก OOM killer กำหนดค่าให้จัดการกับการล้างข้อมูลของคุณการทำเช่นนั้นแทนที่จะเสียพื้นที่ดิสก์และการทำให้เครื่องทำงานช้าลงจะเป็นประโยชน์
mikeserv

22
อะไรคือความแตกต่างระหว่างการมี RAM 8 GB และ 8 GB swap และ RAM 16 GB และไม่มี swap? หากคอมพิวเตอร์ของคุณตัดสินใจว่ามันต้องการหน่วยความจำ 16.001 GB มันจะไม่เริ่มล้าง / ฆ่าสิ่งต่าง ๆ เหมือนกัน (แต่ประสิทธิภาพจะลดลงก่อนที่มันจะเริ่มขึ้น)
Nick T

5
@NickT: การแลกเปลี่ยนไม่ได้มีไว้สำหรับ RAM มากขึ้นเท่าธงแดงว่ามีบางอย่างกำลังจะถูกฆ่าในไม่ช้า ฉันชอบมีธงสีแดงก่อนที่จะถูกฆ่าแทนที่จะมีกระบวนการ "สุ่ม" หายไปต่อหน้าต่อตาฉัน
Mooing Duck

10
-1 คำตอบนี้ไม่สมเหตุสมผล ทำไม heck ถึงมีหน่วยความจำช้า (swap) มีประสิทธิภาพที่ดีกว่าหน่วยความจำที่เร็วกว่า (RAM) ในปริมาณเท่ากัน ในบางจุดที่คุณต้องยอมรับ RAM เพียงพอหมายความว่าไม่จำเป็นต้องสลับ ..
Mehrdad

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

50

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

วันนี้ฉันกำลังปรับขนาดหน่วยความจำประมาณ 1-1.5 เท่า หน่วยความจำ 2 เท่าที่เคยเป็นกฎของหัวแม่มือ ดิสก์สว็อปมี "ราคาถูก" ซึ่งไม่จำเป็นต้องสำรองหรือป้องกัน

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

ตระหนักดีว่าสิ่งต่าง ๆ เช่น / tmp สามารถอยู่ในพื้นที่สว็อปได้

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


16
+1 การมีการสลับหมายถึงความแตกต่างระหว่างประสิทธิภาพการเจ็บภายใต้หน่วยความจำต่ำและฮาร์ดไดรฟ์
Davidmh

6
@mikeserv ไม่ว่าคุณจะกำหนดค่าอย่างไรหากโปรแกรมของคุณพยายามจัดสรรหน่วยความจำมากกว่าที่มีอยู่มีบางอย่างกำลังจะพังหรือระบบปฏิบัติการจะเริ่มฆ่าพวกเขา
Davidmh

6
@Davidmh: ด้วยเหตุผลที่ว่าไฟล์สว็อปของคุณต้องมีขนาดใหญ่มากมิฉะนั้นโปรแกรมของคุณจะยังคงทำงานผิดพลาดเมื่อไฟล์สว็อปหมด
Mehrdad

6
@ Mehrdad แต่มันก็แพงกว่าด้วย ระบุว่าคุณมี RAM X GB เพราะเท่าที่คุณสามารถจ่ายได้มันแย่กว่าการมี RAM X GB และ Y of swap อย่างเคร่งครัดสำหรับค่าที่สมเหตุสมผลของ Y (ขึ้นอยู่กับการใช้งานและขนาดของคุณ HD ของคุณ)
Davidmh

9
"พื้นที่สว็อปของคุณให้เวลากับคุณน้อยในการแก้ปัญหา" - มันหมายความว่าฉันต้องนั่งนานกว่าที่ด้านหน้าของเครื่องที่ไม่ตอบสนองจนกว่าหน่วยความจำจะ "แก้ไข"
Raphael

23

อาจจะ:

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

เริ่มต้นด้วยพาร์ทิชัน swap ที่ใช้งานในสิ่งที่คุณคิดว่ามีขนาดเพียงพอ

จากนั้นเปิดเทอร์มินัลในพื้นที่ทำงานและออกคำสั่งfree -hs 1ซึ่งจะรายงานการใช้งานทุกๆวินาที

เลือกที่จะสลับเป็นพื้นที่ทำงานอื่น ๆ

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

เมื่อคุณรู้สึกว่าคุณมีระบบภายใต้ภาระสูง (หรือสูงที่สุดเท่าที่คุณเคยได้รับแล้วบางส่วน) มองไปที่เครื่องและตรวจสอบผลลัพธ์ หรือดีกว่ายังเปลี่ยนเส้นทางผลลัพธ์ไปยังไฟล์โดยเพิ่ม>output.txtคำสั่งเพื่อให้คุณสามารถตรวจสอบการทำงานเต็ม หาก Swap ของคุณใช้ไม่เกิน Mem ฟรีคุณไม่จำเป็นต้องสลับ ถ้าเป็นเช่นนั้นคุณทำ free.png

ฉันไม่ต้องการแลกเปลี่ยน บางทีคุณอาจจะทำ ทำไมไม่ลองดูล่ะ?

เท่าที่เกี่ยวข้องกับการเปลี่ยนขนาดกฎกติกาทั่วไปมากเกินไปเพราะนี่คือการใช้คำถามตาม -


2
ดังนั้นคุณจะบอกว่าการแลกเปลี่ยนนั้นจะใช้เมื่อระบบของคุณต้องการเท่านั้น? ในกรณีนี้จะมีบทลงโทษหรือไม่ในการเปิดใช้งานการสลับ - ในกรณี? ความคิดเห็นอื่น ๆ ดูเหมือนจะแนะนำว่าแม้การปรากฏตัวของการแลกเปลี่ยนสามารถเป็นอันตรายต่อการปฏิบัติงาน?
MrWhite

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

คุณสามารถสคริปต์นี้เพื่อเพิ่มการแลกเปลี่ยนขึ้นเวลาใด ๆswapไปมากกว่าfree?
JFA

@JFA ฉันไม่ได้เห็นสิ่งนี้แล้ว โดยส่วนตัวแล้วฉันมีปัญหากับแนวคิดของการสำรองพื้นที่สว็อปในปริมาณที่ไม่แน่นอนสำหรับวัตถุประสงค์นี้ ในทางทฤษฎีทุกสิ่งเป็นไปได้ มันเป็นขั้นตอนการดำเนินการที่น่าสนใจ
เอ็ลเดอ

17

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

อาจจะ!

ฉันเคยพบปัญหาในอดีตด้วย "อุปกรณ์" ที่ฉันสร้างขึ้นใช้งาน Linux - ทำงานบนอุปกรณ์แฟลชขนาดกะทัดรัดฉันไม่ต้องการใส่ CF ของฉันโดยใช้ swap และมีหน่วยความจำเพียงพอสำหรับแอปพลิเคชัน

อุปกรณ์เหล่านี้ส่วนใหญ่ทำงานได้ดี แต่ในกล่องที่ยุ่งโดยเฉพาะฉันพบปัญหา:

หน่วยความจำเสื่อมเสีย

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

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

ลองดู / proc / buddyinfo - ของฉันดูเหมือนว่าตอนนี้:

Node 0, zone      DMA      9      5      3      4      2      3      2      2      3      3      1 
Node 0, zone    DMA32  33901   1149      0      0      0      0      0      0      0      0      1 
Node 0, zone   Normal   2414   1632    259     22      3      0      2      0      1      1      0 

ตัวเลขแสดงถึงบล็อกที่มีขนาดแตกต่างกัน แต่ละขนาดมีขนาดครึ่งหนึ่งของบล็อกถัดไปจากบล็อก 4mb ทางด้านซ้ายถึง 4kb ทางด้านขวา (นั่นคือ 4mb, 2mb, 1mb และอื่น ๆ ) เครื่องที่เพิ่งบู๊ตใหม่ควรมีบล็อคทั้งหมดทางด้านซ้ายน้อยมากทางด้านขวา (= ไม่กระจัดกระจาย) โปรดจำไว้ว่าจำนวนหน่วยความจำเท่ากัน (เช่น 4mb) จะแสดงเป็นตัวเลขที่แตกต่างกันทั่วทั้งคอลัมน์ - 1 บล็อกในคอลัมน์ซ้ายสุด 1024 ในคอลัมน์ขวาสุด

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

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

ในกล่องที่ขัดข้องฉันมีบล็อก 4kb และ 8kb นับแสนและไม่มากเลย

เท่าที่ฉันสามารถบอกได้ (ไปที่เครื่องที่เสียหาย!) เคอร์เนลจะย้ายจากหน่วยความจำเพื่อสลับและเปลี่ยนเป็นหน่วยความจำ แต่จะไม่ย้ายจากหน่วยความจำไปยังหน่วยความจำ


3
กรณีของคุณดูเหมือนจะเป็นสิ่งที่ดีสำหรับการจัดสรร / การนำไปใช้งาน hugepages มันจะหลีกเลี่ยงปัญหาการแตกแฟรกเมนต์ (เนื่องจาก hugepage ที่มีขนาดที่แน่นอนเมื่อจัดสรรแล้วจะถูกจัดสรรใหม่ในขนาดนั้นเท่านั้น)
mikeserv

2
นั่นเป็นเหตุผลที่ดีที่สุดที่ฉันเคยอ่านในความโปรดปรานของการใช้ swap partition ฉันลองค้นหาอย่างรวดเร็วและไม่พบข้อมูลอ้างอิงฉันสงสัยว่าเพราะเหตุใดคุณลักษณะนี้จึงไม่ได้รับการบันทึกบ่อยขึ้น
ถึง마 SE

1
แอปของคุณ (ไม่โปร่งใส) อาจไม่สามารถใช้งานได้ แอพที่ต้องการหน่วยความจำจำนวนมากสามารถใช้งานได้ เช่นเซิร์ฟเวอร์ฐานข้อมูล java jvm ต้องเปิดใช้งานอย่างชัดเจนและจะกลายเป็นพูลหน่วยความจำแยกต่างหากที่ไม่สามารถใช้เพื่อวัตถุประสงค์อื่นได้ สิ่งนี้อาจดีหรือไม่ดีขึ้นอยู่กับสถานการณ์ของคุณ เรียนรู้เกี่ยวกับ hugepages แบบโปร่งใส ความพยายามที่จะย้ายสิ่งต่าง ๆ เหล่านี้เพื่อให้คุณใช้ hugepages (สำหรับการปรับปรุงประสิทธิภาพ) แม้ว่าแอปของคุณจะไม่รู้ หากหน่วยความจำคือสิ่งที่กระจัดกระจายสามารถไปทางทิศใต้เป็น hugepage sweeper มีมากกว่าที่จะทำ
Dan Pritts

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

1
ติดตามคำถาม คุณหมายถึงอะไรโดย“ การกระจายตัวของหน่วยความจำ”? MMU ไม่สนใจว่าหน้าทางกายภาพที่ใช้สำหรับหน้าต่อเนื่องในบางพื้นที่ที่อยู่เสมือนจะต่อเนื่องกันหรือไม่ หน้าฟิสิคัลมีการแยกส่วน แต่ไม่สำคัญ (ตราบใดที่เรากำลังพูดถึงหน่วยความจำแอปพลิเคชันธรรมดาบนเครื่องฟิสิคัลคลัสเตอร์เดียวและไม่เช่นหน้าหน่วยความจำที่ใช้โดยอุปกรณ์ต่อพ่วงหรือไฮเปอร์ไวเซอร์) เมื่อโปรแกรมถาม 16kB โปรแกรมจะได้รับสี่หน้าซึ่งอาจอยู่หรือไม่อยู่ใกล้กันในหน่วยความจำกายภาพ
Gilles

15

พาร์ติชั่นสว็อปมีค่ามากเกินกว่าจะทำตัวเป็น RAM พิเศษเมื่อคุณหมด

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

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

ปัจจัยเหล่านี้เข้าด้วยกันทำให้ฉันเชื่อว่าเป็นการดีกว่าที่จะมี swap บางอย่างในเกือบทุกระบบปกติ แต่สำหรับ ram ขนาดใหญ่ฉันไม่สนใจกฎ ram * 2 และเพียงแค่ใส่ swap ของฉันที่ 4-8GB (ขึ้นอยู่กับขนาดของดิสก์ )


9
แม้ 4GB จะใหญ่เกินไปสำหรับเดสก์ท็อป ฉันต้องการให้ OOM killer เปิดใช้งานก่อนที่จะรอการสับเปลี่ยนจำนวนมากเพื่อเติมเต็มหากมีสิ่งผิดปกติเกิดขึ้น (ถ้าฉันเคยวิ่งเข้าไปในกรณีที่ฉันต้องการมากกว่านี้ฉันสามารถ dd และ mkswap swap file ได้ก่อนที่จะทำงานอะไรก็ตามที่ต้องใช้หน่วยความจำเสมือนมากกว่าเครื่องของฉันมี RAM นั่นคือถ้าการออกจากเว็บเบราว์เซอร์ของฉันไม่เพียงพอ ... )
Peter Cordes

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

1
เรื่องตลก: วันนี้บนแล็ปท็อปของฉันที่มี 4GB of RAM, 0.5G swap (SSD), firefox ทริกเกอร์ OOM killer (ซึ่งเลือก firefox) ฉันไม่เคยเกิดขึ้นมาก่อน (แม้ว่าฉันจะใช้แลปท็อปมากกว่าปกติ) ไม่มีอะไรที่ค่อนข้างจะทำงานอยู่อีกต่อไป (แค่ gnome-terminal ใน xfce) ดังนั้นฉันคิดว่าฉันโอเคกับมันเนื่องจาก Firefox ควรรู้ดีกว่าการผูก RAM มาก ฉันเห็นคนพูดว่า "เว็บเบราว์เซอร์ทดสอบความเครียดระบบย่อยหน่วยความจำเสมือน" เมื่อไม่นานมานี้ "หรืออะไรทำนองนั้น Firefox ค่อนข้างแย่ในการเพิ่มแคชสำหรับแท็บที่ไม่ได้ใช้งานมาหลายวันเป็นต้น
Peter Cordes

3
กรณีหนึ่งที่ Linux พิจารณาพื้นที่สว็อปที่มีอยู่คือเมื่อกระบวนการขนาดใหญ่พยายามเรียกใช้ลูก: การเรียกระบบ fork () + exec () เริ่มต้นโดยการทำซ้ำการจัดสรรของผู้ปกครองอย่างคร่าวๆ - เคอร์เนลไม่สามารถรับประกันได้ว่าเด็กใหม่จะเล็กลง กว่าผู้ปกครอง โดยทั่วไปพื้นที่สว็อปไม่ได้ใช้ แต่ถ้าไม่มีส้อม () อาจล้มเหลว ตัวอย่างทั่วไปของไคลเอ็นต์คือเบราว์เซอร์ที่เริ่มต้นปลั๊กอินหรือบนเซิร์ฟเวอร์เมื่อแอปพลิเคชันคอนเทนเนอร์ขนาดใหญ่เรียกใช้โปรแกรมตัวช่วย 1/2 หรือ 1GiB ของการแลกเปลี่ยนมักจะเพียงพอที่จะแก้ปัญหาได้ Google "java exec ไม่สามารถจัดสรรหน่วยความจำ"
James

13

คุณไม่ควรสลับขนาดใหญ่กว่าขนาดสูงสุดที่คุณทนได้เพื่อรอให้เคอร์เนลสลับเข้า / ออก มิฉะนั้นคุณเพียงแค่สร้างโหมดความล้มเหลวใหม่สำหรับระบบของคุณ (กลายเป็น bogged ลงในการแลกเปลี่ยน) โปรดทราบว่าแม้จะมีไดรฟ์ที่ทันสมัยสามารถถ่ายโอนตามคำสั่งของ GB / วินาที แต่โดยทั่วไปแล้ว Linux สามารถย้ายการแลกเปลี่ยนที่อัตรามากกว่าตามเส้นของร้อยกิโลไบต์หรืออย่างน้อยที่สุดเมกะไบต์ต่อวินาที การสลับขนาดใหญ่อาจทำให้ระบบของคุณไม่สามารถใช้งานได้เป็นเวลาหลายชั่วโมงหลายชั่วโมงหรือหลายวัน

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

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


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

อาร์กิวเมนต์เดียวกับพื้นที่สว็อปที่ฉันพบคือ: "บางโปรแกรมรั่วหน่วยความจำ" และ? หากนักฆ่า OOM ฆ่าสิ่งสำคัญที่คุณไม่ได้บันทึกไว้คุณก็สูญเสียงานของคุณไปอย่างมีประสิทธิภาพ ซึ่งหมายความว่าอาร์กิวเมนต์นี้ไม่เกี่ยวข้องอย่างสมบูรณ์ฉันสามารถบังคับให้ปิดเครื่องของฉันเพื่อให้มีผลเหมือนกันแน่นอนในขณะที่ยังมีพื้นที่สว็อปสูงสำหรับงานที่มีลำดับความสำคัญต่ำซึ่งใช้หน่วยความจำจำนวนมากและมักจะสลับกัน หากเครื่องของคุณติดค้างในสถานะเช่นนั้นมันเป็นความผิดของคุณ ครั้งเดียวที่มันเกิดขึ้นกับฉันคือตอนที่ฉันเขียนโปรแกรมเพื่อเติมความทรงจำในการทำงานทั้งหมด
Sahsahae

11

เฉพาะในกรณีที่คุณต้องการที่จะจำศีลในการสลับ (คุณสมบัตินี้เรียกว่า "suspend to disk" และเกี่ยวข้องกับการบันทึกเนื้อหาทั้งหมดของ RAM และปิดไฟ) โดยทั่วไปจะใช้กับแล็ปท็อปและอุปกรณ์มือถืออื่น ๆ เท่านั้น


6

ไม่มีคำตอบที่ชัดเจนและเป็นสากลเพราะขึ้นอยู่กับงานที่คุณกำลังจะทำ หากคุณกำลังจะเรียกใช้ DB, HTTP, เวอร์ชวลไลเซชันหรือเซิร์ฟเวอร์แคชคุณไม่ควรเปิดใช้งานการสลับใด ๆ โดยไม่คำนึงถึงจำนวน RAM ที่คุณมี หากคุณมีเดสก์ท็อปหรือโฮสต์ผสมและคุณมี RAM ที่เร็วกว่า 16 GB - ดูที่นี่: zRam


zRam เป็นตัวเลือกที่ยอดเยี่ยม ฉันใช้มันร่วมกับระบบแฟลชไดรฟ์ขนาดเล็กเพื่อผลที่ดี
เอ็ลเดอ

1
@ElderGeek ฉันยังใช้มันในสภาพแวดล้อมที่ไม่มีดิสก์เช่นการบู๊ตเครือข่าย ผลงานยอดเยี่ยม แต่มีข้อควรระวังบางอย่าง: อันดับแรกคุณไม่ต้องการหน่วยความจำเพิ่มเติมอีกต่อไปคุณต้องการได้อย่างรวดเร็ว โมดูลหน่วยความจำช้าและราคาถูกซึ่งอาจเหมาะกับคุณในกรณีแบบดั้งเดิมอาจทำให้เกิดปัญหาได้ ต้องคำนึงถึง CPU Front-Side bus ด้วย: แม้ในกรณีที่คุณมีความถี่ของ CPU ที่ช้าลง แต่ความถี่ของ FSB ที่เร็วกว่านั้นจะช่วยเพิ่มประสิทธิภาพของคุณได้อย่างมาก ข้อกังวลประการที่สองคือจำนวนพาร์ติชั่นการสลับ zRam ลองตัวเลขตั้งแต่ 1 ถึงหมายเลขแกน CPU ของคุณ อย่าใช้กับระบบแบบแกนเดียว!
Alexey Vesnin

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

@ElderGeek ฉันด้วย :) ยินดีที่ได้พบคุณ! นอกจากนี้ฉันได้สังเกตเห็นสิ่งหนึ่งที่แปลกประหลาดในพฤติกรรมของ zRam จะปรากฏและหายไปในเคอร์เนลเวอร์ชันและการกำหนดค่าต่าง ๆ แต่สามารถทำซ้ำได้สูงที่เคอร์เนล HZ 100 และ 1,000 zRam ทำงานได้ดีสำหรับ 1,2,4 - แต่ไม่ได้แบ่งพาร์ติชันเพิ่มเติม แม้แต่ในฟิสิคอล 8 และ 16 คอร์บนฮาร์ดแวร์ชั้นนำในงานที่ไม่ได้ใช้งาน ดังนั้นโปรดจำไว้ว่าการเล่นกับ tweaks! คำทักทายจากรัสเซีย!
Alexey Vesnin

ฉันไม่เห็นด้วยกับ "ถ้าคุณเรียกใช้ db, ... คุณไม่ควรเปิดใช้งานการสลับใด ๆ โดยไม่คำนึงถึง ram mount ที่คุณมี" การสลับเป็นปกติจะดีกว่านักฆ่า OOM ฆ่ากระบวนการสุ่ม ใช่คุณควรมีหน่วยความจำเพียงพอสำหรับแอปพลิเคชันที่คุณใช้และใช่การใช้ swap จำนวนมากอาจทำให้ระบบของคุณช้าลง ฉันอิจฉาคุณอยู่ในโลกในอุดมคติ
AMADANON Inc.

5

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

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

  • กรณีที่ 1: หากคุณไม่มีพื้นที่สว็อปและไม่มี RAM, เคอร์เนล Linux จะเลือกหนึ่งกระบวนการขึ้นไปซึ่งคิดว่าเป็นตัวเลือกที่ดีและฆ่ามัน

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

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


6
ฉันชอบกรณีที่ 1 เพราะครั้งเดียวที่ฉันหมด RAM คือตอนที่ฉันมีโปรแกรมที่ควบคุมไม่ได้ โดยทั่วไปแล้วนักฆ่า OOM นั้นค่อนข้างดีในการระบุตัวคนจรจัดและฉันควรจะฆ่ามันทันทีหลังจากการแลกเปลี่ยนอย่างหนักสองสามชั่วโมง
Mark

1
@ Mark นั่นเป็นจุดที่ถูกต้อง ฉันยังคงพยายามหลีกเลี่ยงการมอบหมายอัลกอริทึมในการถ่ายภาพก่อนคิดในภายหลัง
jlliagre

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

1
ตามเหตุผลของคุณการตรวจสอบการใช้ RAM ก็เพียงพอแล้ว
Totor

1
@Totor ฉันไม่ต้องการตื่นกลางดึกโดยแอพตรวจสอบแล็ปท็อปของฉันเพราะฉันเปิดตัวแบทช์ที่ประมวลผลไฟล์จำนวนมากและหมด RAM ฉันชอบงานที่ต้องทำแม้ว่าจะใช้เวลามากกว่าสองถึงสามชั่วโมงเพราะแรมน้อยกว่าการขัดจังหวะทุกสิ่ง
jlliagre

3

กฎของฉันที่จะใช้ swap ในระบบใด ๆ คือการมีคำตอบสำหรับสิ่งนี้:

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

เมื่อฉันได้รับคำตอบสำหรับข้อมูลนี้ฉันจะปรับขนาดระบบให้เหมาะสม ในปีที่ผ่านมาฉันทำกฎง่ายๆจาก Sun Microsystem มากถึง 16 GB RAM มากถึงสองเท่าสำหรับ SWAP จาก 16 GB ขึ้นไปในจำนวนเดียวกัน แต่ในทางกลับกันหากคุณมี RAM เพียงพอที่จะสำรองไว้และแอปของคุณไม่ได้ใช้ SWAP โดยการบังคับใช้คุณสามารถละเว้นการสลับได้ หากคุณต้องการเป็นเพียงเรื่องของการวางดิสก์ใหม่หรือบลูและการกำหนดค่า SWAP กฎของดวงอาทิตย์ใช้ส่วนใหญ่เพราะใน Solaris ในกรณีที่ "kernel kernel" หน่วยความจำจะถูกทิ้งทั้งหมดเพื่อแลกเปลี่ยนสำหรับการวิเคราะห์เพิ่มเติม


1

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

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

จากนั้นคุณไม่จำเป็นต้องใช้พื้นที่สว็อป

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


การใช้ swap สามารถช่วยหลีกเลี่ยงการเกิดภัยพิบัติได้ แต่จะไม่เพิ่มประสิทธิภาพของ preformance ใด ๆ นอกจากร่มชูชีพจะช่วยเพิ่มความเร็วให้กับเฟอร์รารี ;-)
Elder Geek

@ElderGeek มันอาจจะเป็นกรณีที่ขอบ แต่การสลับสามารถช่วย มีบางครั้งที่คุณมี RAM เพียงพอสำหรับทุกสิ่ง แต่มีโปรแกรมที่ไม่ได้ใช้งานอาจถูกสลับเพื่อใช้ RAM ได้ดีขึ้น (เช่นแคชดิสก์ที่มีประโยชน์) ฉันเคยเห็นสิ่งนี้มากมายในช่วงปลายยุค 90 ฉันเห็นสิ่งนี้บางครั้งตอนนี้เมื่อฉันมี RAM ว่าง <1GB (รวมถึงแคชดิสก์) โดยไม่จำเป็นต้องมีพื้นที่สว็อป
jbo5112

@ jbo5112 ฉันจะไม่แยกแยะความเป็นไปได้ทั้งหมดถ้าคุณพูดเช่นนั้นประสบการณ์ของฉันได้แสดงให้เห็นเป็นอย่างอื่นป่านนี้ นี่ไม่น่าแปลกใจนักเนื่องจากเป็นกรณีของวิธีการใช้ระบบมากกว่ากฎที่แข็งและรวดเร็ว (ซึ่งทุกคนดูเหมือนจะแสวงหา)
เอ็ลเดอ

@ElderGeek ฉันอาจเห็นตอนนี้เพราะดิสก์ของฉันมีอายุสิบปีแล้วและต้องการแคชอย่างมาก โดยปกติจะมีปัญหาเพิ่มเติมเกี่ยวกับความว่องไวที่กำหนดไว้สูงเกินไปสำหรับเกือบทุกกรณีซึ่งทำให้พื้นที่สว็อปถูกใช้อย่างก้าวร้าวเกินไป การลดค่าจาก 60 เป็น 10 ดูเหมือนคำแนะนำทั่วไป คุณสามารถลดต่ำลงได้ แต่ในบางจุดคุณจะถ่ายโอนแคชดิสก์มากเกินไปทำให้เกิด I ​​/ O พิเศษมากขึ้นในขณะทำการสลับ
jbo5112

@ jbo5112 จุดที่ดี มันเป็นการปรับสมดุลระหว่างระบบย่อยที่แตกต่างกันเสมอ ฉันจำได้ว่าในวันนั้นการปรับธีมเช่นฮาร์ดดิสก์ interleave และอัตราการรีเฟรช RAM เพื่อบีบประสิทธิภาพสูงสุดออกจากระบบ 80286 ด้วยไดรฟ์ Seagate ST225 และ ST238 เรามักจะต้องเข้าใกล้สิ่งต่าง ๆ เป็นกรณี ๆ ไปเพื่อบีบประสิทธิภาพและความน่าเชื่อถือสูงสุด ขอแสดงความยินดีด้วย BTW! ครั้งสุดท้ายที่ฉันสามารถบีบไดรฟ์ออกมาเป็นสิบปีมันคือ Micropolis ที่มีขนาดทั้งหมด 600MB
ผู้สูงอายุ Geek

0

คำตอบสั้น ๆ :

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

ตั้งค่าไฟล์ swap ของคุณเป็น:

  • RAM+round(sqrt(RAM)) ถ้าคุณใช้การไฮเบอร์เนต
  • round(sqrt(RAM)) ถ้าคุณทำไม่ได้

ตั้งค่าของคุณswappinessเป็น 10 บนเดสก์ท็อปแต่ไม่ใช่บนเซิร์ฟเวอร์!

คำตอบที่ยาว:

ในอดีตที่ผ่านมา:

กฎของหัวแม่มือที่ใช้ในช่วง 25 ปีที่ผ่านมามีอย่างน้อย 1xRAM และ 2xRAM สูงสุดนั่นคือสิ่งที่คุณจะเห็นตลอดเวลา

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

จำนวนสูงสุดถูกตั้งค่าไว้ในขณะนั้นเนื่องจากผลตอบแทนลดลง: มันช้าเกินไปที่จะต้องเปลี่ยนหน่วยความจำมากเนื่องจากการเข้าถึง HDD เป็นปัจจัยที่ช้ากว่า 1,000 หน่วยจาก RAM: ดีในกรณีฉุกเฉิน แต่ไม่ค่อยดีสำหรับการใช้ในชีวิตประจำวัน! ในเวลานั้นเมื่อคุณมีพื้นที่สว็อปหมดมันถึงเวลาที่ต้องเพิ่มแรมอีก! (ซึ่งยังคงเป็นจริงในวันนี้)

ในปัจจุบัน:

  1. หากคุณไม่ได้ใช้ไฮเบอร์เนตและหน่วยความจำของคุณอยู่ในส่วนที่เกินจาก 1GByte กฎใหม่ของหัวแม่มือเป็นround(sqrt(RAM))ที่RAMเห็นได้ชัดขนาด RAM ของคุณใน GB

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

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

ทั้งหมดเหล่านี้เข้าด้วยกันให้ตารางต่อไปนี้: (3 คอลัมน์สุดท้ายแสดงถึงพื้นที่สว็อป)

    RAM   No hibernation    With Hibernation    Maximum
    1GB              1GB                 2GB        2GB
    2GB              1GB                 3GB        4GB
    3GB              2GB                 5GB        6GB
    4GB              2GB                 6GB        8GB
    5GB              2GB                 7GB       10GB
    6GB              2GB                 8GB       12GB
    8GB              3GB                11GB       16GB
   12GB              3GB                15GB       24GB
   16GB              4GB                20GB       32GB
   24GB              5GB                29GB       48GB
   32GB              6GB                38GB       64GB
   64GB              8GB                72GB      128GB
  128GB             11GB               139GB      256GB
  256GB             16GB               272GB      512GB
  512GB             23GB               535GB        1TB
    1TB             32GB              1056GB        2TB

ด้านบนเป็นเพียงกฎของหัวแม่มือ มันไม่ใช่กฎของแรงโน้มถ่วง!
คุณสามารถฝ่าฝืนกฎนี้ (ต่างจากกฎแรงโน้มถ่วง) หากกรณีการใช้งานเฉพาะของคุณแตกต่างกัน!

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

วิธีทดสอบว่าการใช้งาน swap ของคุณแตกต่างจากกฎ "ทั่วไป" หรือไม่:

เพิ่งดำเนินการ:

for szFile in /proc/*/status ; do 
  awk '/VmSwap|Name/{printf $2 "\t" $3}END{ print "" }' $szFile 
done | sort --key 2 --numeric --reverse | more

ซึ่งจะให้รายการโปรแกรมที่รันอยู่ทั้งหมดซึ่งถูกสลับออก (โดยโปรแกรมที่ใช้พื้นที่สว็อปมากที่สุดอยู่ด้านบน)

หากคุณใช้งานมากกว่าสองสาม KB: ปรับขนาดให้มากขึ้นอย่างน้อยก็มิฉะนั้นอย่ากังวล ...

หากคุณอยู่บนเซิร์ฟเวอร์หยุดอ่านตอนนี้: คุณพร้อมแล้ว!


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

sudo nano /etc/sysctl.conf

และเพิ่ม:

# change "swappiness" from default 60 to 10 
# (theoretically only swap when RAM usage reaches around 80 or 90 percent)
vm.swappiness = 10

ที่ส่วนท้ายของไฟล์ให้บันทึกไฟล์ ( Ctrl+ XY+ Enterในนาโน) และดำเนินการ a:

sysctl --system

เพื่อโหลดพารามิเตอร์หรือเพียงเพื่อประโยชน์เก่าใช้แนวทาง Window $ และรีบูต ... :-)


-1

คำตอบประนีประนอม: มันขึ้นอยู่กับความหมายของ "ควร"

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

มันเป็นความฉลาดที่จะมีพาร์ทิชัน swap เพียงในกรณีที่คุณตั้งใจวางไข่กองทัพของหมูหน่วยความจำเพื่อให้คุณมีโอกาสที่จะฆ่าพวกเขาก่อนที่จะเตะฆาตกร OOM ใน? ใช่.

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

โดยสรุปแล้วมันยอดเยี่ยมมากที่คุณมี RAM 16GB แต่ถ้าคุณมีดิสก์ขนาด 1TB คุณจะไม่สามารถสำรองพื้นที่ 16GB ให้สลับได้หรือไม่ มีเพียง 1.5% ของดิสก์

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