สลับเป็นสมัยหรือไม่


43

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

ข้อโต้แย้งของฉันคร่าวๆสิ่งนี้ (สมมติว่าไม่มี ulimit หรือ twiddling ของการตั้งค่า OOM):

There is little value in swap because if you need to swap out to disk, 
odds are it's going to be a vicious cycle where an app will continue 
to eat not only real memory, but swap as well until it gets OOM 
reaped (_if_ it gets OOM reaped). 

If you have swap enabled, it will only prolong this death march to 
the detriment of other processes - and in the worst case where the
process is not OOM reaped in a timely manner, grind the system to
a halt.

Without swap, it will probably get OOM reaped sooner (if at all)

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

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

ฉันไม่ต้องการแลกเปลี่ยนในระบบสมองกลฝังตัว (แม้ว่ามันจะมี ram ที่เล็กกว่าก็ตาม) ถ้าคุณไม่มี ram ฉันอยากให้กระบวนการของฉันตายมากกว่าฉีกหน่วยความจำแฟลชแบบเขียนล้านต่อเซกเตอร์ ขับรถในช่วงสุดสัปดาห์โดยปรับระดับเซกเตอร์ลงสู่ nub

มีเครามีเหตุผลใด ๆ ที่น่าสนใจเพื่อให้สลับรอบ?

อัปเดตคำตอบ && การวิเคราะห์:

  • ยืนยัน? - fork () ต้องการจำนวนหน่วยความจำเท่ากันสำหรับกระบวนการ child เหมือนกับ parent

    Modern fork () เป็นcopy-on-writeสำหรับเด็ก ๆ บน POSIX (โดยทั่วไป) แต่เฉพาะLinuxและFreeBSDและฉันสมมติว่า OSX โดยการอนุมาน ฉันคิดว่าเป็นส่วนหนึ่งของกระเป๋าเดินทางสมัยนี้ที่แลกเปลี่ยนดำเนินการกับมัน

    อยากรู้อยากเห็นบทความ Solaris นี้อ้างว่าแม้ว่า Solaris จะใช้ Copy-on-Write with fork () ซึ่งคุณควรมีอย่างน้อย2x (!)ขนาดกระบวนการหลักในหน่วยความจำเสมือนฟรีสำหรับ fork () เพื่อไม่ให้อึใน กลาง. ในขณะที่องค์ประกอบของโซลาริสค่อนข้างเป็นข้อโต้แย้งว่าการแลกเปลี่ยนนั้นเป็นเรื่องสมัย - ฉันคิดว่าระบบปฏิบัติการเพียงพอที่จะใช้ CoW อย่างถูกต้องในลักษณะที่สำคัญต่อการปัดเป่าตำนานมากกว่าเพื่อทำเครื่องหมายเหตุผลเพิ่มเติมสำหรับการแลกเปลี่ยน ตั้งแต่. ช่วยให้หน้ามัน ณ จุดนี้คนที่ใช้โซลาริสน่าจะเป็นแค่พวกออราเคิล โซลาริสไม่มีความผิด!

  • ยืนยัน - ไฟล์ tmpfs / ramfs สามารถเปลี่ยนเป็นการแลกเปลี่ยนได้อย่างมั่นใจเมื่อ tmpfs / ramfs เติมเต็ม

    อย่าใช้ tmpfs / ramfs ไม่ จำกัด ! กำหนดปริมาณของ ram ที่คุณต้องการให้ tmpfs / ramfs ใช้เสมอ

  • น่าเชื่อถือ - มีการแลกเปลี่ยนเล็กน้อย 'ในกรณี'

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

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

  • จับ! - บนSolaris การสลับเป็นสิ่งสำคัญด้วยเหตุผลสองประการ

    tmpfs - state จำนวนพื้นที่ว่างที่มีให้ tmpfs ขึ้นอยู่กับจำนวนของพื้นที่สว็อปที่ไม่ได้ถูกจัดสรรในระบบ ขนาดของระบบไฟล์ tmpfs เติบโตขึ้นเพื่อรองรับไฟล์ที่เขียนลงไป แต่มีการแลกเปลี่ยนบางอย่างสำหรับผู้ใช้งานหนักของ tmpfs Tmpfs ใช้ทรัพยากรร่วมกันกับข้อมูลและเซ็กเมนต์สแต็กของการดำเนินการโปรแกรม การเรียกใช้งานโปรแกรมที่มีขนาดใหญ่มากอาจได้รับผลกระทบหากระบบไฟล์ tmpfs ใกล้เคียงกับขนาดสูงสุดที่อนุญาต Tmpfs มีอิสระในการจัดสรรทั้งหมดยกเว้น 4MB ของพื้นที่สว็อปของระบบ

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

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

  • จับ! เครื่องมือจำศีล Linux ยอดนิยมดูเหมือนจะพึ่งพาการแลกเปลี่ยน

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


