Membuat ram disk di Linux

70

Saya memiliki mesin dengan 62GB RAM, dan bagasi yang hanya 7GB, jadi saya pikir saya akan membuat RAM disk dan kompilasi di sana. Saya bukan ahli Linux. Saya menemukan instruksi di internet untuk membuat disk RAM:

mkfs -q /dev/ram1 8192

tapi saya mengubah 8192 ke 16777216 dalam upaya untuk mengalokasikan 16GB ram disk.

Saya mendapat kesalahan berikut:

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

Pada titik mana saya menjadi ketakutan dan ditebus.

sudo dmidecode --type 17 | grep Size

menunjukkan

8x8192MB + 2048MB = 67584 MB

tapi dupada /devmemberi 804K.

Apakah itu masalahnya? Bisakah saya mengatasi /devukuran itu?

jujur
sumber
15
Apakah Anda mencoba tmpfs? Ini adalah sistem file dalam RAM, tidak perlu untuk ext2. mount -o size=16G -t tmpfs none /mnt/tmpfs
t-8ch
Itu berhasil! Terima kasih! Namun sejauh ini, tidak banyak mempercepat: Saya pikir alat yang saya gunakan untuk membangun masih menggunakan disk biasa. Saya akan meletakkan lebih banyak barang di ram disk.
Frank
3
Menempatkan alat sendiri di ramdisk seharusnya tidak membuat banyak perbedaan karena kernel akan men-cache mereka di ram.
t-8ch
1
@goldilocks Ini bukti anekdotal, tetapi ketika mengkompilasi proyek Java kami dengan Maven, ada peningkatan yang signifikan saat menggunakan ramdisk. Saya akan menebak bahwa ini lebih karena mencari waktu daripada waktu membaca.
SpellingD
1
/ dev / shm, sebenarnya / run / shm , bisa digunakan; hampir selalu ada di sana.
Camille Goudeseune

Jawaban:

78

Cara terbaik untuk membuat ram ram di linux adalah tmpfs. Ini adalah filesystem yang hidup di ram, jadi tidak perlu untuk ext2. Anda dapat membuat tmpf dengan ukuran 16Gb dengan:

mount -o size=16G -t tmpfs none /mnt/tmpfs
t-8ch
sumber
2
pada sistem saya, dengan tidak ada sama sekali di / mnt, ia mengatakan: ls: tidak dapat mengakses / mnt / tmpfs: Tidak ada file atau direktori seperti mount: mount point / mnt / tmpfs tidak ada. Apakah itu sesuatu yang perlu dikhawatirkan? Jika saya hanya mkdir / mnt / tmpfs, apakah itu mengalahkan tujuan (dengan membuat tmpfs pada disk biasa - tolong jangan nyala, saya pemula di sini).
Frank
9
Anda memerlukan mountpoint (direktori) sebagai target, jadi setelah Anda membuat direktori ini (Anda dapat menggunakan direktori apa pun, konten yang ada dibayangi) Anda dapat memasangnya dengan perintah dari jawaban.
t-8ch
1
tmpfsdapat menggunakan swap, yang mungkin tidak Anda inginkan dalam disk RAM murni.
palswim
2
@RomanSusi tmpfs adalah tipe file (lulus setelah -t). "tidak ada" adalah perangkat pendukung ("disk") yang tidak ada untuk tmpfs
t-8ch
1
Mungkin perlu dicatat bahwa menentukan ukuran adalah opsional. Standarnya setengah dari RAM. Tidak ada overhead dari menentukan ukuran yang lebih tinggi, semua yang dilakukannya adalah menetapkan batas, untuk melindungi diri Anda dari tidak sengaja menggunakan semua RAM Anda dan membunuh sistem.
sourcejedi
20

