Tworzenie dysku RAM w systemie Linux


70

Mam maszynę z 62 GB pamięci RAM i bagażnikiem, który ma tylko 7 GB, więc pomyślałem, że utworzę dysk RAM i tam skompiluję. Nie jestem ekspertem od Linuksa. Znalazłem instrukcje w Internecie, aby utworzyć dysk RAM:

mkfs -q /dev/ram1 8192

ale zmieniłem 8192 na 16777216, próbując przydzielić 16 GB pamięci RAM.

Wystąpił następujący błąd:

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

W tym momencie przestraszyłem się i zwolniono mnie za kaucją.

sudo dmidecode --type 17 | grep Size

przedstawia

8x8192MB + 2048MB = 67584 MB

ale duon /devdaje 804K.

Czy to jest problem? Czy mogę pokonać ten /devrozmiar?


15
Czy próbowałeś tmpfs? Jest to system plików w pamięci RAM, nie wymaga ext2. mount -o size=16G -t tmpfs none /mnt/tmpfs
t-8ch

To się udało! Dzięki! Ale jak dotąd niewiele przyspieszenia: myślę, że narzędzia, których używam do budowania, nadal używają zwykłego dysku. Umieszczę więcej rzeczy na dysku RAM.
Frank

3
Samo umieszczenie narzędzi na ramdysku nie powinno mieć większego znaczenia, ponieważ jądro i tak je buforuje w pamięci RAM.
t-8ch

1
@goldilocks Jest to anegdotyczny dowód, ale podczas kompilowania naszych projektów Java z Maven istnieje znaczące przyspieszenie przy użyciu ramdysku. Sądzę jednak, że jest to więcej ze względu na czas poszukiwania niż czas czytania.
SpellingD

1
/ dev / shm, właściwie / run / shm , można użyć; prawie zawsze tam jest.
Camille Goudeseune

Odpowiedzi:


78

Najlepszym sposobem utworzenia dysku RAM w systemie Linux jest tmpfs. Jest to system plików żyjący w pamięci RAM, więc nie ma potrzeby używania ext2. Możesz utworzyć tmpfs o wielkości 16 Gb za pomocą:

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

2
w moim systemie, z niczym w / mnt, jest napisane: ls: nie można uzyskać dostępu / mnt / tmpfs: Brak takiego pliku lub katalogu zamontowanie: punkt podłączenia / mnt / tmpfs nie istnieje. Czy to coś, o co warto się martwić? Jeśli po prostu użyję mkdir / mnt / tmpfs, czy to nie uda się osiągnąć celu (tworząc tmpfs na zwykłym dysku - proszę nie płonąć, jestem tutaj początkującym).
Frank

9
Potrzebujesz punktu montowania (katalogu) jako celu, więc po utworzeniu tego katalogu (możesz użyć dowolnego katalogu, istniejące treści są ukryte), możesz zamontować go za pomocą polecenia z odpowiedzi.
t-8ch

1
tmpfsmoże użyć swap, którego prawdopodobnie nie chcesz na czystym dysku RAM.
palswim

2
@RomanSusi tmpfs to typ pliku (przekazywany po -t). „none” to urządzenie podkładowe („dysk”), które nie istnieje dla tmpfs
t-8ch

1
Warto zauważyć, że określenie rozmiaru jest opcjonalne. Domyślnie jest to połowa pamięci RAM. Określenie większego rozmiaru nie wiąże się z narzutami, wystarczy ustawić ograniczenie, aby uchronić się przed przypadkowym użyciem całej pamięci RAM i zabiciem systemu.
sourcejedi

20

