จะปิดการใช้ swap อย่างสมบูรณ์ได้อย่างไร


30

ฉันใช้ Debian sid, ฮาร์ดไดรฟ์ที่ฟอร์แมตด้วย ext4, ทำงานบน linux 3.1

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

แต่ในการตั้งค่าปัจจุบันของฉันคอมพิวเตอร์แฮงค์ด้วยปริมาณข้อมูล I / O ที่รุนแรงในพื้นหลัง iotop เผย kswapd0 เป็นผู้ร้ายซึ่งหมายความว่าเกิดจากการแลกเปลี่ยน หลังจากใช้swapon -sเพื่อกำหนด swaps ใด ๆ ที่เปิดใช้งานฉันใช้swapoff -aเพื่อปิดใช้งาน swaps ทั้งหมดและswapon -sอีกครั้งเพื่อยืนยันว่า swaps ทั้งหมดถูกปิดใช้งาน

จากนั้นฉันพยายามเพิ่มการใช้หน่วยความจำให้สูงสุดอีกครั้ง อนิจจาพฤติกรรมที่ฉันคาดไว้ไม่ได้เกิดขึ้น kswapd0 จะพยายามแลกเปลี่ยน RAM ซ้ำและล้มเหลวเนื่องจากไม่มีพื้นที่สว็อป เพราะมันไม่เคยยอมแพ้คอมพิวเตอร์ของฉันถูกล็อคด้วยการแช่แข็ง I / O ชั่วนิรันดร์ซึ่งไม่ดีต่อสุขภาพของดิสก์

ฉันกำลังทำอะไรผิดไปswapoff -aหรือเปล่า? เหตุใดพฤติกรรมต่างจากที่เคยเป็น (อาจเป็น pre-3.0 เท่า)


มันไม่สมเหตุสมผลเลย การทำswapoff -a เองหากมีสิ่งต่าง ๆ ในการแลกเปลี่ยนจะสร้าง I / O จำนวนมาก (และอาจส่งผลให้กระบวนการถูกฆ่าได้หากมี RAM ไม่เพียงพอจริง) คุณแน่ใจหรือว่าไม่ใช่สิ่งswapoff -aที่ก่อให้เกิด I ​​/ O "storm"
Mat

1
ฉันคิดว่ามันเพียงพอที่จะแสดงความคิดเห็นfstabบรรทัดเกี่ยวกับการแลกเปลี่ยน ลองถ้าพฤติกรรมเหมือนกัน
enzotib

@Mat swapoff -aควรปิดใช้งานการสลับอย่างถาวรหมายความว่าควรปิดการใช้งานหลังจากรีบูตครั้งถัดไป ฉันยืนยันสิ่งนี้ กระนั้น I / O "พายุ" ยังคงเกิดขึ้นในระหว่างการใช้งานหลังจากรีบูตครั้งถัดไป สำหรับบันทึก I / O "storm" ไม่ได้เกิดขึ้นในขณะที่ฉันทำswapoff -aเพราะ swap เป็น 0 ในเวลานั้น
syockit

9
@syockit: swapoff -aคือไม่ถาวร
Mat

1
โหลดฐานข้อมูลได้ประมาณ 15% ใน 14 ชั่วโมง ปิดการแลกเปลี่ยนและในครั้งต่อไปจะได้รับ 40% ใน 4 ชั่วโมง เป็นที่ยอมรับเซิร์ฟเวอร์อยู่ภายใต้การใช้พลังงานและวางอยู่บน ram แต่ไม่มี swap เปิดใช้งาน OpenSuSE ทำงานได้เร็วขึ้นมากสำหรับกระบวนการนี้ ความคิดเห็นของระบบปฏิบัติการของ "ดีกว่า" และของฉันแตกต่างกันอย่างมากระหว่างการโหลด mysql db แบบง่าย ๆ ใส่ความคิดเห็นออกไดรฟ์ swap ใน / etc / fstab และรีบูต
TheSatinKnight

คำตอบ:


15

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

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

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

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


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