ฉันไม่มีเครา * * * * * * * * * * * * * * * (ผมบางยังคง) แต่ 2 เซ็นต์ของฉันจะเป็นว่าการมีบิตของการแลกเปลี่ยนจะทำให้ระบบของคุณมีความแข็งแกร่ง แทนที่จะเป็น OOM โดยตรงคุณจะไปสลับแทนหากระบบของคุณเกินขีด จำกัด เล็กน้อย แน่นอนถ้าระบบของคุณเกินขีด จำกัด จริงๆแล้วระบบของคุณจะหยุดทำงาน / หยุด / nuke-เอง / อะไรก็ตามที่คุณสามารถจินตนาการได้ ดังนั้นให้ลองเล่นด้วย;)
Ouki

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

@Jushua: หน่วยความจำ overcommitment อาจไม่ใช่ค่าเริ่มต้นหรือเป็นไปได้ขึ้นอยู่กับระบบปฏิบัติการ
jlliagre

ฉันมีเซิร์ฟเวอร์ NAS ที่มี RAM 8GB มันจะทำงานได้ถึง 2 VMs ฉันไม่ได้ใส่ swap ถ้ามันเริ่มต้นการ swaping อย่างหนักแสดงว่ามันตายไปแล้ว ดังนั้นจึงสนับสนุนอาร์กิวเมนต์ของคุณอย่างสมบูรณ์แบบ ในทางกลับกันฉันยังคงใช้เดสก์ท็อปที่มีสนิมซึ่ง จำกัด RAM ไว้ที่ 1GB และมีการสลับเพื่อจัดการกับหน่วยความจำแบบเบาบาง มันทำให้ช้าลงเล็กน้อย แต่ช่วยให้ฉันเปิด Firefox และแอปพลิเคชั่นอื่น ๆ ในเวลาเดียวกัน
Huygens

ฉันพบว่านักฆ่า OOM ทริกเกอร์สายเกินไปหลังจากแคชทั้งหมดหมดและระบบเริ่มซบเซา เพื่อให้ระบบของฉันเร็วฉันใช้Earlyoomหรือnohangเพื่อทำงานเดียวกัน แต่ก่อนหน้านี้! สามารถใช้ได้ทั้งแบบมีหรือไม่มีการสลับ
joeytwiddle

คำตอบ:


28

อย่าสับสน (the) swap (เป็นพื้นที่ดิสก์) และ (เพื่อ) swap (เป็นวิธีการย้ายหน้าหน่วยความจำจาก RAM ไปยังดิสก์และกันและกัน)

การแลกเปลี่ยนที่มากเกินไปเป็นสิ่งที่ต้องหลีกเลี่ยงด้วยเหตุผลด้านประสิทธิภาพ แต่การมีพื้นที่สว็อปไม่จำเป็นต้องเป็นปัญหา

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

บนระบบเช่น Solaris ที่ไม่ได้เกินหน่วยความจำนั่นคือตรวจสอบให้แน่ใจว่ามีการสำรองหน่วยความจำสำรองโดยหน่วยความจำเสมือนเสมอไม่ว่าจะเป็น RAM หรือบนดิสก์การมีพื้นที่ swap ที่เพียงพอนั้นเป็นสิ่งจำเป็นอย่างยิ่ง ที่สูญเสียไป


