การสร้าง ram disk บน Linux


70

ฉันมีเครื่องที่มี RAM ขนาด 62GB และลำตัวที่มีเพียง 7GB ดังนั้นฉันคิดว่าฉันจะสร้างดิสก์ RAM และรวบรวมที่นั่น ฉันไม่ใช่ผู้เชี่ยวชาญ Linux ฉันพบคำแนะนำบนอินเทอร์เน็ตเพื่อสร้างดิสก์ RAM:

mkfs -q /dev/ram1 8192

แต่ฉันเปลี่ยน 8192 เป็น 16777216 เพื่อพยายามจัดสรร RAM 16GB

ฉันได้รับข้อผิดพลาดต่อไปนี้:

mkfs.ext2: Filesystem larger than apparent device size.
Proceed anyway? (y,n) 

เมื่อถึงจุดนี้ฉันก็ตกตะลึงและประกันตัว

sudo dmidecode --type 17 | grep Size

แสดงให้เห็นว่า

8x8192MB + 2048MB = 67584 MB

แต่duในการให้/dev804K

นั่นเป็นปัญหาหรือไม่ ฉันสามารถเอาชนะ/devขนาดนั้นได้หรือไม่?


15
คุณลอง tmpfs หรือไม่ มันเป็นระบบไฟล์ใน RAM ไม่จำเป็นต้องมี ext2 mount -o size=16G -t tmpfs none /mnt/tmpfs
t-8ch

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

3
การวางเครื่องมือบน ramdisk นั้นไม่ควรสร้างความแตกต่างมากนักเนื่องจากเคอร์เนลจะแคชพวกมันไว้ในหน่วยความจำ
t-8ch

1
@goldilocks เป็นหลักฐานพอสมควร แต่เมื่อรวบรวมโครงการ Java ของเรากับ Maven จะมีการเร่งความเร็วที่สำคัญเมื่อใช้ ramdisk ฉันเดาว่านี่เป็นเพราะเวลามากกว่าการอ่าน
SpellingD

1
/ dev / shm, จริง ๆ แล้ว/ run / shm , สามารถใช้ได้; มันมักจะมี
Camille Goudeseune

คำตอบ:


78

วิธีที่ดีที่สุดในการสร้าง ram disk บน linux คือ tmpfs มันเป็นระบบไฟล์ที่อยู่ใน ram ดังนั้นจึงไม่จำเป็นต้องมี ext2 คุณสามารถสร้าง tmpfs ขนาด 16Gb ด้วย:

mount -o size=16G -t tmpfs none /mnt/tmpfs

2
บนระบบของฉันไม่มีอะไรเลยใน / mnt มันบอกว่า: ls: ไม่สามารถเข้าถึง / mnt / tmpfs: ไม่มีไฟล์หรือไดเร็กตอรีเมาต์ดังกล่าว: ไม่มีจุดเมานต์ / mnt / tmpfs นั่นเป็นเรื่องที่ต้องกังวลใช่ไหม ถ้าฉันเพียงแค่ mkdir / mnt / tmpfs นั่นจะเอาชนะวัตถุประสงค์ (โดยการสร้าง tmpfs บนดิสก์ปกติ - โปรดไม่มีเปลวไฟฉันเป็นผู้เริ่มต้นที่นี่)
แฟรงก์

9
คุณต้องใช้จุดเมานท์ (ไดเรกทอรี) เป็นเป้าหมายดังนั้นหลังจากที่คุณสร้างไดเรกทอรีนี้ (คุณสามารถใช้ไดเรกทอรีใด ๆ เนื้อหาที่มีอยู่จะถูกแรเงา) คุณสามารถติดตั้งด้วยคำสั่งจากคำตอบ
t-8ch

1
tmpfsอาจใช้ swap ซึ่งคุณอาจไม่ต้องการในดิสก์ RAM ที่แท้จริง
palswim

2
@RomanSusi tmpfs เป็นประเภทไฟล์ (ผ่านไปหลังจาก -t) "none" เป็นอุปกรณ์สำรองข้อมูล ("ดิสก์") ซึ่งไม่มีอยู่สำหรับ tmpfs
t-8ch

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

20

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


1
อะไร! พวกเขาไม่สามารถใช้โดยตรงจากที่นั่นได้อย่างไร
Kazark

พวกเขาอยู่ใน RAM แต่ไม่ใช่ในรูปแบบที่สามารถใช้งานได้โดยตรง
vonbrand

