Nie martwię się ani o użycie pamięci RAM (ponieważ mam już dość), ani o utratę danych w przypadku przypadkowego wyłączenia (ponieważ moja moc jest podtrzymywana, system jest niezawodny, a dane nie są krytyczne). Ale dużo przetwarzam pliki i przydałby mi się wzrost wydajności.
Dlatego chciałbym skonfigurować system tak, aby używał więcej pamięci RAM do buforowania odczytu i zapisu systemu plików, aby pobierać pliki agresywnie (np. Z wyprzedzeniem odczytaj cały plik, do którego aplikacja ma dostęp, jeśli plik ma rozsądny rozmiar lub przynajmniej w przeciwnym razie przeczytaj duży fragment) i rzadziej opróżniaj bufory zapisu. Jak to osiągnąć (czy to możliwe)?
Używam systemów plików ext3 i NTFS (często używam NTFS!) Z XUbuntu 11.10 x86.
sudo mount -o ro,nobarrier /path/to/mountpoint
lub dostosuj,/etc/fstab
aby uwzględnićnobarrier
system plików, który chcesz poświęcić w celu poprawy wydajności. Jeśli jednak urządzenie pamięci ma wewnętrzną baterię, taką jak seria Intel 320 SSD, korzystanie z niegonobarrier
nie powoduje utraty danych.Odpowiedzi:
Ogólnie rzecz biorąc, poprawa wydajności pamięci podręcznej dysku jest czymś więcej niż tylko zwiększeniem wielkości pamięci podręcznej systemu plików, chyba że cały system mieści się w pamięci RAM. W takim przypadku należy użyć napędu RAM (
tmpfs
jest to dobre, ponieważ w niektórych przypadkach umożliwia powrót do dysku) do przechowywania w środowisku wykonawczym (i być może skrypt initrd do kopiowania systemu z pamięci na dysk RAM podczas uruchamiania).Nie wiesz, czy twoim urządzeniem pamięci jest dysk SSD czy HDD. Oto, co dla mnie działa (w moim przypadku
sda
jest to dysk twardy zamontowany w,/home
asdb
dysk SSD zamontowany w/
).Najpierw zoptymalizuj część load-stuff-from-storage-to-cache:
Oto moja konfiguracja dysku twardego (upewnij się, że AHCI + NCQ jest włączony w systemie BIOS, jeśli masz przełączniki):
Warto zauważyć, że przypadek dysku twardego jest wysoki
fifo_expire_async
(zwykle zapis) i długi,slice_sync
aby umożliwić pojedynczemu procesowi uzyskanie wysokiej przepustowości (ustawslice_sync
niższą liczbę, jeśli trafisz na sytuacje, w których wiele procesów czeka równolegle na niektóre dane z dysku). Jestslice_idle
to zawsze kompromis w przypadku dysków twardych, ale ustawienie go gdzieś w zakresie 3-20 powinno być w porządku, w zależności od użycia dysku i oprogramowania układowego dysku. Wolę celować na niskie wartości, ale ustawienie go zbyt nisko zniszczy Twoją przepustowość. Toquantum
ustawienie wydaje się mieć duży wpływ na przepustowość, ale staraj się utrzymywać ją na jak najniższym poziomie, aby utrzymać opóźnienie na rozsądnym poziomie. Ustawieniequantum
zbyt niskiej wartości zniszczy przepustowość. Wartości w zakresie 3-8 wydają się dobrze współpracować z dyskami twardymi. Najgorsze opóźnienie dla odczytu to (quantum
*slice_sync
) + (slice_async_rq
*slice_async
) ms, jeśli poprawnie zrozumiałem zachowanie jądra. Asynchronizacja jest najczęściej używana przez zapisy, a ponieważ chcesz opóźnić zapis na dysk, ustaw zarównoslice_async_rq
islice_async
bardzo niskie liczby. Jednak ustawienieslice_async_rq
zbyt niskiej wartości może opóźnić odczyty, ponieważ zapisy nie mogą być dłużej opóźniane po odczytach. Mój config spróbuje zapisać danych na dysku co najwyżej po 10 sekundach po dane zostały przekazane do jądra, ale ponieważ można tolerować utratę danych dotyczących strat mocy również zestawfifo_expire_async
do3600000
powiedzieć, że 1 godzina jest w porządku za opóźnienie na dysku. Po prostu utrzymujslice_async
niski poziom, ponieważ w przeciwnym razie możesz uzyskać duże opóźnienie odczytu.hdparm
Komenda jest wymagane, aby zapobiec AAM od zabijania wiele spektaklu, który pozwala AHCI + NCQ. Jeśli dysk robi zbyt dużo hałasu, pomiń to.Oto moja konfiguracja dysku SSD (seria Intel 320):
Tutaj warto zauważyć niskie wartości dla różnych ustawień wycinków. Najważniejszym ustawieniem dla dysku SSD jest to,
slice_idle
które musi być ustawione na 0-1. Ustawienie go na zero przenosi wszystkie decyzje dotyczące porządkowania do natywnego NCQ, a ustawienie go na 1 pozwala jądru na porządkowanie żądań (ale jeśli NCQ jest aktywne, sprzęt może częściowo zastąpić porządkowanie jądra). Przetestuj obie wartości, aby zobaczyć, czy widzisz różnicę. Intel serii 320, wydaje się, że ustawienieslide_idle
do0
daje najlepszą wydajność, ale ustawienie go1
daje najlepszą (najniższy) ogólną latencję.Aby uzyskać więcej informacji o tych tunach, zobacz http://www.linux-mag.com/id/7572/ .
Teraz, gdy skonfigurowaliśmy jądro do ładowania rzeczy z dysku do pamięci podręcznej z rozsądną wydajnością, nadszedł czas, aby dostosować zachowanie pamięci podręcznej:
Według przeprowadzonych przeze mnie testów nie zawracałbym sobie głowy ustawieniem odczytu
blockdev
. Domyślne ustawienia jądra są w porządku.Ustaw system tak, aby wolał zamieniać dane pliku niż kod aplikacji (nie ma to znaczenia, jeśli masz wystarczającą ilość pamięci RAM, aby utrzymać cały system plików i cały kod aplikacji oraz całą pamięć wirtualną przydzieloną przez aplikacje w pamięci RAM). Zmniejsza to opóźnienie przełączania między różnymi aplikacjami w porównaniu z opóźnieniem dostępu do dużych plików z jednej aplikacji:
Jeśli wolisz przechowywać aplikacje prawie zawsze w pamięci RAM, możesz ustawić to na 1. Jeśli ustawisz to na zero, jądro nie będzie w ogóle zamieniać, chyba że jest to absolutnie konieczne dla uniknięcia OOM. Jeśli masz ograniczoną pamięć i pracujesz z dużymi plikami (np. Edycja wideo HD), warto ustawić tę wartość na 100.
Ja obecnie (2017) wolę w ogóle nie zamieniać, jeśli masz wystarczającą ilość pamięci RAM. Brak wymiany zwykle powoduje utratę 200-1000 MB pamięci RAM na długo działającym komputerze stacjonarnym. Jestem gotów poświęcić tyle, aby uniknąć opóźnień w najgorszym przypadku (zamiana kodu aplikacji, gdy pamięć RAM jest pełna). W praktyce oznacza to, że wolę OOM Killera niż zamianę. Jeśli zezwolisz / potrzebujesz zamiany, możesz też chcieć zwiększyć
/proc/sys/vm/watermark_scale_factor
, aby uniknąć opóźnień. Sugerowałbym wartości od 100 do 500. Możesz rozważyć to ustawienie jako zamianę wykorzystania procesora na mniejsze opóźnienia wymiany. Domyślnie jest to 10, a maksymalna możliwa to 1000. Wyższa wartość powinna (zgodnie z dokumentacją jądra ) skutkować większym zużyciem procesora dlakswapd
procesów i niższym całkowitym opóźnieniem zamiany.Następnie powiedz jądru, aby wolało utrzymywać hierarchię katalogów w pamięci nad zawartością pliku na wypadek, gdyby część pamięci RAM musiała zostać zwolniona (ponownie, jeśli wszystko mieści się w pamięci RAM, to ustawienie nic nie robi):
Oprawa
vfs_cache_pressure
zbyt niska wartość ma sens, ponieważ w większości przypadków jądro musi znać strukturę katalogów, zanim będzie mogło użyć zawartości pliku z pamięci podręcznej, a zbyt szybkie opróżnienie pamięci podręcznej katalogu sprawi, że pamięć podręczna plików będzie prawie bezwartościowa. Zastanów się nad przejściem do 1 z tym ustawieniem, jeśli masz dużo małych plików (mój system ma około 150 000 zdjęć o rozdzielczości 10 megapikseli i liczy się jako system „dużo małych plików”). Nigdy nie ustawiaj go na zero lub struktura katalogów jest zawsze przechowywana w pamięci, nawet jeśli w systemie kończy się pamięć. Ustawienie tej dużej wartości jest sensowne tylko wtedy, gdy masz tylko kilka dużych plików, które są ciągle odczytywane ponownie (ponownie, przykładowo, edycja wideo HD bez wystarczającej ilości pamięci RAM). Oficjalna dokumentacja jądra mówi, że „Wyjątek: jeśli masz naprawdę ogromną liczbę plików i katalogów i rzadko dotykasz / odczytujesz / wyświetlasz listę, wszystkie pliki
vfs_cache_pressure
powyżej 100 mogą być mądre. Dotyczy to tylko sytuacji, gdy nie masz wystarczającej ilości pamięci RAM i nie możesz utrzymać całej struktury katalogów w pamięci RAM, a nadal masz wystarczającą ilość pamięci RAM do normalnej pamięci podręcznej plików i procesów (np. Serwer plików dla całej firmy z dużą ilością zawartości archiwalnej). Jeśli uważasz, że musisz zwiększyćvfs_cache_pressure
powyżej 100, biegniesz bez wystarczającej ilości pamięci RAM. Zwiększenievfs_cache_pressure
może pomóc, ale jedynym prawdziwym rozwiązaniem jest uzyskanie większej ilości pamięci RAM. Povfs_cache_pressure
ustawiony na dużą liczbę poświęca średnią wydajność na posiadanie więcej stabilną wydajność ogólna (czyli można uniknąć naprawdę złe zachowanie najgorszy przypadek, ale mamy do czynienia z gorszą ogólną wydajność).Na koniec powiedz jądru, aby używało do 99% pamięci RAM jako pamięci podręcznej dla zapisów i poinstruuj jądro, aby używało do 50% pamięci RAM przed spowolnieniem procesu pisania (domyślnie
dirty_background_ratio
jest to10
). Ostrzeżenie: osobiście nie zrobiłbym tego, ale twierdziłeś, że masz wystarczającą ilość pamięci RAM i jesteś gotów stracić dane.I powiedz, że opóźnienie zapisu 1h jest w porządku, aby nawet zacząć zapisywać rzeczy na dysku (ponownie, nie zrobiłbym tego):
Jeśli umieścisz je wszystkie
/etc/rc.local
i na końcu dołączasz, wszystko będzie w pamięci podręcznej jak najszybciej po starcie (zrób to tylko, jeśli twój system plików naprawdę pasuje do pamięci RAM):Lub nieco prostsza alternatywa, która może działać lepiej (pamięć tylko
/home
i/usr
wyłącznie to zrobić jeśli/home
i/usr
naprawdę zmieścić się w pamięci RAM):źródło
Po pierwsze, NIE zalecam dalszego korzystania z NTFS, ponieważ implementacja NTFS w Linuksie będzie w dowolnym momencie powodowała problemy z wydajnością i bezpieczeństwem.
Istnieje kilka rzeczy, które możesz zrobić:
ext4
lubbtrfs
bfq
preload
systemd
wstępne ładowanie podczas uruchamianiaMoże chcesz spróbować :-)
źródło
btrfs
jest to ostatnio zaprojektowany system plików, unikałbym tego, gdyby wymagana była wydajność. Mamy już działa inaczej identycznych systemów zbtrfs
iext4
systemów plików iext4
wygrywa w realnym świecie z dużym marginesem (btrfs
zdaje się wymagać około 4x czasu procesora naext4
potrzeby dla tego samego poziomu wydajności i powoduje więcej operacji dyskowych za pomocą jednego polecenia logicznego). W zależności od obciążenia, sugerowałbymext4
,jfs
lubxfs
dla każdej pracy wymagającej wydajności.Czytaj dalej:
W systemach 32-bitowych:
W systemach 64-bitowych:
Napisz za cache:
Spowoduje to wykorzystanie do 100% wolnej pamięci jako pamięci podręcznej zapisu.
Lub możesz wyjść na całość i użyć tmpfs. Jest to istotne tylko, jeśli masz wystarczającą ilość pamięci RAM. Włóż to
/etc/fstab
. Zamień 100G na ilość fizycznej pamięci RAM.Następnie:
Następnie użyj / mnt / tmpfs.
źródło
Możesz ustawić rozmiar odczytu z wyprzedzeniem
blockdev --setra sectors /dev/sda1
, gdzie sektory to żądany rozmiar w sektorach 512-bajtowych.źródło
Moje ustawienie zabójcy jest bardzo proste i bardzo skuteczne:
Wyjaśnienie z dokumentacji jądra :
vfs_cache_pressure
w 2000 roku powoduje, że większość obliczeń odbywa się w pamięci RAM i bardzo późne zapisywanie na dysku.źródło
vfs_cache_pressure
zbyt wysokiego (uważam za2000
zbyt wysokie) spowoduje niepotrzebny dostęp do dysku nawet dla prostych rzeczy, takich jak listy katalogów, które powinny łatwo zmieścić się w pamięci podręcznej. Ile masz pamięci RAM i co robisz z systemem? Jak napisałem w odpowiedzi, użycie wysokiej wartości dla tego ustawienia ma sens np. Przy edycji wideo HD z ograniczoną pamięcią RAM.Nie związane z buforowaniem zapisu, ale związane z zapisami:
W przypadku systemu ext4 można całkowicie wyłączyć rejestrowanie
Zmniejszy to liczbę zapisów na dysku dla poszczególnych aktualizacji, ale może spowodować, że system plików będzie niespójny po nieoczekiwanym zamknięciu, wymagając fsck lub gorzej.
Aby zatrzymać odczytywanie dysku z wyzwalaczy zapisów dysku:
Montuj z opcją relatime lub noatime
Podczas odczytywania pliku metadane „ostatniego dostępu” dla tego pliku są zwykle aktualizowane. Ta
noatime
opcja wyłączy to zachowanie. Zmniejsza to niepotrzebne zapisy na dysku, ale nie będziesz już mieć tych metadanych. Niektóre dystrybucje (np. Manjaro) przyjęły to ustawienie domyślne na wszystkich partycjach (prawdopodobnie w celu zwiększenia żywotności wcześniejszych dysków SSD).relatime
rzadziej aktualizuje czas dostępu, zgodnie z heurystykami, które pomagają w obsłudze aplikacji korzystających z tego czasu. Jest to ustawienie domyślne w systemie Red Hat Enterprise Linux.Inne opcje:
źródło