Duża aktywność zapisu na SSD nukes wydajność systemu

13

Zauważyłem, że kiedy robię ciężkie aplikacje do pisania, cały system zwalnia. Aby to przetestować dalej, uruchomiłem to, aby wykonać (stosunkowo) niski procesor i wysoką aktywność dysku:

john -incremental > file_on_SSD

To wypompowuje dziesiątki tysięcy ciągów na sekundę do pliku na moim dysku systemowym.

Gdy tak się dzieje, myszy pozostają w tyle, TTY przestają reagować, aplikacje „znikają” i ogólnie cały komputer staje się bezużyteczny. Kiedy mogę w końcu Control + C john, system wraca do pełnej siły po kilku sekundach.

Jest to skrajny przykład, ale mam podobne problemy z nieco mniej intensywnymi czynnościami zapisu, takimi jak kopiowanie dużych plików z szybkich źródeł lub transkodowanie.

Mój główny dysk systemu operacyjnego to dość szybki dysk SSD ( OCZ Agility 60 GB) ) z EXT4. Jeśli zapisuję johndane wyjściowe na dysku mechanicznym za pomocą EXT4, nie odczuwam takich samych spowolnień, chociaż szybkość jest znacznie wolniejsza (SSD robi ~ 42 000 słów na sekundę, mechaniczny robi 8000 w / s). Przepustowość może być istotna. Dysk mechaniczny również nie ma nic wspólnego z systemem. To tylko dane.

I używam jądra 2.6.35-2, ale zauważyłem ten problem, ponieważ dostałem ten dysk SSD, kiedy prawdopodobnie używałem .31 lub czegoś w tym czasie.

Co powoduje spowolnienie? Problem z EXT4? Problem z jądrem? Problem z dyskiem SSD? Wszystkie powyższe? Coś innego?

Jeśli uważasz, że muszę przeprowadzić dodatkowy test, po prostu zostaw komentarz mówiący, co mam zrobić, a ja dołączę wynik do pytania.

Oli
źródło
Być może powinieneś również wspomnieć o tym, jakiego SSD używasz. Nie wszystkie dyski SSD są równe.
Cristian Ciupitu
@Cristian: Dodano. To zwinność OCZ.
Oli

Odpowiedzi:

12

Od pewnego czasu jest to znany problem. Używanie FS zestrojonego SSD, takiego jak Btrfs, może pomóc, ale może nie.

Ostatecznie jest to błąd w systemach planowania / zarządzania pamięcią IO. Ostatnio pojawiły się poprawki, które mają rozwiązać ten problem. Zobacz Naprawiono: problem z reakcją pulpitu w systemie Linux?

Te łaty mogą ostatecznie przedostać się do jądra głównego, ale na razie prawdopodobnie będziesz musiał skompilować własne jądro, jeśli chcesz rozwiązać ten problem.

Zifre
źródło
2
Jeśli dobrze rozumiem, łatki do tego powinny przejść do Linuksa 2.6.37 .
JanC
1

Jest kilka rzeczy, które możesz sprawdzić, aby spróbować poprawić wydajność SSD pod Linuksem.

  1. Ustaw punkt montowania na „noatime”. Dodatkowe czasy aktualizacji aktualizacji aktywności są zazwyczaj marnowane w większości przypadków użycia. Zwłaszcza w przypadku ciągłego pompowania pojedynczych linii do pliku wymuszasz wiele aktualizacji systemu plików dla każdego dostępu.

  2. Sprawdź windę. Domyślna winda dla większości dystrybucji jest skonfigurowana dla wirujących talerzy o swobodnym dostępie. Dyski SSD nie wymagają dodatkowej logiki, więc ustawienie windy na noop może poprawić wydajność, umożliwiając sprzętowi zarządzanie zapisami.

  3. Buforowanie zapisu i zapisu. Jest to nieco bardziej ezoteryczne, ale możesz sprawdzić metodę buforowania używaną hdparmdla urządzenia. Buforowanie z zapisem może mieć pozytywny wpływ na wydajność SSD w porównaniu z zapisem.

nzwulfin
źródło
Czy możesz @nzwulfin napisać coś więcej o ustawianiu windy?
Grzegorz Wierzowiecki
Wygląda na to, że wydajność SSD była w porządku. Cała reszta cierpi.
Thorbjørn Ravn Andersen
0

Buforowanie plików jest prawdopodobnie nieprawidłowo dostrojone do obciążenia. Niestety jądro Linuksa jest na tyle głupie, aby nie poradzić sobie z tym automatycznie, a ustawienia domyślne są dość złe, jeśli masz dużo pamięci RAM i wystarczająco powolne urządzenia blokowe. Zobacz https://lonesysadmin.net/2013/12/22/better-linux-disk-caching-performance-vm-dirty_ratio/ w celu uzyskania szczegółowych informacji.

Proponuję spróbować zmodyfikować /etc/sysctl.confjedno z nich

vm.dirty_background_ratio = 3
vm.dirty_ratio = 6

w celu znacznego zmniejszenia obciążenia pamięci RAM spowodowanego buforowaniem zapisu, aby umożliwić jądrze lepszą obsługę innych zadań. Spowoduje to wymianę lepszych opóźnień na niższą przepustowość.

Inną możliwością jest zwiększenie buforowania, ale jeśli proces ciągle zapisuje nowe dane, przez cały czas napotykasz bardzo duże opóźnienia, jeśli pamięć podręczna się zapełni. Jeśli chcesz spróbować, możesz zrobić coś takiego

vm.dirty_background_ratio = 5
vm.dirty_ratio = 80

Pamiętaj, że *_ratioustawienia odnoszą się do procentu dostępnej pamięci RAM. Jeśli chcesz mieć lepszą kontrolę, użyj *_bytesustawień. Osobiście używam następującej konfiguracji dla mojej stacji roboczej:

vm.dirty_background_bytes = 50000000
vm.dirty_bytes = 200000000

Ogranicza to pamięć podręczną zapisu w tle do 50 MB i wymusza zapis synchroniczny, jeśli w pamięci podręcznej znajduje się 200 MB.

Mikko Rantalainen
źródło