Linux jest bardzo wydajny w korzystaniu z pamięci RAM. Nic dziwnego, że nie widzisz żadnego przyspieszenia tmpfs. Największymi fragmentami do odczytu do pamięci (a tym samym zdolnymi do spowolnienia procesu) są narzędzia (kompilator, asembler, linker), i w długim makeczasie zostaną one załadowane do pamięci podczas uruchamiania i nigdy jej nie opuszczą. Pozostaje czytanie w źródle (zapisanie wyników nie spowolni cię, chyba że poważnie ograniczy pamięć). Ponownie, wspólne pliki nagłówkowe pozostaną, tylko źródło użytkownika będzie wymagało odczytu. Jest mało prawdopodobne, że będzie to więcej niż kilka megabajtów. Utworzenie dużego RAMdisk (lub nawet dużo użycia tmpfs) może bardzo dobrze spowolnić (poprzez ograniczenie pamięci kompilacji, pliki na RAMdisk lub na tmpfs nie mogą do użycia bezpośrednio stamtąd).


1
Co! Jak nie można ich używać bezpośrednio stamtąd?
Kazark

Są w pamięci RAM, ale nie w formacie, który można bezpośrednio wykorzystać.
vonbrand

2
Naprawdę! Jak to? (Przepraszam, moja powolność.)
Kazark

8
@Kazark, do obsługi plików wykonywalnych w pamięci stosowane są specjalne struktury danych. Ponieważ dyski RAM i tmpfsnie są powszechnie używane do przechowywania plików wykonywalnych (dyski RAM są pozostałością po starych dobrych czasach tmpfswyjątkowo trudnych dyskietek itp., Ponieważ są przeznaczone na surowe dane tymczasowe), nikt nie uznał za wystarczająco ważne, aby dodać wymagane brzydkie włamania.
vonbrand

7
Próbowałem uruchomić mój kod szynowy z systemu plików tmpfs (RAM) i nie zauważyłem żadnej różnicy. Naprawdę liczyłem na zauważalną różnicę, ale byłem rozczarowany niesamowitym linuksem.
Khaja Minhajuddin

6

Problem polega na tym, że maksymalny rozmiar ramdysku, a dokładniej rozmiaru pamięci, do którego można uzyskać dostęp za pośrednictwem sterownika ramdysku, jest konfigurowany w czasie kompilacji, może zostać zastąpiony w czasie rozruchu, ale pozostaje niezmienny po załadowaniu jądra do pamięci. Wartość domyślna jest prawdopodobnie mierzona w megabajtach. Jeśli dobrze pamiętam, pamięć ramdysku jest zarezerwowana zaraz po załadowaniu sterownika, wszystkie dyski mają ten sam rozmiar i domyślnie jest około 16 ramdysków. Więc nawet nie chcesz ramdysku wielkości 16G :-)

Jak stwierdzono w drugiej odpowiedzi, tmpfs jest tym, czego chcesz użyć. Co więcej, nie wygrasz dużo, mając cały system operacyjny na ramdisk / tmpfs. Po prostu skopiuj swój builddir do tmpfs i skompiluj go. Może być konieczne upewnienie się, że wszystkie wyniki tymczasowe zostaną zapisane również w lokalizacji znajdującej się w tmpfs.


W rzeczywistości nie używają pamięci, dopóki do nich nie napiszesz. Limit czasu rozruchu to tylko limit. Nawet po wypełnieniu jednego możesz zwolnić pamięć blockdev --flushbufs.
psusi

@psusi: czy możesz podać nam więcej informacji na ten temat? Mogę znaleźć tylko wzmianki o tym, że raz zajęte przez pamięć ramdysku nigdy nie są odzyskiwane, np. W Documentation/blockdev/ramdisk.txtźródłach jądra. I na moją odpowiedź: ten plik mówi również, że ramdysk rośnie, gdy pamięć jest zużywana, więc nie wszystkie są przydzielane jednocześnie.
Bananguin

Jakie informacje? Uruchamiasz polecenie i uwalnia ono barana, zakładając, że nadal nie masz go zamontowanego.
psusi

Skąd wiesz, że polecenie wykonuje to, co mówisz? Strona podręcznika tego nie potwierdza, a dokumentacja w drzewie źródeł jądra może być rozumiana jako sprzeczna z twoimi informacjami.
Bananguin

