W ciągu ostatnich kilku miesięcy miałem bardzo irytujący problem z moim systemem Linux: zacina się przy odtwarzaniu dźwięku Firefoksa, ruchu myszy itp., Z malejącym sub-sekundowym (ale wciąż zauważalnym) zacinaniem co kilka sekund. Problem pogarsza się, gdy pamięć podręczna jest zapełniana lub gdy uruchomione są programy intensywnie wykorzystujące pamięć dyskową / pamięć (np. Oprogramowanie do tworzenia kopii zapasowych) restic
). Jednak gdy pamięć podręczna nie jest pełna (np. Przy bardzo małym obciążeniu), wszystko działa bardzo płynnie.
Patrząc przez perf top
wyjście, widzę to list_lru_count_one
ma wysokie koszty ogólne (~ 20%) w tych okresach opóźnienia. htop
także pokazuje kswapd0
przy użyciu 50-90% procesora (choć wydaje się, że wpływ jest znacznie większy). W czasach ekstremalnego opóźnienia htop
Miernik procesora jest często zdominowany przez użycie procesora jądra.
Jedyne obejście, które znalazłem, to wymuszenie na jądrze zachowania wolnej pamięci ( sysctl -w vm.min_free_kbytes=1024000
) lub do ciągłego upuszczania pamięci podręcznych echo 3 > /proc/sys/vm/drop_caches
. Żadne z nich nie jest oczywiście idealne, ani też nie rozwiązuje go całkowicie; to tylko sprawia, że jest rzadsze.
Czy ktoś ma jakieś pomysły na to, dlaczego tak się dzieje?
Informacja o systemie
- i7-4820k z 20 GB (niedopasowanej) pamięci RAM DDR3
- Reprodukowany na Linuksie 4.14-4.18 na NixOS niestabilny
- Uruchamia kontenery Docker i Kubernetes w tle (co, jak sądzę, nie powinno tworzyć mikrosterowania?)
Co już próbowałem
- Zmiana harmonogramów I / O (bfq) za pomocą wielozakresowych harmonogramów I / O
- Używając
-ck
patchset Con Kolivasa (nie pomógł) - Wyłączanie wymiany, zmiana swapowania, używając zram
EDYTOWAĆ : Dla jasności, oto zdjęcie htop
i perf
podczas takiego opóźnienia. Zwróć uwagę na wysokość list_lru_count_one
Obciążenie procesora i kswapd0
+ wysokie użycie procesora jądra.