1
คุณแน่ใจหรือว่าประเด็นเกี่ยวกับโซลาริสยังคงเป็นจริง blogs.oracle.com/jimlaurent/entry/solaris_faq_myths_and_factsสถานะ: หน่วยความจำเสมือนวันนี้ประกอบด้วยผลรวมของแรมทางกายภาพและพื้นที่สลับบนดิสก์ โซลาริสไม่ต้องการพื้นที่สวอปใด ๆ เลย หากคุณเลือกตัวเลือกนี้เมื่อ RAM เต็มคุณจะไม่สามารถเริ่มกระบวนการใหม่ได้ ฉันคิดว่าฉันเห็นสิ่งที่จุดของคุณ - ถ้าคุณต้องการ mmap บางอย่างที่ใหญ่กว่าหน่วยความจำทางกายภาพโดยไม่ต้องสลับคุณไม่ได้? (ไม่ว่า mmap จะเป็น initializer ขี้เกียจ)
synthesizerpatel

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

1
อัปเดตสำหรับ Linux: สามารถปิดการทำ overcommiting ได้ OOM สามารถแก้ไขอัลกอริทึมได้คุณสามารถมี OOM handler กับ cgroups ได้
เตอร์

1
@ peterph การปิด overcommitting บน Linux ทำให้การสลับผิดพลาดน้อยลง หากคุณไม่หักโหมคุณต้องทำให้แน่ใจว่าคุณมีพื้นที่สว็อปที่ใหญ่พอที่จะสำรองข้อมูลทั้งหมดได้
jlliagre

1
หน่วยความจำเสมือนที่สำรองไว้โดยทางแยกขึ้นอยู่กับขนาดของโปรแกรมที่ทำ สมมติว่าคุณมี java VM ที่ใช้การฟอร์แมทหน่วยความจำ 2 GB จะต้องใช้เพิ่มอีก 2 GB ชั่วคราว หากสิ่งนี้เกิดขึ้นในขณะที่คุณมีพื้นที่ว่างน้อยกว่า 2 GB หรือพร้อมกันหลาย ๆ ครั้งส้อมอย่างน้อยหนึ่งตัวจะล้มเหลว นี่เป็นสถานการณ์ทั่วไปที่มี OS ที่ไม่ยอมรับมากเกินไปและใช้ Linux ด้วยเช่นกันเมื่อปิดใช้งานการ overcommitting สามารถแก้ไขได้อย่างง่ายดายโดยการให้พื้นที่สว็อปมีขนาดใหญ่พอซึ่ง IMHO นั้นเป็นทางออกที่ดีกว่าการใช้หน่วยความจำมากเกินไป
jlliagre

3

ฉันรู้ว่ามีเหตุผลหนึ่งข้อที่จะสลับไปมา ฉันมีแอพที่ใช้หน่วยความจำมากที่สุดเท่าที่จะทำได้เพื่อกำหนดค่าสำหรับระบบของฉัน มันใช้ Hadoop ซึ่งส่วนหนึ่งของการประมวลผลทำ fork และ exec เพื่อรันคำสั่ง unix เดียว (ฉันคิดว่า "uname" หรือ "user" หรือสิ่งที่พวกเขาไม่สามารถหา Java เทียบเท่าได้) ดูเหมือนว่า java ไม่ได้ทำ vfork ที่มีการคัดลอกบนซีแมนทิกส์การเขียนเหมือนแอปพลิเคชันดั้งเดิม ถ้าฉันเริ่มต้นแอพของฉันโดยใช้ RAM 4Gb เมื่อมันใช้งานส้อมจะใช้ RAM อีก 4Gb แต่ก็ปล่อยออกมาอย่างรวดเร็ว หากฉันไม่มีการแลกเปลี่ยน 4Gb สำหรับ Hadoop นั้นเพื่อแลกเปลี่ยนฉันจะต้องจ่าย RAM 8Gb เพียงเพื่อให้ 4Gb สำหรับแอปของฉัน