6
Przeczytałem kod źródłowy i zweryfikowałem go, próbując go.
psusi

3

Aby zrobić duży dysk RAM po rozruchu, bez bałaganu z parametrami jądra, wydaje się, że to działa. Użyj tmpfs, utwórz plik, zamontuj go za pomocą pętli i zamontuj za pomocą systemu plików:

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/

Prawdopodobnie trochę obniżenia wydajności przez wiele różnych warstw ... ale przynajmniej działa.


3

Poza tym tmpfsi ramfs, innym rozwiązaniem jest /dev/ram0urządzenie blokowe. W najnowszych wersjach Ubuntu to urządzenie domyślnie nie istnieje, ale można je utworzyć za pomocą modprobe brd.

To podejście jest bardziej przewidywalne, ponieważ tworzy prawdziwy ext4system plików i nigdy nie przekracza określonego limitu. Ale konfiguracja wymaga więcej kroków i mniej wydajnie wykorzystuje pamięć RAM.

Korzystanie z modułu jądra brd (/ dev / ram0)

Aby utworzyć i zainicjować dysk RAM o pojemności 4 GB:

mkdir /ramdisk

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

Ten rd_nrparametr określa liczbę dysków RAM do utworzenia (domyślnie tworzy 16, tzn. /dev/ram0Poprzez /dev/ram15). rd_sizeParametrem jest rozmiar w kilobajtach . $(( ... ))Składnia pozwala zrobić arytmetyczne w powłoce.

Aby zwolnić dysk RAM, odmontuj go i usuń brdmoduł jądra:

umount /ramdisk
modprobe -r brd

Tworzenie wewnątrz urządzenia blokowego ramfs

Alternatywnie możesz utworzyć urządzenie blokowe wewnątrz 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

truncatePolecenie tworzy pusty plik o danej wielkości tak, że jest inicjowane (tj zużywa pamięci) na żądanie.

Aby zwolnić dysk RAM, zamontuj go i usuń obraz dysku:

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

Porównanie z tmpfsiramfs

Chociaż tmpfsi ramfssą bardziej wydajne niż korzystanie z urządzenia blokowego, poniżej przedstawiono niektóre ich wady.

tmpfsmoże zamienić na dysk. Jest to bardziej wydajne, ale może się zdarzyć, że potrzebujesz czystego dysku RAM:

  • Pliki, z którymi pracujesz, są wrażliwe (np. Pliki z zaszyfrowanej partycji).
  • Robisz testy wydajności i nie chcesz, aby dysk I / O był czynnikiem (czasy zapisu SSD mogą się bardzo różnić).
  • Rozpakowujesz duży plik i nie chcesz zużywać dysku SSD.

ramfsjest łatwy w konfiguracji, zwalnia miejsce po usunięciu plików i bardziej efektywnie wykorzystuje pamięć RAM (system nie buforuje plików, ponieważ wie, że są one w pamięci RAM). Ale ma swoje wady i niespodzianki:

  • dfNarzędzie nie zgłasza wykorzystanie miejsca:

    root@cello-linux:~# df -h /ramdisk
    Filesystem      Size  Used Avail Use% Mounted on
    ramfs              0     0     0    - /ramdisk
    
  • Nie ma parametru limitu rozmiaru. Jeśli włożysz zbyt dużo w ramdysk, system się zawiesi.

  • Pliki rzadkie mogą stać się rzadkie, gdy najmniej się tego spodziewasz. Dziś rano skopiowałem obraz maszyny wirtualnej (150G, ale 49G używany na dysku) na ramfs(mam 128G pamięci RAM). To się udało. Ale kiedy kopiowane zramfs do miejsca przeznaczenia, mój system stał się odpowiadać. cpNarzędzie widocznie wypełnione otwory na odczyt , ale nie przy zapisie.