1
หน่วยความจำสั้นเพียงน้อยนิดจะถูกจัดสรรเสมอ ลีนุกซ์ได้รับการปรับวิธีนี้เป็นพิเศษ ทำ a cat /proc/meminfoบนกล่อง Linux ทั่วไปหลังจากโหลดสองสามชั่วโมง
David Schwartz

2
@syockit หากคุณปิดใช้งานการเพจคุณจะไม่สามารถเรียกใช้โปรแกรมใด ๆ ได้ การเพจคือกลไกที่ไฟล์ถูกอ่านเมื่อแมปเข้ากับหน่วยความจำ
David Schwartz

2
@psusi: หน้าสะอาดจะไม่ถูกลดลงเหลือน้อยที่สุดเมื่อคุณสลับ มันจะแลกเปลี่ยนหน้าสกปรกที่ไม่ระบุชื่อซึ่งไม่ได้ใช้งานมาก่อน แน่นอนทั้งสองวิธีนี้คุณจะได้รับความรุนแรงอย่างรุนแรงในที่สุดหากชุดการทำงานนั้นเกินกว่าหน่วยความจำกายภาพ ประเด็นคือไม่ว่าคุณจะมีการสลับหรือไม่ก็ตามคุณจะได้รับความรุนแรงอย่างรุนแรงก่อนที่หน่วยความจำจะหมด ความแตกต่างคือด้วยการแลกเปลี่ยนการฟาดฟันอย่างดุเดือดจะเป็นการแลกเปลี่ยน (หน้าสกปรกเขียนและอ่าน) หากไม่มีการสลับการโจมตีอย่างรุนแรงจะเป็นความผิดพลาดของโค้ด (หน้าสะอาดอ่านอย่างเดียว)
David Schwartz

2
@psusi: คุณถูกต้องหากข้อกังวลเป็นกระบวนการที่ไม่สามารถควบคุมได้ซึ่งจะทำให้สิ้นเปลืองหน่วยความจำอย่างรวดเร็ว แต่นั่นไม่ใช่สิ่งที่ OP กำลังพูดถึงซึ่งเป็นกระบวนการที่ใช้หน่วยความจำมากเกินไป ในขณะที่มันเติบโตผ่านจุดหวานขนาดใหญ่ (ที่แคชถูกบีบ) มันจะเติบโตช้าลงเรื่อย ๆ เมื่อระบบฟาด
David Schwartz

13

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

(ulimit -d 400000; firefox) &

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


มันจะใช้กับโครเมียมได้ไหมว่าเรามีchromiumกระบวนการจำนวนมากโดยใช้หน่วยความจำขนาดเล็กหรือไม่?
jberryman

@jberryman ไม่การ จำกัด หน่วยความจำเป็นแบบต่อกระบวนการมากกว่าต่อผู้ใช้หนึ่งราย
Kyle Jones

มีวิธีการส่งสัญญาณที่ระบุ (เช่น SIGHUP) เมื่อถึงขีด จำกัด หน่วยความจำหรือไม่?
Geremia

1
@ Geremia ไม่ระบบ brk และ sbrk สายหยุดทำงานซึ่งจะทำให้สิ่งต่าง ๆ ส่วนใหญ่ขดตัวและตาย
Kyle Jones

หากคุณต้องการปรับจูนด้วยตนเองฉันขอแนะนำให้ใช้หน่วยความจำ cgroup แทน ulimit เนื่องจากหน่วยความจำ cgroup คุณสามารถกำหนดขีด จำกัด สำหรับกลุ่มกระบวนการทั้งหมดและสามารถกำหนดค่ากระบวนการจัดสรรหน่วยความจำที่จะหยุดและกระบวนการนโยบายโหมดผู้ใช้ของคุณสามารถตัดสินใจว่าจะ ทำ (เช่นส่งสัญญาณบางอย่างเลือกกระบวนการที่จะฆ่าเพิ่มหน่วยความจำได้ทันที) ดูkernel.org/doc/Documentation/cgroup-v1/memory.txtและkernel.org/doc/Documentation/cgroup-v2.txtสำหรับรายละเอียด
Mikko Rantalainen