นี่เป็นจุดที่ดี แต่ไม่ใช่ภาพสะท้อนของ fork ที่ทันสมัย ​​() - บน Linux และ FreeBSD (และ OSX อย่างชัดเจน) ส้อม () นั้นถูกนำมาใช้ผ่านการใช้หน้า copy-on-write Copy-on-write (หรือ COW) เป็นเทคนิคการหน่วงเวลาหรือป้องกันการคัดลอกข้อมูลทั้งหมด แทนที่จะทำซ้ำพื้นที่แอดเดรสของกระบวนการพาเรนต์และชายด์สามารถแบ่งใช้สำเนาเดียวได้ อย่างไรก็ตามข้อมูลถูกทำเครื่องหมายในลักษณะที่ว่าถ้ามันถูกเขียนไปจะทำซ้ำและแต่ละกระบวนการได้รับสำเนาที่ไม่ซ้ำกัน การอ้างอิง: forums.freebsd.org/showthread.php?t=26355และลินุกซ์ manpage สำหรับ fork ()
synthesizerpatel

ในขณะที่เป็นจริงมีบางหน้าที่ไม่สามารถทำเครื่องหมาย COW ตัวอย่างเช่นหน้าเว็บที่ใช้สำหรับเคอร์เนลสแต็คของกระบวนการลูกใหม่และหน้าเว็บที่ใช้สำหรับโครงสร้างข้อมูลภายใน ( files_structthe struct signals, the task_struct, and and other) นอกจากนี้เพจที่เรียกใช้งานได้จำนวนมากไม่ใช่โค้ดที่ขึ้นกับตำแหน่ง (PIC) ดังนั้นหน้าของโค้ดที่สามารถเรียกทำงานได้ที่แก้ไขโดยตัวโหลดเดอร์แบบไดนามิก ( ld-linux.so) จะต้องมีพื้นที่สว็อปสำรองไว้สำหรับพวกเขาแม้ว่าจะไม่มีอะไรเขียน นั่นเป็นเหตุผลที่ฉันรัก Linux คุณสามารถปิดการแลกเปลี่ยนและระบบยังคงทำงานอยู่ :)
Azhrei

3

ฉันไม่สามารถเพิ่มการสนทนาทางเทคนิค แต่ฉันสามารถยกตัวอย่าง สมุดบันทึกเก่าของฉัน (2GB RAM kunbuntu lucid) โดยทั่วไปจะทำงานที่ swap ที่ 0 เมื่อฉันเรียกใช้การส่งข้อมูล (ไคลเอ็นต์ bittorrent) ที่มี torrents จำนวนมากซึ่งสามารถใช้การเชื่อมต่อร่วมกันได้ 100 การแลกเปลี่ยนของฉันสามารถเพิ่มขึ้นได้ มันยิ่งแย่ลงไปอีกเมื่อฉันใช้ XP vm ที่ใช้หน่วยความจำจริง 1GB

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

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


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

3

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

ลองดูที่http://techreport.com/articles.x/16255 ที่เยี่ยมยอดที่สุด มันเป็นอินเตอร์เฟสจาก S-ATA ถึง DDR2-RAM คุณสามารถใส่ RAM ได้มากถึง 64GB โดยการวางพื้นที่สวอปบนหนึ่งในนั้นคุณจะได้รับ RAM เพิ่มเติมที่สำคัญ แน่นอนมันไม่เร็วเท่ากับแรมระบบปกติ แต่มันจะเปลี่ยนแรมของระบบให้เป็นเลเยอร์แคชเพิ่มเติม


1
หากพิจารณาราคา ($ 549) จะไม่มีประสิทธิภาพมากขึ้นในการลงทุน $ 100 ในเมนบอร์ดที่สนับสนุน RAM ขนาด 64GBใช่ไหม
Dmitry Grigoryev

1
@DmitryGrigoryev: แน่นอน แต่บางครั้งคุณกำลังถูกบังคับให้ใช้ชนิดโดยเฉพาะอย่างยิ่งของฮาร์ดแวร์ (เพราะสำหรับเหตุผลที่ไอได้รับการรับรองระบบการแพทย์ไอ ) แต่ยังมีการจัดการกับชุดข้อมูลขนาดใหญ่ขันผลิตในเวลาน้อยมาก (คิดว่าสแกนเนอร์เอกซ์เรย์, datarates> 3GiB / s)
datenwolf

