วิธีเพิ่มหน่วยความจำเสมือนของ Ubuntu และ / หรือการแลกเปลี่ยนสำหรับ Matlab


16

สถานการณ์: แก้ไขOut of Memoryข้อผิดพลาดใน
เป้าหมายMatlab ของ Ubuntu : จัดสรรหน่วยความจำเสมือนและ / หรือสลับบน HDD / SSD ภายนอก การอ่าน / เขียนลดลงจาก 20 GBps เป็น 0.1 GBps ซึ่งก็โอเค!
คำศัพท์: swap และหน่วยความจำเสมือนที่นี่

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

ฮาร์ดแวร์ผู้บริโภคมี จำกัด ดังนั้นฉันต้องใช้หน่วยความจำเสมือนและ / หรือการแลกเปลี่ยนกับ HDD ภายนอกของฉันมากกว่า Matlab พูดเกี่ยวกับหน่วยความจำ swap (สิ่งที่ต้องทำไม่รวมหน่วยความจำเสมือน?)

ระบบ Linux - เปลี่ยนพื้นที่สว็อปของคุณโดยใช้mkswapและswaponคำสั่ง

ลักษณะของระบบ

  • คุณสามารถดูว่าคุณมีเท่าไหร่โดย swapon -s

    Filename                Type        Size    Used    Priority
    /dev/sda3               partition   8326140 0       -1
    
  • การกำหนดค่าของ Matlab

    % /programming//a/35971040/54964
    com.mathworks.services.Prefs.setIntegerPref('JavaMemHeapMax', 2048); % MB
    
    % TODO cannot find ways how to put Matlab use /dev/sda3
    
  • ดังนั้นคุณจะเห็นว่า Matlab ของฉันไม่ได้ใช้งาน ฉันได้รับOut of Memoryข้อผิดพลาดจากเมทริกซ์ขนาดใหญ่ใน Matlab ฉันไม่ประสบความสำเร็จในการreshape'เข้าเมทริกซ์ถึงเวกเตอร์และเขียนโค้ดแบบขนาน ดังนั้นฉันต้องการใช้หน่วยความจำเสมือนเพราะฉันต้องทำงานให้เสร็จ อัตราไม่สำคัญ

pseudocode

  1. เชลล์สคริปต์ที่สร้างการแลกเปลี่ยนเริ่มต้น MATLAB และลบการแลกเปลี่ยนเมื่อออกจาก MATLAB ( MichaelHooreman )
  2. เปิดใช้งานการสลับกับ HDD ภายนอก วิธีใช้sudo swapon -aที่นี่
  3. เริ่ม Matlab
  4. ใส่ Matlab ใช้การแลกเปลี่ยน
  5. ลบการสลับเมื่อ Matlab ออก

Swap ชั่วคราว, เรียกใช้ไคลเอนต์และปิด / ลบ Swap ในสคริปต์ของ Micheal

สถานการณ์ : ไม่สามารถควบคุมข้อผิดพลาดในการตั้งค่าสภาพแวดล้อม (1), เรียกใช้ Matlab (2) และปิดสภาพแวดล้อม (3)
สคริปต์

#!/usr/bin/env bash

# /programming//a/69808/54964
set -e 
# TODO How to do swapoff if any error?

SWAP_FILE="/media/masi/SamiSwapVirtual/.swap_file_20.7.2016"
SIZE_MB=16000
TO_RUN="matlab"

dd if="/dev/zero" of=${SWAP_FILE} bs="1M" count=${SIZE_MB} status="progress"
mkswap ${SWAP_FILE}
chmod 0600 ${SWAP_FILE}
sudo chown 0.0 ${SWAP_FILE} # /unix//a/297153/16920
sudo swapon -v ${SWAP_FILE}
echo "Swap enabled. Press enter to continue"; read
${TO_RUN}
echo "I will remove the swap. Press enter to continue"; read
sudo swapoff -v ${SWAP_FILE}
rm -vf ${SWAP_FILE}

