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 du
on /dev
daje 804K
.
Czy to jest problem? Czy mogę pokonać ten /dev
rozmiar?
mount -o size=16G -t tmpfs none /mnt/tmpfs
Odpowiedzi:
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ą:
źródło
tmpfs
może użyć swap, którego prawdopodobnie nie chcesz na czystym dysku RAM.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ługimmake
czasie 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życiatmpfs
) może bardzo dobrze spowolnić (poprzez ograniczenie pamięci kompilacji, pliki na RAMdisk lub natmpfs
nie mogą do użycia bezpośrednio stamtąd).źródło
tmpfs
nie są powszechnie używane do przechowywania plików wykonywalnych (dyski RAM są pozostałością po starych dobrych czasachtmpfs
wyją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.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.
źródło
blockdev --flushbufs
.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.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:
Prawdopodobnie trochę obniżenia wydajności przez wiele różnych warstw ... ale przynajmniej działa.
źródło
Poza tym
tmpfs
iramfs
, innym rozwiązaniem jest/dev/ram0
urzą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
ext4
system 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:
Ten
rd_nr
parametr określa liczbę dysków RAM do utworzenia (domyślnie tworzy 16, tzn./dev/ram0
Poprzez/dev/ram15
).rd_size
Parametrem jest rozmiar w kilobajtach .$(( ... ))
Składnia pozwala zrobić arytmetyczne w powłoce.Aby zwolnić dysk RAM, odmontuj go i usuń
brd
moduł jądra:Tworzenie wewnątrz urządzenia blokowego
ramfs
Alternatywnie możesz utworzyć urządzenie blokowe wewnątrz
ramfs
:truncate
Polecenie 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:
Porównanie z
tmpfs
iramfs
Chociaż
tmpfs
iramfs
są bardziej wydajne niż korzystanie z urządzenia blokowego, poniżej przedstawiono niektóre ich wady.tmpfs
może zamienić na dysk. Jest to bardziej wydajne, ale może się zdarzyć, że potrzebujesz czystego dysku RAM:ramfs
jest ł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:df
Narzędzie nie zgłasza wykorzystanie miejsca: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ć.cp
Narzędzie widocznie wypełnione otwory na odczyt , ale nie przy zapisie.Zarówno
tmpfs
iramfs
mogą zachowywać się inaczej niż w prawdziwymext4
systemie. Utworzenie urządzenia blokowego w pamięci RAM i zainicjowanie go za pomocąext4
pozwala tego uniknąć.Bardziej szczegółowe porównanie: https://www.kernel.org/doc/Documentation/filesystems/ramfs-rootfs-initramfs.txt
źródło
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.
źródło
mkfs.ext2
Możesz zamontować
ramfs
system 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ść.- 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,ramfs
może je przyspieszyć. Inną strategią jest próba wyłączenia zafsync()
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
tmpfs
działa tak samoramfs
, 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. Wdf
poleceniu. Nie jestem pewien, dlaczego ta różnica istnieje. Ograniczenie rozmiarutmpfs
chroni 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”.
źródło