4

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

เท่าที่ Hangup ของคุณเกี่ยวข้องstop()ฟังก์ชั่น/etc/init.d/swapอาจให้เบาะแส:

stop()
{
       ebegin "Deactivating swap devices"

       # Try to unmount all tmpfs filesystems not in use, else a deadlock may
       # occure. As $RC_SVCDIR may also be tmpfs we cd to it to lock it
       cd "$RC_SVCDIR"
       umount -a -t tmpfs 2>/dev/null

       case "$RC_UNAME" in
               NetBSD|OpenBSD) swapctl -U -t noblk >/dev/null;;
               *)              swapoff -a >/dev/null;;
       esac
       eend 0
}

ขอให้สังเกตส่วนที่เกี่ยวกับการหยุดชะงัก คุณสามารถลองทำumount -a -t tmpfsด้วยตัวเองก่อนที่จะปิดการแลกเปลี่ยน


แก้ไข:

อาจเป็นไปได้ว่าคุณอาจบรรลุเป้าหมายด้วยการแก้ไขการsysctlตั้งค่า (ดูคำถามนี้ )


ฉันไม่ได้swapเข้าinit.dหรือไม่ได้ติดตั้งfstabแต่ฉันมี/etc/init.d/mountoverflowtmpที่เมานต์tmpfsสำหรับเขียนบันทึกฉุกเฉิน swap daemon ใช้tmpfsด้วยหรือไม่
syockit

คุณอาจเปิดใช้งานที่อื่น - ทำgrep -RF swap /etc/ถ้าคุณต้องการค้นหา แต่หากต้องการปิดใช้งานบริการคุณจะต้องใช้คำสั่งเช่นservice(IIRC ฉันไม่ได้ใช้ Debian ด้วยตนเอง)
rozcietrzewiacz

1
การสลับเองไม่ได้ใช้ tmpfsเพราะtmpfsเป็นระบบไฟล์ในหน่วยความจำ (RAM) แต่บริการ / โปรแกรมอื่น ๆ ที่ใช้tmpfsอาจขึ้นอยู่กับการแลกเปลี่ยนในลักษณะพิเศษ ฉันไม่รู้จริงๆ แต่อาจมีบางอย่างเกี่ยวกับการแคชหรือวิธีพิเศษที่ผู้tmpfsขับขี่อ้างสิทธิ์การเข้าถึงพื้นที่สว็อป
rozcietrzewiacz

มีบางอย่างเกี่ยวกับวิธีที่ Linux จัดการหน่วยความจำเสมือนที่ฉันไม่เข้าใจ ฉันคนพิการแลกเปลี่ยนในรูปแบบที่เป็นไปได้มากที่สุด: ผ่านและผ่านswapoff vm.swappiness=0แต่kswapd0ยังคงทำงาน! ฉันสงสัยว่านี่เป็นความถดถอยจาก 2.4 วันหรือไม่…
syockit

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

2

มันเป็นการดีที่จะแสดงความคิดเห็นออกรายการพาร์ทิชัน swap ใน/etc/fstabกว่าทำงานswapoff -aหลังจากการบูตแต่ละครั้ง

ฉันมีปัญหาเดียวกันกับ kswapd0 บนฮาร์ดแวร์ของฉัน

การปรับvm.swappinessพารามิเตอร์ระบบไม่ช่วยฉัน

sysctl -w vm.swappiness=0

ฉัน googled และอ่านโพสต์จำนวนมากรายชื่อผู้รับจดหมายและตอนนี้ฉันคิดว่านี่เป็นข้อผิดพลาดเคอร์เนล

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

อาจจะทำซ้ำกับการกำหนดค่าและเงื่อนไขพิเศษ

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