คุณไม่ต้องรับรอง RAM drive ในฐานะอุปกรณ์ทางการแพทย์หรือไม่ ;) แต่ใช่ฉันได้รับจุด
Dmitry Grigoryev

1
@DmitryGrigoryev: แน่นอนคุณต้องทำ อย่างไรก็ตามการรับรองอุปกรณ์ดิสก์ RAM S-ATA นั้นง่ายกว่าการรับรองเมนบอร์ดทั้งหมด เมื่อจัดหาคอมพิวเตอร์ที่ใช้ในอุปกรณ์การแพทย์คุณมักจะซื้อส่วนประกอบมากที่สุดเท่าที่จะเป็นไปได้ สำหรับชิ้นส่วนเหล่านั้นที่ไม่มีสิ่งใดที่มีใบรับรองพร้อมให้คุณทำการทดสอบและรับรองด้วยตัวเอง โดยเฉพาะอย่างยิ่งเมื่อทำงานในการวิจัยที่เน้นความปลอดภัยของผู้ป่วยและไม่ได้ใช้ข้อมูลในการวางแผนการรักษานี่เป็นวิธีแก้ปัญหาที่คุ้มค่าและรวดเร็วที่สุด BT; DT
datenwolf

3

ฉันใช้ Linux และ Windowsโดยไม่ต้องสลับ (ไฟล์เก็บเพจในระบบการตั้งชื่อ Windows) บนโน้ตบุ๊ก / เดสก์ท็อปที่มี 4Gb หรือมากกว่า มีอยู่สองสามครั้งที่ความจำของฉันเกิดขึ้นฉันแค่จัดการกับมัน ฉันรู้สึกว่าระบบนี้เป็นปลากะพงขาวที่ฉันสนใจมากขึ้น ไม่มีข้อกำหนดพิเศษสำหรับภาระงานของฉัน

สิ่งที่ฉันได้เรียนรู้:

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

2

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

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

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

นี่เป็นเรื่องจริงโดยเฉพาะอย่างยิ่งถ้าAมีสถานะที่ไม่ได้บันทึกซึ่งจะไม่ถูกกู้คืนเมื่อเริ่มต้นใหม่

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

อย่างไรก็ตามฉันเห็นด้วยว่าทางออกที่ดีกว่าในการเพิ่มประสิทธิภาพคือการติดตั้งแรมเพิ่มเติม


อัปเดต: หลังจากเขียนคำตอบนี้ฉันเป็นเจ้าของแล็ปท็อปที่มี RAM จำนวนมากและฮาร์ดไดรฟ์ช้า ในกรณีนั้นคำแนะนำของฉันกลับรายการ! นี่คือบทสรุปของข้อดีและข้อเสีย
joeytwiddle

1

ในระบบของฉัน / tmp มีการรั่วไหลเพื่อแลกเปลี่ยนหากกลืนกิน RAM มากเกินไป

สิ่งนี้เร็วกว่าการใช้ระบบไฟล์จริงสำหรับ / tmp


มันค่อนข้างอันตราย - ถ้าฉันต้องการ ramfs ฉันต้องระบุใน fstab (หรือตัวเลือก) เพื่อกำหนดขนาดอย่างชัดเจน เป็นไปได้ว่าโปรแกรมสามารถบ้า ape-crap ด้วยการจัดสรรหน่วยความจำเนื่องจากมันจะเริ่มสร้างไฟล์ใน / tmp Swap จะเป็นสถานที่ที่ไม่ดีสำหรับไฟล์ ramfs ที่จะแสดงขึ้นมา (โดยเฉพาะอย่างยิ่งถ้าคุณพึ่งพา ramfs สำหรับความเร็ว)
synthesizerpatel

2
ฉันมีขนาด RAM เกินขนาดบ่อยครั้ง tmpfs ที่สนับสนุนโดย swap นั้นเร็วกว่า ext2 อย่างมากแม้ว่าจะมีการหก
Joshua