Linux sangat efisien dalam menggunakan RAM. Ada sedikit kejutan bahwa Anda melihat sedikit jika ada speedup tmpfs. Bagian terbesar untuk dibaca ke dalam memori (dan dengan demikian mampu memperlambat prosesnya) adalah alat (compiler, assembler, linker), dan dalam gondrong makemereka akan dimuat ke dalam memori pada saat startup dan tidak pernah meninggalkannya. Yang tersisa adalah membaca dalam sumber (penulisan hasil tidak akan memperlambat Anda, kecuali jika memori sangat dibatasi). Sekali lagi, file header comon akan tetap ada, hanya sumber pengguna yang perlu dibaca. Dan itu tidak mungkin lebih dari beberapa megabyte. Menciptakan RAMdisk yang besar (atau bahkan banyak menggunakan tmpfs) dapat memperlambat hal-hal dengan sangat baik (dengan membuat memori build terkendala, file pada RAMdisk atau pada tmpfs tidak dapat digunakan langsung dari sana).

vonbrand
sumber
1
Apa! Bagaimana mereka tidak bisa digunakan langsung dari sana?
Kazark
Mereka berada dalam RAM, tetapi tidak dalam format yang langsung dapat digunakan.
vonbrand
2
Benarkah! Bagaimana? (Maafkan kelambatan saya.)
Kazark
8
@ Kazark, untuk menangani executable dalam memori, digunakan struktur data khusus. Sebagai RAMdisk dan tmpfstidak biasa digunakan untuk menyimpan file yang dapat dieksekusi (RAMdisk adalah sisa dari masa lalu yang baik dari disket yang sangat lambat dan semacamnya, tmpfsadalah untuk data sementara yang rumit), tidak ada yang menganggap cukup penting untuk menambahkan peretasan jelek yang diperlukan.
vonbrand
7
Saya telah mencoba menjalankan kode rel saya dari sistem file tmpfs (RAM), dan saya tidak melihat perbedaan sama sekali. Saya benar-benar berharap untuk perbedaan yang nyata tetapi saya kecewa dengan betapa mengagumkannya linux.
Khaja Minhajuddin
6

Masalahnya adalah bahwa ukuran maksimum ramdisk, lebih khusus dari ukuran memori yang dapat diakses melalui driver ramdisk yang dikonfigurasi pada compiletime, dapat ditimpa pada boottime, tetapi tetap diperbaiki setelah kernel dimuat ke dalam memori. Nilai default mungkin diukur dalam Megabita. Jika saya ingat dengan benar memori untuk ramdisk dicadangkan tepat saat driver dimuat, semua ramdis memiliki ukuran yang sama dan ada beberapa 16 ramdis secara default. Jadi, bahkan Anda tidak menginginkan ukuran ramdisk 16G :-)

Seperti yang dinyatakan dalam jawaban lain, tmpfs adalah apa yang ingin Anda gunakan. Selanjutnya, Anda tidak akan menang banyak dengan memiliki seluruh OS Anda di ramdisk / tmpfs. Cukup salin builddir Anda ke tmpfs dan lakukan kompilasi Anda kemudian. Anda mungkin harus memastikan bahwa semua hasil sementara ditulis ke lokasi yang ada di tmpfs juga.

Bananguin
sumber
Mereka tidak benar-benar menggunakan memori apa pun sampai Anda menulis sesuatu kepada mereka. Batas waktu boot hanyalah batasnya. Bahkan setelah mengisi satu Anda dapat membebaskan memori cadangan blockdev --flushbufs.
psusi
@psusi: dapatkah Anda memberi kami informasi lebih lanjut tentang itu? Saya hanya dapat menemukan pernyataan yang menyebutkan bahwa sekali diklaim oleh memori ramdisk tidak pernah direklamasi, misalnya di Documentation/blockdev/ramdisk.txtdalam sumber kernel. Dan pada jawaban saya: file itu juga mengatakan ramdisk bertambah saat memori dikonsumsi sehingga tidak semuanya dialokasikan sekaligus.
Bananguin
Informasi seperti apa? Anda menjalankan perintah dan itu membebaskan ram, dengan asumsi Anda masih belum terpasang.
psusi
Bagaimana Anda tahu bahwa perintah itu melakukan apa yang Anda katakan itu? Halaman manualnya tidak mengkonfirmasi hal itu dan dokumentasi di pohon sumber kernel dapat dipahami untuk bertentangan dengan informasi Anda.
Bananguin
6
Saya membaca kode sumber, dan memverifikasinya dengan mencobanya.
psusi
3