2
หากkswapd0เป็นบ้าและคุณไม่ได้เปิดใช้งานการสลับคุณจะออกจาก RAM kswapd0ทางเลือกของคุณเป็นนักฆ่าหรือ OOM ลินุกซ์ดำเนินไปด้วยkswapd0เนื่องจากเคอร์เนลสันนิษฐานว่าเป็นเรื่องสำคัญที่จะต้องทำให้ช้ากว่าการยกเลิกกระบวนการ สำหรับมนุษย์ทั่วไปขีด จำกัด ที่เคอร์เนลคิดว่ามีความคืบหน้าเพียงพอที่จะเกิดขึ้นนั้นช้ามากและเกือบทุกคนจะค่อนข้างเลือก OOM Killer
Mikko Rantalainen

1

ในระบบของฉัน (เดเบียน sid 2016-11-15) ฉันทำสิ่งนี้:

  1. ปิดใช้งานการสลับทันที:

    swapoff -a
    
  2. ใส่ความคิดเห็นบรรทัดด้วย swap partition ใน / etc / fstab

    #### #UUID=c6ddbc95-3bb5-49e1-ab25-b1c505e5360c none            swap    sw              0       0
    
  3. ปิดการใช้งานการติดตั้ง swap ใน systemd:

    systemctl --type swap
    systemctl stop dev-sda6.swap
    systemctl mask dev-sda6.swap
    

มันจะเพียงพอ มีการอ้างอิงของการแลกเปลี่ยนใน/etc/initramfs-tools/conf.d/resumeไฟล์ ฉันไม่รู้ว่าอะไรคือจุดประสงค์ของสิ่งนี้ บางทีไฟล์นี้อาจมีปัญหาในการรีบูตครั้งถัดไป (ฉันยังไม่ได้ลองรีบูทเครื่อง uptime ของฉันมีค่า;))


1

คอมพิวเตอร์ค้างด้วยความเร็วในการส่ง I / O ที่รุนแรงในพื้นหลัง iotop เผย kswapd0 เป็นผู้ร้าย

ฉันพบวิธีหนึ่ง (จนถึง) เพื่อหลีกเลี่ยงปัญหานั้น หากคุณต้องการทดสอบและดูว่ามันทำงานอย่างไรในระบบของคุณดูkernel kernelในคำถามนี้ โดยพื้นฐานแล้วมันไม่ได้ขับไล่Active(file)เพจ (อย่างน้อย) เมื่ออยู่ภายใต้ความกดดันของหน่วยความจำดังนั้นดิสก์ thrashing (การอ่านค่าคงที่) จะลดลงเหลือเกือบไม่มีอะไรเลยและ OOM-killer ได้รับอนุญาตให้เรียกใช้ภายใน 1 วินาทีแทนการแช่แข็งระบบปฏิบัติการ ชอบอย่างถาวร (หรืออย่างน้อยก็หลายนาที) ฉันหวังว่าโปรแกรมเมอร์จริง (ซึ่งฉันไม่ได้) จะปรับปรุงแพทช์และทำให้เป็นโซลูชั่นจริงตอนนี้พวกเขาเห็นว่าสิ่งที่มันทำงานสำหรับสถานการณ์ เหล่านี้


เคอร์เนลตัวปะแก้นี้ถูกฉีดไปแล้วเหรอ?
มนุษยชาติ

@humanityandpeace อาจไม่ได้เพราะมันไม่ดี (เพราะฉันไม่ใช่โปรแกรมเมอร์) แต่ฉันเจอปัญหาบางอย่างเช่นบางครั้งขึ้นอยู่กับภาระงานด้วยแพตช์นี้คุณสามารถเรียกใช้หน่วยความจำหมดในบางกรณี ที่ไม่มีแพทช์นี้คุณจะไม่มีและดังนั้น OOM-killer จะฆ่า Xorg และ xfwm4 เว้นแต่ฉันจะทำงานecho 1 | sudo tee /proc/sys/vm/drop_cachesเมื่อActive(file):(ของ / proc / meminfo) มากกว่า 2GB (บนระบบ RAM 16G) - สามารถไปที่ 4G สูงสุด
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.