การทำซ้ำ 1 กับ Transcend 25M3 1 TB โดยใช้ berofe เพียงเล็กน้อยซึ่งระบบไฟล์ ext4

  1. บันทึกหลังจากเริ่มสคริปต์

    sh start_matlab_with_swap.sh 
    16000+0 records in
    16000+0 records out
    16777216000 bytes (17 GB, 16 GiB) copied, 134.489 s, 125 MB/s
    Setting up swapspace version 1, size = 15.6 GiB (16777211904 bytes)
    no label, UUID=48c2835b-4499-4534-aa49-0648e15bd5d9
    [sudo] password for masi: 
    swapon /media/masi/SamiWeek/tmp/swap_file_18.7.2016
    swapon: /media/masi/SamiWeek/tmp/swap_file_18.7.2016: insecure file owner 1000, 0 (root) suggested.
    swapon: /media/masi/SamiWeek/tmp/swap_file_18.7.2016: found swap signature: version 1d, page-size 4, same byte order
    swapon: /media/masi/SamiWeek/tmp/swap_file_18.7.2016: pagesize=4096, swapsize=16777216000, devsize=16777216000
    Swap enabled. Press enter to continue
    start_matlab_with_swap.sh: 11: read: arg count
    
  2. ใช้ไคลเอนต์

    • ประวัติคำสั่งไปในจุดเริ่มต้นแรกของ Matlab ในหน่วยความจำแลกเปลี่ยน (ตั๋ว # 02075943) กับข้อผิดพลาดมีปัญหาในการอ่านประวัติคำสั่งของคุณ - - เพียงแค่เริ่ม Matlab ของคุณใหม่และปัญหาจะได้รับการแก้ไขหากคุณมีการตั้งค่าเริ่มต้น คำสั่งprefdirให้/home/masi/.matlab/R2016aซึ่งเป็นสถานที่ตั้งค่าเริ่มต้น ( /home/{username}/.matlab/R2016a. ไฟล์/home/masi/.matlab/R2016a/matlab.prfที่มีอยู่หลังจากที่เริ่มต้นที่นี่

    • ... [ข้อผิดพลาดอื่น ๆ ] ...

  3. การปิด Matlab และพิมพ์รหัสผ่านอีกครั้งใน Terminal

    [sudo] password for masi: 
    swapoff /media/masi/SamiWeek/tmp/swap_file_18.7.2016
    [ bugs here! ]
    

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

Swap ถาวร = การติดตั้ง Swap แยกจากการรันไคลเอ็นต์

การตั้งค่า Swap

# /unix//q/297767/16920
masi@masi:~$ sudo fallocate -l 20G /mnt/.swapfile

masi@masi:~$ sudo mkswap /mnt/.swapfile 
Setting up swapspace version 1, size = 20 GiB (21474832384 bytes)
no label, UUID=45df9e48-1760-47e8-84d7-7a14f56bbd72

masi@masi:~$ sudo swapon /mnt/.swapfile
swapon: /mnt/.swapfile: insecure permissions 0644, 0600 suggested.

masi@masi:~$ sudo chmod 600 /mnt/.swapfile

masi@masi:~$ free -m
              total        used        free      shared  buff/cache   available
Mem:           7925        1494         175         196        6255        5892
Swap:         28610           0       28610

ใส่สิ่งต่อไปนี้ในตอนท้ายของ/etc/fstabการเปลี่ยนแปลงถาวร

# /unix//a/298212/16920
# /unix//a/298543/16920

# If swap is on SSD, trim blocks each time at startup.
#/mnt/.swapfile  none    swap    defaults,discard      0        0

# If swap on External HDD, just use sw.
/media/masi/SamiWeek/.swapfile  none    swap    sw      0        0

ระบบ: Linux Ubuntu 16.04 64 บิต
เคอร์เนล Linux: 4.6
ตัวเลือกเคอร์เนล Linux: wl
Matlab: 2016a
เอกสาร Matlab อย่างเป็นทางการ: แก้ไขข้อผิดพลาด Out of Memory หน่วยความจำ
HDD ภายนอก: ชนะการตรวจสอบ StoreJet 25M3 1 TB , Transcend 2 TB StoreJet 25M3
ระบบไฟล์ HDD ภายนอก: ext4
บัฟเฟอร์ HDD ภายนอก: 8 MB
หัวข้อที่เกี่ยวข้อง: วิธีเพิ่มข้อ จำกัด หน่วยความจำ MATLAB ในอูบุนตู? (วิธีใช้ mkswap, swapon สำหรับ MATLAB?) , วิธีลดหน่วยความจำกายภาพเพิ่มขึ้นใน Matlab? , วิธีแก้ไขจากข้อผิดพลาดของหน่วยความจำใน Matlab? , วิธีการแก้ไขข้อผิดพลาดหน่วยความจำไม่เพียงพอใน Matlab สำหรับเมทริกซ์ 10800x10800? ,ฉันจะเพิ่มขีด จำกัด หน่วยความจำ (ต่อเนื่องรวมถึงทั้งหมด) ใน Matlab r2012b ได้อย่างไร , วิธีการเพิ่มอาร์เรย์ที่ถูกบล็อกและแก้ไขข้อผิดพลาดออกจากหน่วยความจำใน Matlab 2009b? , วิธีการแก้ไขจากหน่วยความจำฉบับนี้มาเป็นตัวแปรขนาดเล็กใน Matlab? , 'หน่วยความจำไม่เพียงพอ' ใน Matlab วิธีแก้ปัญหาที่ช้า แต่ถาวร


4
ขออภัยนี่ไม่ได้ตอบคำถาม แต่คุณแน่ใจหรือว่าคุณต้องการสิ่งนี้ การคำนวณจากการแลกเปลี่ยนใช้เวลานานอย่างไม่น่าเชื่อ รามอ่านที่อย่างน้อย 20 GB ต่อวินาที HDD ภายนอกของคุณจะอ่านที่น้อยกว่า 0.1 กิกะไบต์ต่อวินาที
เอนก

1
@ ใช่ฉันรู้ มันไม่ใช่ปัญหา. ฉันมีเมทริกซ์ขนาดใหญ่ซึ่งสามารถคำนวณได้ด้วย 32/64 GB แต่ไม่ใช่กับ ultrabook ขนาด 8 GB ปัจจุบันของฉัน ฉันยังต้องทำการคำนวณถึงวันหยุด
LéoLéopold Hertz 준영

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

@Anake เป็นไปไม่ได้ขออภัยในขณะนี้ นอกจากนี้ Matlab ที่นี่จึงต้องการการคำนวณในท้องถิ่น นอกจากนี้ยังไม่มีปุ่มเพียงพอที่จะทำในขณะนี้
LéoLéopold Hertz 준영

MATLAB มีความพิเศษอย่างไรในบริบทนี้ นี่เป็นเพียงวิธีการเพิ่มพื้นที่สว็อปไม่
ขับเหล็ก

คำตอบ:


2

ตกลงค่อนข้างรายการคุณมี ให้ฉันตอบแบบอินไลน์

  1. วิธีการใช้การดักจับข้อผิดพลาดที่ดีขึ้นที่นี่ ดูสคริปต์ของฉันสำหรับตัวอย่างในแหล่งที่มา หัวข้อวิธีทำดักข้อผิดพลาดและ Swapoff ถ้าผิดพลาด / คำเตือน?

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

  1. จะวางคำเตือนได้อย่างไรถ้าขนาดของเมทริกซ์เกินขนาดของการสลับ?

แค่ทำคณิตศาสตร์ หากคุณรู้ขนาดของเมทริกซ์ก่อนที่โปรแกรมจะเริ่มคำนวณขนาดใน MiB และเปรียบเทียบกับการแลกเปลี่ยนที่มี

  1. จะมีแถบความคืบหน้าในการคำนวณเมทริกซ์ขนาดใหญ่ของคุณใน Matlab ได้อย่างไร?

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

  1. วิธีการฆ่าความคืบหน้าที่ยุ่งและ / หรือ swapon -s / swapoff ในการวนซ้ำ (2)?

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

echo 3 > /proc/sys/vm/drop_caches 

อาจมีมากกว่านั้นฉันไม่ใช่ผู้เชี่ยวชาญ Linux VM มันจะคุ้มค่าที่จะตรวจสอบว่าตัวจัดสรร SLAB / SLUB ทำงานอย่างไรและวิธีการปรับแต่งสำหรับความต้องการหน่วยความจำขนาดใหญ่ของคุณ คุณอาจสามารถ MLOCK matlab ในหน่วยความจำ นั่นเป็นการบังคับให้ระบบปฏิบัติการสำรองหน่วยความจำให้กับคุณหรือเพิ่งเริ่มไม่ได้คุณต้องปลดล็อคเมื่อคุณทำเสร็จแล้ว ฉันสามารถทำสิ่งนี้กับ C API ได้ แต่ฉันไม่แน่ใจว่าคุณจะทำอย่างไรนอกกระบวนการที่ฉันไม่สามารถคอมไพล์ซ้ำได้ซึ่งจะต้องมีการวิจัย

ในที่สุดนี่คือประเภทของสิ่งที่ EC2 ทำขึ้น ดูเหมือนว่า 16G เป็นสิ่งที่คุณต้องการ m4.4xlarge มี 64G ram @ $ 0.958 ต่อชั่วโมง นั่นน้อยกว่ากาแฟหนึ่งถ้วย เขียนสคริปต์การติดตั้ง matlab ของคุณโดยใช้ juju charm หรือสิ่งที่คล้ายกันและเปลี่ยนสิ่งทั้งหมดให้เป็นบริการการคำนวณ

16G 16 GB หรือไม่

  • ใช่โดยปกติเมื่อเราเว้นคำต่อท้ายเราหมายถึงหมายเลข base2 ในหน่วยของไบต์ ถ้าคุณต้องการที่จะกระชับคุณจะเขียน 16GiB

"ฉันต้องการเมทริกซ์ที่> 100 GB. ฉันไม่รู้ว่าคุณสามารถใช้ EC2 ได้หรือไม่"

คุณควรล้างแคชด้วยecho 3 > /proc/sys/vm/drop_cachesหรือไม่

  • ใช่มันไม่เจ็บที่จะทำเช่นนั้นเสมอ ดูเอกสาร / sysctl / vm.txt ในเคอร์เนล linux

MLOCK Matlab เป็นความทรงจำได้อย่างไร?

  • man mlock. แม้ว่าฉันจะโง่เมื่อพูดถึงเรื่องนั้น การโทรนี้รับรองว่าคุณสามารถจัดสรรหน่วยความจำทั้งหมดที่คุณต้องการและป้องกันไม่ให้ถูกสลับมันจะไม่ใช้หน่วยความจำเสมือน นั่นไม่ใช่สิ่งที่คุณต้องการ

ฉันคิดว่าคุณสามารถผูก C API กับ Matlab - - คุณมีความคิดที่จะปิดการแลกเปลี่ยนหากมีความล้มเหลวในกระบวนการหรือไม่?

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

เมื่อฉันขอพื้นที่หน่วยความจำสำหรับ OS บางครั้งก็ไม่ประสบความสำเร็จเสมอไปนั่นไม่ได้หมายความว่าฉันจะไม่สามารถลองอีกครั้งได้ matlab นั้นไม่สามารถคิดได้ว่าจะเรียก malloc สองครั้งเป็นปัญหาของ matlab

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

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

ดังนั้นนี่คือตัวเลือกของคุณตามที่ฉันเห็น

  1. ตรวจสอบ matlab C API เพื่อดูว่าคุณสามารถควบคุมการจัดสรรหน่วยความจำได้ดีขึ้นสำหรับชุดการทำงานขนาดใหญ่เหล่านี้หรือไม่

  2. สร้างการคำนวณของคุณใหม่เพื่อคำนวณสิ่งที่คุณมีตอนนี้โดยใช้เมทริกซ์ย่อยหรือการแสดงข้อมูลกระจัดกระจายอื่น ๆ

  3. เขียนโปรแกรมของคุณเองใน C / C ++ โดยใช้ไลบรารีพีชคณิตเชิงเส้นที่มีอยู่มากมายเพื่อดำเนินการคำนวณและใช้mallocหรือmmapไม่ระบุชื่อเพื่อจัดสรรพื้นที่ที่อยู่ที่คุณต้องการ


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

1
เฮ้ความคิดเห็นที่เหลือของคุณไม่ปรากฏในสมาร์ทโฟนของฉัน คุณไม่สามารถ sudo echo แบบนั้นแทนได้ echo 3 | sudo tee /proc/sys/vm/drop_caches
ppetraki

ฉันยอมรับคำตอบนี้เพราะมันมีความรู้สึกที่ถูกต้องในคำตอบของมัน ในการเรียกใช้ไคลเอนต์ในสคริปต์เดียวกันกับการตั้งค่าสภาพแวดล้อมจะเกิดข้อผิดพลาดอย่างบ้าคลั่ง การอภิปรายเพิ่มเติมเกี่ยวกับที่นี่unix.stackexchange.com/a/298543/16920 - - จะดีถ้าคุณสามารถทำความสะอาดร่างกายของคุณเล็กน้อย
LéoLéopold Hertz 준영

12

คุณไม่สามารถอุทิศ swap สำหรับซอฟต์แวร์ สิ่งที่คุณสามารถทำได้คือสร้างเชลล์สคริปต์ที่สร้างการแลกเปลี่ยนเริ่มต้น MATLAB และลบการแลกเปลี่ยนเมื่อออกจาก MATLAB

ต่อไปนี้เป็นตัวอย่างสคริปต์ที่สร้างการแลกเปลี่ยน 10Mb ในไดเรกทอรี / tmp ติดตั้งเริ่ม R (ฉันไม่มี matlab) รอ R ออกจากติดตั้งสลับไฟล์และลบออก

โปรดทราบว่า: - คุณจะได้รับคำเตือนเนื่องจากไฟล์แลกเปลี่ยนไม่ได้เป็นเจ้าของโดยรูท นั่นเป็นเพราะระบบจะใช้สำหรับซอฟต์แวร์ใด ๆ อาจไม่ได้ทำงานโดยคุณและคุณสามารถอ่านไฟล์นี้ ... ฉันให้คุณแก้ไข - หากคุณ [ctrl] - [c] สคริปต์หรือออกจากระบบหรืออื่น ๆ การสลับจะยังคงอยู่ ฉันให้คุณแก้ไขเช่นกัน

#!/usr/bin/env bash

SWAP_FILE=/tmp/my_swap_file
SIZE_MB=10
TO_RUN="R"

dd if=/dev/zero of=${SWAP_FILE} bs=1M count=${SIZE_MB}
mkswap ${SWAP_FILE}
chmod 0600 ${SWAP_FILE}
sudo swapon -v ${SWAP_FILE}
echo "Swap enabled. Press enter to continue"; read
${TO_RUN}
echo "I will remove the swap. Press enter to continue"; read
sudo swapoff -v ${SWAP_FILE}
rm -vf ${SWAP_FILE}

1
มันไม่ได้ทุ่มเทให้กับ MATLAB แต่สำหรับสถานการณ์ใด ๆ ที่ต้องการ RAM เพิ่มขึ้นชั่วคราว โปรดทราบว่า swapon / swapoff ต้องการรูทถูกต้อง (ดังนั้น: sudo)
Michael Hooreman

1
ใช่คุณมี. นั่นเป็นวิธีที่จะกลายเป็นราก
Michael Hooreman

คำตอบที่ดี. ฉันจะเข้าใกล้มันเป็นการส่วนตัวและให้สคริปต์ add-swap.sh ของฉันเองสำหรับช่วงเวลาที่น่ารักเมื่อความทรงจำหมดไป
Sergiy Kolodyazhnyy

ฉันได้รับรางวัลที่นี่เพราะมันทำให้ฉันเป็นวิธีที่ถูกต้อง อย่างไรก็ตามฉันไม่สามารถยอมรับคำตอบได้เนื่องจากการจัดการข้อผิดพลาดนั้นยากและไม่สมบูรณ์ ที่ดีที่สุดคือการตั้งค่าการแลกเปลี่ยนแยกต่างหากจากการใช้ Matlab โปรดดูคำตอบได้ที่นี่unix.stackexchange.com/a/298543/16920
LéoLéopold Hertz 준영

1

นี่คือวิธีที่คุณสามารถขยายหน่วยความจำ SWAP โดยใช้ฮาร์ดไดรฟ์ภายนอก :

  • ก่อนอื่นให้จดหน่วยความจำ SWAP ที่แท้จริงของคุณโดยเรียกใช้:

    free -m
    
  • อันดับสองมีโฟลเดอร์ HDD ของคุณ /media/myhddมันควรจะเป็นสิ่งที่ชอบ

  • กำหนดขนาด SWAP พิเศษที่คุณต้องการเพิ่ม สมมติว่าX GB
  • คำนวณจำนวนไบต์ที่ปริมาณนั้น การใช้ GB นี่คือ: Y = X * 1024 ^ 3โดยที่Yคือผลลัพธ์ของการคำนวณของคุณ
  • เลือกขนาดบล็อกของไฟล์ (เป็นไบต์) ลองใช้ค่าเริ่มต้นที่นี่: 4096 (ดูเพิ่มเติมเกี่ยวกับสิ่งนี้ได้ที่นี่ )
  • คำนวณจำนวนบล็อกที่ไฟล์จะมี: Z = Y / 4096
  • สร้างไฟล์ขนาดX GB โดยใช้คำสั่งต่อไปนี้ในเทอร์มินัล:

    dd if=/dev/zero of=/media/myhdd/swapfile bs=4096 count=Z
    
  • สร้าง SWAP ในไฟล์โดยใช้:

    sudo mkswap /media/myhdd/swapfile -f
    
  • ในที่สุดเปิดใช้งาน SWAP:

    sudo swapon -p 1000 /media/myhdd/swapfile
    

ตอนนี้ SWAP ของคุณเพิ่มขึ้น ตรวจสอบอีกครั้งด้วยfree -m


เราสามารถตั้งค่านี้ในสคริปต์ที่ไม่โต้ตอบ ( sudoจำเป็นต้องใช้พลัง):

#!/bin/bash

### Inputs ###

swap_GB=$(expr 1) # Enter here size of the swap memory to create, in GB.
swap_bs=$(expr 4096) # Enter here block size, in bytes (must be a multiple of 8).
HDD_folder="/media/myhdd/" # Enter absolute path of HDD inside the brackets.

### Swap creation ###

swap_size=$(expr $swap_GB \* 1024 \* 1024 \* 1024 / $swap_bs)
dd if=/dev/zero of=${HDD_folder}"/swapfile" bs=$swap_bs count=$swap_size
mkswap ${HDD_folder}"/swapfile" -f
swapon -p 1000 ${HDD_folder}"/swapfile"

### EOF ###

PS: โปรดเพิ่มประสิทธิภาพ / แก้ไขถ้าเป็นไปได้ อย่างที่บอกไปมันเป็นสคริปต์ตัวแรกของฉันเลย :)