Untuk membuat ram ram besar setelah boot, tanpa main-main dengan parameter kernel, ini sepertinya berhasil. Gunakan tmpfs, buat file, pasang melalui loop, dan pasang itu melalui sistem file:

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/

Mungkin sedikit penalti kinerja melalui berbagai lapisan ... tapi setidaknya itu berhasil.

pengguna39725
sumber
3

Selain tmpfsdan ramfs, opsi lain adalah /dev/ram0perangkat blokir. Pada versi Ubuntu terbaru, perangkat ini tidak ada secara default, tetapi dapat dibuat via modprobe brd.

Pendekatan ini lebih dapat diprediksi karena ia menciptakan ext4sistem file nyata dan tidak pernah melebihi batas yang Anda tentukan. Tetapi butuh lebih banyak langkah untuk mengatur, dan menggunakan RAM kurang efisien.

Menggunakan modul brd kernel (/ dev / ram0)

Untuk membuat dan menginisialisasi disk RAM 4GB:

mkdir /ramdisk

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

The rd_nrparameter menentukan berapa banyak disk RAM untuk membuat (secara default, itu menciptakan 16, yaitu /dev/ram0melalui /dev/ram15). The rd_sizeparameter ukuran dalam kilobyte . The $(( ... ))sintaks memungkinkan Anda melakukan aritmatika di shell.

Untuk membatalkan alokasi disk RAM, unmount dan lepaskan brdmodul kernel:

umount /ramdisk
modprobe -r brd

Membuat perangkat blok di dalamnya ramfs

Atau, Anda dapat membuat perangkat blok di dalam 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

The truncatePerintah menciptakan sebuah file kosong dari ukuran tertentu sedemikian rupa sehingga diinisialisasi (yaitu mengkonsumsi memori) on-demand.

Untuk membatalkan alokasi disk RAM, umount dan hapus gambar disk:

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

Perbandingan dengan tmpfsdanramfs

Meskipun tmpfsdan ramfslebih efisien daripada menggunakan perangkat blok, di bawah ini adalah beberapa kelemahannya.

tmpfsdapat bertukar ke disk. Ini lebih efisien, tetapi mungkin ada saatnya Anda menginginkan disk RAM murni:

  • File yang Anda kerjakan sensitif (misalnya file dari partisi yang dienkripsi).
  • Anda melakukan pengujian kinerja dan Anda tidak ingin disk I / O menjadi faktor (waktu penulisan SSD dapat sangat bervariasi).
  • Anda membongkar file besar dan Anda tidak ingin aus SSD Anda.

ramfsmudah untuk diatur, mengambil kembali ruang setelah Anda menghapus file, dan menggunakan RAM lebih efisien (sistem tidak buffer file karena tahu mereka ada dalam RAM). Tetapi memiliki kelemahan dan kejutannya sendiri:

  • The dfutilitas tidak melaporkan penggunaan ruang:

    root@cello-linux:~# df -h /ramdisk
    Filesystem      Size  Used Avail Use% Mounted on
    ramfs              0     0     0    - /ramdisk
    
  • Tidak ada parameter batas ukuran. Jika Anda menaruh terlalu banyak di ramdisk, sistem Anda akan hang.

  • File yang jarang dapat menjadi tidak jelas ketika Anda tidak mengharapkannya. Pagi ini, saya menyalin gambar VM (150G, tetapi 49G digunakan pada disk) ke ramfs(saya punya 128G RAM). Itu berhasil. Tapi ketika saya disalin dari yang ramfske tujuan, sistem saya menjadi tidak responsif. The cputilitas rupanya mengisi lubang di membaca , tetapi tidak pada menulis.