2
จริงๆ! งั้นเหรอ (ให้อภัยความ
เชื่องช้า

8
@Kazark เพื่อจัดการกับไฟล์ปฏิบัติการในโครงสร้างข้อมูลพิเศษของหน่วยความจำ ในฐานะที่เป็น RAMdisks และtmpfsไม่ได้ใช้งานทั่วไปในการจัดเก็บไฟล์ปฏิบัติการ (RAMdisks เป็นเศษเล็กเศษน้อยจากวันเก่า ๆ ที่ดีของฟลอปปี้ดิสก์ที่ช้าระทึกขวัญอย่างมากและtmpfsสำหรับข้อมูลชั่วคราวที่เข้มงวด) ไม่มีใครคิดว่ามันสำคัญพอที่จะเพิ่มแฮ็คที่น่าเกลียด
vonbrand

7
ฉันลองใช้งานรหัสรางของฉันจากระบบไฟล์ tmpfs (RAM) และฉันไม่เห็นความแตกต่างเลย ฉันหวังว่าจะเห็นความแตกต่างที่เห็นได้ชัดเจน แต่ฉันก็รู้สึกผิดหวังกับลินุกซ์ที่น่าประทับใจ
Khaja Minhajuddin

6

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

ตามที่ระบุไว้ในคำตอบอื่น ๆ tmpfs คือสิ่งที่คุณต้องการใช้ นอกจากนี้คุณจะไม่ชนะมากนักโดยใช้ระบบปฏิบัติการทั้งหมดของคุณใน ramdisk / tmpfs เพียงแค่คัดลอก builddir ของคุณไปยัง tmpfs และทำการคอมไพล์แล้ว คุณอาจต้องมั่นใจว่าผลลัพธ์ชั่วคราวทั้งหมดถูกเขียนไปยังตำแหน่งที่อยู่ใน tmpfs เช่นกัน


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

@psusi: คุณสามารถให้ข้อมูลเพิ่มเติมกับเราได้ไหม? ฉันสามารถค้นหาข้อความที่กล่าวถึงว่าเมื่อหน่วยความจำ ramdisk อ้างสิทธิ์จะไม่ถูกเรียกคืนเช่นในDocumentation/blockdev/ramdisk.txtแหล่งเคอร์เนล และในคำตอบของฉัน: ไฟล์นั้นยังบอกว่า ramdisk เติบโตขึ้นเมื่อหน่วยความจำถูกใช้ไปดังนั้นมันจึงไม่ได้ถูกจัดสรรพร้อมกันทั้งหมด
Bananguin

ข้อมูลประเภทใด คุณเรียกใช้คำสั่งและทำให้ ram เพิ่มโดยสมมติว่าคุณยังไม่ได้ติดตั้ง แต่อย่างใด
psusi

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

6
ฉันอ่านซอร์สโค้ดและตรวจสอบโดยทดลองใช้
psusi

3

หากต้องการสร้าง ram ดิสก์ขนาดใหญ่หลังจากบูตโดยไม่ต้องยุ่งกับพารามิเตอร์ของเคอร์เนลดูเหมือนว่าจะใช้งานได้ ใช้ tmpfs สร้างไฟล์เชื่อมต่อผ่านลูปและเมานต์ผ่านระบบไฟล์:

mount -t tmpfs -o size=200M tmpfs temp/
cd temp/
dd if=/dev/zero of=disk.img bs=1M count=199
losetup /dev/loop0 disk.img
mkfs.ext4 /dev/loop0
mount /dev/loop0 temp2/

อาจมีการปรับประสิทธิภาพเล็กน้อยผ่านหลายเลเยอร์ต่าง ๆ ... แต่อย่างน้อยก็ใช้งานได้


3

นอกจากนี้tmpfsและramfsตัวเลือกอื่นคือ/dev/ram0อุปกรณ์บล็อก ในรุ่นอูบุนตูที่ผ่านมาอุปกรณ์นี้ไม่ได้อยู่โดยค่าเริ่มต้น modprobe brdแต่สามารถสร้างขึ้นผ่านทาง

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

การใช้โมดูลเคอร์เนล brd (/ dev / ram0)

วิธีสร้างและเตรียมใช้งานดิสก์ RAM 4GB:

mkdir /ramdisk

modprobe brd rd_nr=1 rd_size=$((4 * 1048576))
mkfs.ext4 /dev/ram0
mount /dev/ram0 /ramdisk

rd_nrพารามิเตอร์ระบุว่าดิสก์ RAM มากมายที่จะสร้าง (โดยค่าเริ่มต้นจะสร้าง 16 คือ/dev/ram0ผ่าน/dev/ram15) rd_sizeพารามิเตอร์ขนาดกิโลไบต์ $(( ... ))ไวยากรณ์ช่วยให้คุณทำเลขคณิตในเปลือก

ในการยกเลิกการจัดสรรดิสก์ RAM ให้ถอนการติดตั้งแล้วลบbrdโมดูลเคอร์เนล:

umount /ramdisk
modprobe -r brd

การสร้างอุปกรณ์บล็อกภายใน ramfs

อีกวิธีหนึ่งคุณสามารถสร้างอุปกรณ์บล็อกภายในramfs:

mkdir /ramdisk-storage /ramdisk
mount -t ramfs ramfs /ramdisk-storage

truncate -s 4G /ramdisk-storage/ramdisk.img
mkfs.ext4 /ramdisk-storage/ramdisk.img
mount /ramdisk-storage/ramdisk.img /ramdisk

truncateคำสั่งสร้างไฟล์ที่ว่างเปล่าของขนาดที่กำหนดดังกล่าวว่าจะเริ่มต้นได้ (เช่นกินหน่วยความจำ) ตามความต้องการ

ในการยกเลิกการจัดสรรดิสก์ RAM ให้ถอนติดตั้งแล้วลบอิมเมจดิสก์:

umount /ramdisk
rm /ramdisk-storage/ramdisk.img

เปรียบเทียบกับtmpfsและramfs

แม้ว่าtmpfsและramfsจะมีประสิทธิภาพมากกว่าการใช้อุปกรณ์บล็อกด้านล่างนี้เป็นข้อเสียบางประการ

tmpfsอาจสลับไปที่ดิสก์ มีประสิทธิภาพมากขึ้น แต่อาจมีบางครั้งที่คุณต้องการดิสก์ RAM ที่แท้จริง:

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

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

  • dfยูทิลิตี้ไม่รายงานการใช้พื้นที่:

    root@cello-linux:~# df -h /ramdisk
    Filesystem      Size  Used Avail Use% Mounted on
    ramfs              0     0     0    - /ramdisk
    
  • ไม่มีพารามิเตอร์ จำกัด ขนาด หากคุณใส่ ramdisk มากเกินไประบบของคุณจะหยุดทำงาน

  • ไฟล์ที่กระจัดกระจายอาจไม่กระจัดกระจายเมื่อคุณคาดหวังน้อยที่สุด เช้านี้ฉันคัดลอกอิมเมจ VM (150G แต่ 49G ใช้บนดิสก์) ไปยังramfs(ฉันมี 128G of RAM) ที่ได้ผล แต่เมื่อผมคัดลอกจากramfsไปยังปลายทางระบบของฉันกลายเป็นไม่ตอบสนอง cpยูทิลิตี้ที่เห็นได้ชัดเต็มไปหลุมบนอ่านแต่ไม่ได้อยู่ในการเขียน

ทั้งtmpfsและramfsอาจทำงานแตกต่างจากext4ระบบไฟล์จริง การสร้างอุปกรณ์บล็อกใน RAM และเริ่มต้นด้วยext4หลีกเลี่ยงสิ่งนี้

สำหรับการเปรียบเทียบเชิงลึกเพิ่มเติม: https://www.kernel.org/doc/Documentation/filesystems/ramfs-rootfs-initramfs.txt


1

OP แสดงจำนวน RAM ในหน่วย MB ดังนั้นคุณต้องป้อนนั่นคือ 16384 แล้ว voila ที่คุณอยู่ในธุรกิจ


1
Nope "หากขนาด fs ไม่มีส่วนต่อท้ายจะถูกตีความเป็นพลังงานสองกิโลไบท์" - manmkfs.ext2
sourcejedi

1

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

Ramfs เป็นระบบไฟล์ที่ง่ายมากที่ส่งออกกลไกการแคชดิสก์ของ Linux (แคชหน้าและแคช Dentry) เป็นระบบไฟล์ RAM ที่ปรับขนาดได้แบบไดนามิก

- https://github.com/torvalds/linux/blob/v4.18/Documentation/filesystems/ramfs-rootfs-initramfs.txt

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

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

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

หากคุณรันการทดสอบของโปรแกรมที่เกี่ยวข้องการfsync()รันไฟล์เหล่านี้ในระบบไฟล์ramfsอาจทำให้เร็วขึ้น กลยุทธ์หนึ่งคือการลองและปิดการใช้งานfsync()ด้วย/eatmydatanosync.so

ระบบปฏิบัติการอื่น ๆ บางระบบอาจมีข้อ จำกัด เฉพาะซึ่งสามารถข้ามได้โดยใช้ ramdisk ที่ปลายด้านหนึ่งขาดการใด ๆแคชไฟล์คือเหตุผลที่ ramdisks เป็นที่นิยมในDOS

tmpfs

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

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

สาเหตุอื่น ๆ ที่ทำให้การเขียนช้าลง

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

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