การสลับช้าแล้ว แต่ฉันนึกภาพไม่ออกเลยว่าการสลับบนไดรฟ์ USB มันจะช้าเหมือนนรก IMHO
Michael Hooreman

บทสรุปจะดีมากที่นี่
LéoLéopold Hertz 준영

1
ฉันไม่เคยสร้างสคริปต์ แต่จะไปให้ได้

1

อย่างน้อยฉันจะทดสอบว่า RAM ที่ถูกบีบอัดได้ดีเพียงใด (โมดูลเคอร์เนล zram ซึ่งมีให้ตั้งแต่เคอร์เนลเวอร์ชัน 3.14) ทำงานได้ดี

การทำตามคำแนะนำของ archlinux wiki

modprobe zram
echo lz4 > /sys/block/zram0/comp_algorithm
echo 4G > /sys/block/zram0/disksize
mkswap --label zram0 /dev/zram0
swapon --priority 100 /dev/zram0

ฉันเดาว่า RAM ที่บีบอัดควรจะเร็วกว่าดิสก์ I / O

เพื่อให้การเปลี่ยนแปลงยังหลังจากที่เริ่มต้นคำสั่งบูตเวลาสถานที่ในและเรียกใช้/etc/rc.localsudo systemctl enable rc-local.service


ฉันขยายคำตอบไปยังเธรดunix.stackexchange.com/q/297752/16920สำหรับเอฟเฟกต์ของ zram ต่อขนาดหน่วยความจำและอัตราการเพจ ฉันไม่พบเอฟเฟกต์ใด ๆ กับขนาดของหน่วยความจำ อย่างไรก็ตามคำเตือน systemd / ... เพิ่มขึ้นเมื่อ runit มันจะเป็นการดีถ้าได้รู้เกี่ยวกับอัตราความผิดพลาดของ zram
LéoLéopold Hertz 준영