Keduanya tmpfsdan ramfsmungkin berperilaku berbeda dari ext4sistem file nyata . Membuat perangkat blok dalam RAM dan menginisialisasi dengan ext4menghindari ini.

Untuk perbandingan yang lebih mendalam: https://www.kernel.org/doc/Documentation/filesystems/ramfs-rootfs-initramfs.txt

Joey Adams
sumber
1

OP jumlah RAM dinyatakan dalam MB. Jadi yang perlu Anda masukkan di sana adalah 16384. Dan kemudian voila Anda akan berbisnis.

CyberWolf64
sumber
1
Nggak. "Jika ukuran fs tidak memiliki akhiran, itu ditafsirkan sebagai kekuatan dua kilobyte." - manmkfs.ext2
sourcejedi
1

Anda dapat memasang ramfssistem file, menyalin proyek Anda ke dalamnya dan bekerja dari sana. Ini menjamin file input Anda dimuat ke RAM, dan itu tidak akan dibaca kembali dari drive disk yang jauh lebih lambat. Namun ketika Anda menemukan, ini umumnya bukan strategi yang berguna. Anda sudah mendapatkan manfaat yang sama persis.

Ramfs adalah sistem file yang sangat sederhana yang mengekspor mekanisme caching disk Linux (cache halaman dan cache gigi) sebagai sistem file berbasis RAM yang dapat diubah secara dinamis.

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

Anda sudah bisa percaya file input Anda di-cache dalam RAM, saat pertama kali dibaca. File output Anda juga di-cache, sehingga Anda tidak menunggu mereka dituliskan ke disk.

Tidak ada batasan artifisial tentang seberapa banyak Anda dapat melakukan cache, berapa lama cache itu disimpan, dll. Cache hanya mulai turun begitu Anda telah mengisi RAM. Cache yang dibuang lebih dulu dipilih oleh algoritma yang sangat rumit. Perkiraan pertama, adalah kami menggambarkannya sebagai Paling Baru Digunakan. Lihat Algoritma penggantian halaman apa yang digunakan dalam kernel Linux untuk cache file OS?

Perhatikan bahwa editor teks Anda akan secara eksplisit fsync()menyimpan file ke disk.

Jika Anda menjalankan tes program yang melibatkan fsync(), menjalankan ini dalam sistem file seperti ramfsmungkin mempercepat mereka. Strategi lain adalah mencoba dan menonaktifkan fsync()dengan eatmydata/ nosync.so.

Beberapa sistem operasi lain mungkin memiliki batasan spesifik, yang dapat dilewati menggunakan ramdisk. Pada salah satu ujung, kurangnya setiap file caching sebabnya ramdisks yang populer di DOS .

tmpfs

tmpfsberfungsi sama dengan ramfs, kecuali bahwa itu dapat menggunakan ruang swap jika Anda memilikinya. Yaitu jika Anda membutuhkan RAM untuk sesuatu yang lain, algoritma Least Baru Digunakan dapat memilih blok data dari tmpfs dan menukar mereka ke disk.

Kebanyakan orang tetap dengan tmpfs, karena itu juga memungkinkan Anda membatasi ukuran total, dan menunjukkan ruang yang digunakan dengan benar misalnya dalam dfperintah. Saya tidak yakin mengapa perbedaan ini ada. Batas ukuran tmpfsmelindungi Anda dari secara tidak sengaja mengisi seluruh RAM Anda dan pada dasarnya mematikan sistem Anda. Ini default untuk setengah dari RAM Anda.

Alasan lain mengapa menulis bisa melambat

Di atas adalah penyederhanaan yang disesuaikan dengan kasus Anda. File menulis ke dalam kasus Anda tidak perlu menunggu disk. Namun ada beberapa kasus penulisan yang dilakukan. Lihat posting blog yang bagus Mengapa penulisan buffer terkadang terhenti . Kasus yang paling mengejutkan adalah perubahan terbaru ke Linux yang disebut "stable page wrote".

sourcejedi
sumber