มีประโยชน์ที่จะรู้ - และอาจเป็นรายการวิจัยในอนาคตที่ควรพิจารณา - ฉันยังคงกังวลเกี่ยวกับแอปพลิเคชันที่เติมหน่วยความจำของฉันโดยใช้พร็อกซีของ tmpfs / ramfs ใน / tmp นั่นทำให้ฉันเป็น heebie jeebies!
synthesizerpatel

จากนั้นตั้งค่าการ จำกัด swap = ขนาดของการแลกเปลี่ยน
Joshua

บังเอิญนี่คือความแตกต่างระหว่าง ramfs และ tmpfs tmpfs สามารถหกเพื่อสลับในขณะที่ ramfs ไม่สามารถ
Joshua

1

มีเหตุผลมากมายเมื่อใช้การสลับ

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

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

อีกตัวอย่างหนึ่งของการใช้ swap คือหยุดการทำงานของดิสก์

สำหรับอุปกรณ์ฝังตัวนั้นสามารถแบ่งได้เป็นสองกลุ่มใหญ่ ๆ (อย่างน้อย):

  1. พวกเขารัน Linux / Windows หรือ non-RTOS ที่คล้ายกัน (Real Time OS) หรือ
  2. พวกเขาเรียกใช้ RTOS

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

กลุ่มแรกของอุปกรณ์ฝังตัว (ใช้งานระบบปฏิบัติการบางระบบ) สามารถใช้ (และโดยปกติแล้วพวกเขาจะใช้) การแลกเปลี่ยน และโดยทั่วไปอุปกรณ์ดังกล่าวใช้ swap ในลักษณะเดียวกับเดสก์ท็อปและเซิร์ฟเวอร์

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

  • การอ่านจากการสลับสามารถใช้เวลาไม่แน่นอน
  • อุปกรณ์มีจำนวนงานที่กำหนดไว้ล่วงหน้า (ณ เวลารวบรวม) ซึ่งไม่จำเป็นต้องสลับ

BTW มีคำอธิบายมากมายเกี่ยวกับวิธีที่ linux ใช้ swap ซึ่งหนึ่งในนั้นคือ http://distilledb.com/blog/archives/date/2009/02/22/swap-files-in-linux.page การ
ใช้ Windows วิธีการที่คล้ายกัน


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

1

มันดูเหมือนว่าฉันว่าทั้งจำศีลและพื้นที่จำเป็นต้องแลกเปลี่ยนการนอนหลับไฮบริดในลินุกซ์

ฉันไม่เคยใช้ swap space / partition บน Linux จนกว่าจะเผชิญหน้ากับความต้องการใช้ Hybrid Sleep - เนื่องจาก sleep บนระดับแบตเตอรีวิกฤตไม่พร้อมใช้งานในระบบของฉันเนื่องจาก Upower จัดการโดยเฉพาะระหว่าง Shut-Down, Hibernate และ Hybrid -นอน. (เพิ่มเติมที่นี่ )


0

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

คำอธิบายอื่น ๆ ที่ฉันเคยเห็นเกี่ยวกับการแลกเปลี่ยนทำงานค่อนข้างตามเส้น: "คุณจะได้รับคำสั่งให้กำหนดค่า SWAP = 2 * RAM เสมอนี่เป็นเรื่องไร้สาระที่สมบูรณ์ไม่มีความสัมพันธ์ระหว่าง RAM และการสลับ Swap คือรองรับ spikes ในการใช้หน่วยความจำ คุณควรเพิ่มหน่วยความจำให้เพียงพอเพื่อให้เวลาในการโหลดของคุณพอดีกับ RAM หากโหลดของคุณมีความเสถียรคุณไม่จำเป็นต้องสลับหากโหลดของคุณมีความผันแปรสูงคุณต้องสลับอย่างเพียงพอสำหรับเดือยและจัดให้ การแลกเปลี่ยนถูกใช้น้อยมากดังนั้นจึงไม่ส่งผลกระทบต่อประสิทธิภาพโดยรวมอย่างชัดเจนสรุปเนื่องจากคุณไม่ทราบว่าโหลดไฟของคุณเป็นเท่าใดและดิสก์มีราคาถูกกว่า RAM มากให้กำหนดค่า SWAP = 2 * RAM "

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

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