ในกรณีของการ zram0 มีสถิติบางอย่างที่มีอยู่ในsys / / บล็อก / zram0ในแฟ้มorig_data_sizeและcompr_data_size ฉันไม่ได้แลกเปลี่ยนข้อมูลมากนัก แต่สิ่งที่มีอัตราส่วนคือประมาณ 0.35 ด้วยอัตราส่วนดังกล่าวข้อมูล 11 GB อาจพอดีกับ RAM ขนาด 4 GB นั่นอาจหมายถึงข้อมูล 7 GB ที่ไม่ได้สลับไปยังดิสก์
JJ Hakala

1
คุณสามารถวางคำสั่งเวลาบู๊ตใน/etc/rc.localจากนั้นsudo systemctl enable rc-local.service
JJ Hakala

ฉันพบว่าzramไม่สามารถใช้กับการสลับกับ HDD / SSD ได้ดังนั้นจึงzramไม่สามารถใช้งานได้ที่นี่โปรดดูหัวข้อaskubuntu.com/a/472227/25388
LéoLéopold Hertz 준영

1

ใช้zswapหากคุณมีส่วนการแลกเปลี่ยนบน HDD / SSD โมดูล Tho zramไม่มีส่วนสลับบน HDD / SSD ดังนั้นคำตอบของ Hakala จึงไม่สามารถใช้ได้ ดูคำแนะนำของเธรดzram vs zswap vs zcache Ultimate: เมื่อใดควรใช้คำอธิบายใด การตั้งค่าzswapตามที่อธิบายไว้ในเธรดวิธีการเปิดใช้งาน Zswap ประสบความสำเร็จในการคำนวณ Matlab ใน Ubuntu 16.04?

  • แทนที่บรรทัดที่เกี่ยวข้องด้วยบรรทัดต่อไปนี้ใน /etc/default/grub

    # https://wiki.archlinux.org/index.php/Zswap
    GRUB_CMDLINE_LINUX_DEFAULT="quiet splash zswap.enabled=1 zswap.max_pool_percent=25 zswap.compressor=lzo"
    
  • sudo update-grubวิ่ง

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