ฉันจะเพิ่มพื้นที่สว็อปสูงสุดใน Mac OS X ได้อย่างไร


14

ใน Mac OS X Yosemite 10.10.5 เมื่อฉันพยายามเรียกใช้การคำนวณที่จำเป็นต้องจัดสรรและใช้หน่วยความจำ 128 GB (เป็นโปรแกรมบรรทัดคำสั่งที่เขียนด้วย C) เคอร์เนลจะฆ่ากระบวนการของฉันด้วยอคติอย่างรุนแรง รายการบันทึกคอนโซลนี้เป็นตัวอย่างหนึ่งอินสแตนซ์:

9/25/15 7: 08: 40.000 PM เคอร์เนล [0]: การแลกเปลี่ยนต่ำ: ฆ่า pid 6202 (huffgrp)

การคำนวณใช้งานได้ดีและใช้เวลาพอสมควรเมื่อจัดสรรและใช้หน่วยความจำ 64 GB Mac ของฉันมี RAM ขนาด 32 GB และพื้นที่ว่างบนฮาร์ดไดรฟ์ ฉันยังลองใช้มันใน Mac เครื่องอื่นที่มี RAM ขนาด 8 GB ซึ่งการคำนวณ 64 GB ก็ทำงานได้ดีเช่นกันใช้เวลานานขึ้น แต่การคำนวณ 128 GB ก็ถูกฆ่าโดยเคอร์เนลด้วยวิธีเดียวกัน

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

ดังนั้นจึงมีข้อ จำกัด เกี่ยวกับพื้นที่สลับอย่างลับอยู่ระหว่าง 64 GB และ 128 GB

คำถามของฉันคือฉันจะกำหนดค่าเคอร์เนลใหม่เพื่อให้มีพื้นที่สว็อปได้มากขึ้นได้อย่างไร ฉันพบไฟล์ที่ดูดี/System/Library/LaunchDaemons/com.apple.dynamic_pager.plistแต่ฉันไม่เห็นหมายเลขลับในนั้น หน้า man สำหรับdynamic_pagerบอกว่ามันทำทั้งหมดคือการตั้งชื่อและที่ตั้งของไฟล์สลับ มี man page รุ่นเก่ากว่าที่มีเอกสาร-Sตัวเลือกในการกำหนดขนาดของ swapfiles ที่สร้างขึ้น ฉันลองที่ขอ swapfiles 160 GB แต่ก็ไม่มีผล swapfiles ยังคงมีขนาด 1 GB และกระบวนการก็ยังถูกฆ่าโดยเคอร์เนล


ฉันยังโพสต์คำถามนี้ใน apple.stackexchange.com แต่ยังไม่มีคำตอบใด ๆ
Mark Adler

1
เหตุผลที่คุณสามารถทำได้mallocมากกว่าที่คุณมีก็เพราะว่า commit_limit นั้นสูงมาก (อาจไม่มีที่สิ้นสุด) ดังนั้นระบบปฏิบัติการจะจัดสรรหน่วยความจำที่ไม่มี (เป็นการเดิมพันที่กระบวนการจะไม่ใช้ระบบปฏิบัติการมักจะชนะการเดิมพันนี้) คุณอาจต้องการปรับขีด จำกัด การส่งมอบให้เป็นขีด จำกัด หน่วยความจำด้วยวิธีนี้กระบวนการจะล้มเหลวก่อน
ctrl-alt-delor

ฉันไม่สามารถเห็นได้ว่าทำไมสิ่งที่คุณวรรค 5 เป็นความจริงมันไม่ได้ปฏิบัติตามจากวรรค 4 (แม้ว่าคุณจะเริ่มต้นด้วย "ดังนั้น") คุณลองเพิ่มจำนวน swap แล้วหรือยัง? (คำถามไม่ชัดเจนในเรื่องนี้แม้ว่าฉันสงสัยว่าคำตอบคือใช่)
ctrl-alt-delor

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

@richard เนื่องจากข้อความเคอร์เนลระบุว่า "low swap" ในส่วนของ "การเพิ่มการสลับจำนวนมาก" ฉันไม่ได้ทำเช่นนั้นเพราะฉันไม่รู้ว่าจะทำอย่างไร นั่นคือคำถามนี้อย่างแม่นยำ ฉันจะเพิ่มพื้นที่สว็อปได้อย่างไร แน่นอนเคอร์เนลจะเพิ่มพื้นที่สว็อปโดยอัตโนมัติ แต่มีค่าไม่เกินขีด จำกัด ดังนั้นรากของคำถาม: ฉันจะเพิ่มขีด จำกัด พื้นที่สว็อปของเคอร์เนลได้อย่างไร
Mark Adler

คำตอบ:


4

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

มันอาจช้าลงขึ้นอยู่กับว่าคุณเขียนทับข้อมูลบ่อยแค่ไหน แต่ควรพกพาได้มากกว่าเดิม


2
ความคิดที่ดี! ฉันมีความหวังสูง อนิจจาพวกเขาถูกประคองชายฝั่งที่รุนแรงของความเป็นจริง เป็นกระบวนการที่ยังคงถูกฆ่าตายโดย kernel สำหรับจำนวนมากของการแลกเปลี่ยน, เช่นเดียวกับก่อน ( "แลกเปลี่ยนต่ำ" ข้อความคอนโซล) mmap()แม้ว่ามันจะถูกใช้ไฟล์ที่ผมได้สร้างขึ้นเพื่อใช้เป็นหน่วยความจำเสมือนโดย
Mark Adler

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

0

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

กำจัดความไม่แน่นอนของการใช้โฟลเดอร์แลกเปลี่ยนแบบไดนามิก สร้างฟิวชั่นพาร์ทิชันสลับ (เพียงพาร์ทิชันที่ไม่ได้ฟอร์แมตว่างด้วยรหัสประเภทตารางดิสก์สำหรับการแลกเปลี่ยนใน Linux มันเป็นรหัสฐานสิบหก0x82) จากนั้น:

  1. แก้ไขไฟล์ / etc / rc ค้นหาส่วนการแลกเปลี่ยนความคิดเห็นออกทั้งหมด เพิ่มบรรทัดmount -vat swap
    • หมายถึง mount พาร์ติชั่น swap ทั้งหมดใน / etc / fstab
  2. วิ่ง pdisk /dev/disk? -dump
    • "?" คือหมายเลขดิสก์ของบันทึก hd ของคุณหมายเลขถัดจากพาร์ติชันสลับ
  3. แก้ไขหรือสร้าง / etc / fstab (อาจไม่มีอยู่) เพิ่มบรรทัดเช่น /dev/disk?s?? none swap sw 0 0
    • ? เป็นดิสก์ของคุณ
    • ?? คือจำนวนของพาร์ติชัน swap
  4. รีบูต
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.