Zarówno tmpfsi ramfsmogą zachowywać się inaczej niż w prawdziwym ext4systemie. Utworzenie urządzenia blokowego w pamięci RAM i zainicjowanie go za pomocą ext4pozwala tego uniknąć.

Bardziej szczegółowe porównanie: https://www.kernel.org/doc/Documentation/filesystems/ramfs-rootfs-initramfs.txt


1

OP ilość pamięci RAM jest wyrażona w MB. Więc wszystko, co musisz tam wpisać, to 16384. A potem voila, będziesz w interesach.


1
Nie. „Jeśli rozmiar fs nie ma przyrostka, jest interpretowany jako moc dwóch kilobajtów”. - człowiekmkfs.ext2
sourcejedi

1

Możesz zamontować ramfssystem plików, skopiować do niego swój projekt i stamtąd pracować. Gwarantuje to, że twoje pliki wejściowe są ładowane do pamięci RAM i nie będą ponownie czytane z dużo wolniejszej stacji dysków. Jak jednak odkryłeś, ogólnie nie jest to przydatna strategia. Otrzymujesz już dokładnie taką samą korzyść.

Ramfs to bardzo prosty system plików, który eksportuje mechanizmy buforowania dysku Linux (pamięć podręczna stron i pamięć podręczna dentry) jako dynamicznie skalowalny system plików oparty na pamięci RAM.

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

Możesz już ufać, że pliki wejściowe są buforowane w pamięci RAM przy pierwszym czytaniu. Pliki wyjściowe są również buforowane, dzięki czemu nie trzeba czekać na ich zapisanie na dysku.

Nie ma sztucznego limitu ilości pamięci podręcznej, czasu pozostawania w pamięci podręcznej itp. Pamięć podręczna zaczyna być zrzucana dopiero po zapełnieniu pamięci RAM. To, która pamięć podręczna jest upuszczana jako pierwsza, jest wybierane przez przerażająco opracowane algorytmy. Pierwszym przybliżeniem jest to, że opisujemy to jako „ostatnio używane”. Zobacz Jakie algorytmy zastępowania stron są używane w jądrze systemu Linux do buforowania plików systemu operacyjnego?

Zauważ, że twój edytor tekstu będzie jawnie fsync()zapisywał pliki na dysku.

Jeśli uruchomisz testy programu, który obejmuje fsync(), uruchomienie ich w systemie plików, takim jak, ramfsmoże je przyspieszyć. Inną strategią jest próba wyłączenia za fsync()pomocą eatmydata/ nosync.so.

Niektóre inne systemy operacyjne mogą mieć określone ograniczenia, które można obejść za pomocą ramdysku. Na jednym końcu, brak jakichkolwiek buforowania plików jest dlaczego RAM dyski były popularne na DOS .

tmpfs

tmpfsdziała tak samo ramfs, z tym wyjątkiem, że może używać przestrzeni wymiany, jeśli taką masz. To znaczy, jeśli potrzebujesz pamięci RAM na coś innego, algorytmy Najmniej ostatnio używane mogą wybierać bloki danych z tmpfs i zamieniać je na dysk.

Większość ludzi trzyma się tmpfs, ponieważ pozwala to również na ograniczenie całkowitego rozmiaru i pokazuje prawidłowe wykorzystanie miejsca, np. W dfpoleceniu. Nie jestem pewien, dlaczego ta różnica istnieje. Ograniczenie rozmiaru tmpfschroni przed przypadkowym zapełnieniem całej pamięci RAM i zabiciem systemu. Domyślnie połowa pamięci RAM.

Inne powody, dla których zapisy mogą spowolnić

Powyższe jest uproszczeniem dostosowanym do twojego przypadku. Zapisywanie do plików w twoim przypadku nie powinno wymagać czekania na dysk. Są jednak przypadki, w których tak się dzieje. Zobacz doskonały post na blogu Dlaczego buforowane zapisy są czasami blokowane . Najbardziej zaskakującym przypadkiem jest niedawna zmiana w Linuksie o nazwie „stabilne zapisywanie stron”.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.