Jakoś zdarzyło mi się wymienić 14 GB pamięci. Po zabiciu sprawcy znów mam mnóstwo wolnej pamięci, więc pomyślałem, że mogę ponownie wprowadzić ważne dane . Tak więc przy 5 GB z 32 GB i 14 GB miejsca do wymiany, pobiegłem swapoff -a
.... i 4 godziny później około połowa pracy została zakończona.
Oznacza to mniej niż 1 MB / s, podczas gdy mogę łatwo skopiować 200 MB / s. Moja zamiana jest zaszyfrowana, ale podobnie jak wszystkie normalne partycje, a aes-ni nie powoduje zauważalnego obciążenia procesora (a wypełnienie przestrzeni wymiany zajęło tylko kilka minut). Widzę, że nie ma specjalnego powodu do optymalizacji swapoff
, ale zastanawiam się, w jaki sposób można to zrobić tak wolno?
Po prostu dodaję trochę więcej danych: Moja główna pamięć to 32 GB i mam 32 GB przestrzeni wymiany na każdym z 4 dysków twardych (na pewno przesada, ale kogo to obchodzi?). Całą przestrzeń wymiany można (odszyfrować i) odczytać w mniej niż 5 minut:
time -p sudo sh -c 'for i in /dev/mapper/cryptswap?; do md5sum $i & done; wait'
014a2b7ef300e11094134785e1d882af /dev/mapper/cryptswap1
a6d8ef09203c1d8d459109ff93b6627c /dev/mapper/cryptswap4
05aff81f8d276ddf07cf26619726a405 /dev/mapper/cryptswap3
e7f606449327b9a016e88d46049c0c9a /dev/mapper/cryptswap2
real 264.27
Czytanie części partycji nie może być wolniejsze niż czytanie wszystkich. Jednak odczyt około 1/10 tego zajmuje około 100 razy dłużej.
Zauważyłem, że podczas swapoff
obu procesor był w większości bezczynny (może 10% jednego rdzenia), podobnie jak dyski („mierzone” przez diody LED). Widziałem także, że przestrzenie wymiany zostały wyłączone jeden po drugim.
iostat -d 5
w tym czasieswapoff
również pokazywał niskie IO na dyskach ?Odpowiedzi:
Najpierw przyjrzyjmy się, czego możesz oczekiwać od dysku twardego. Twój dysk twardy może osiągać prędkość 200 MB / s sekwencyjnie . Jeśli weźmiesz pod uwagę czas wyszukiwania, może być znacznie wolniejszy. Aby wybrać dowolny przykład, zapoznaj się ze specyfikacją jednego z nowoczesnych dysków 3 TB Seagate, ST3000DM001 :
Maksymalna trwała szybkość przesyłania danych: 210 MB / s
Szukaj średniej odczytu: <8,5 ms
Bajtów na sektor: 4096
Jeśli nigdy nie musisz szukać, a twoja zamiana znajduje się blisko krawędzi dysku, możesz spodziewać się maksymalnej prędkości = 210 MB / s
Ale jeśli dane wymiany są całkowicie fragmentaryczne, w najgorszym przypadku będziesz musiał poszukać każdego czytanego sektora. Oznacza to, że możesz odczytać tylko 4 KB co 8,5 ms lub 4 KB / 0,0085 = 470 KB / s
Od razu więc nietoperz nie jest nie do pomyślenia , że faktycznie spotykasz się z prędkością dysku twardego.
To powiedziawszy, wydaje się głupie,
swapoff
że działałoby tak wolno i musiałoby czytać strony w porządku, zwłaszcza jeśli zostały napisane szybko (co oznacza uporządkowanie). Ale może tak po prostu działa jądro. Raport o błędach Ubuntu # 486666 omawia ten sam problem:Jedną z odpowiedzi było:
Raport o błędzie został zamknięty nierozwiązany.
Książka Mela Gormana „ Understanding the Linux Virtual Memory Manager ” jest nieco nieaktualna, ale zgadza się, że jest to powolna operacja:
Od 2007 roku jest nieco więcej dyskusji na temat listy mailingowej jądra Linux-a na temat „ przyspieszenie swapoff ” - chociaż prędkości, o których dyskutują, są nieco wyższe niż to, co widzisz.
To interesujące pytanie, które prawdopodobnie jest na ogół ignorowane, ponieważ
swapoff
jest rzadko używane. Myślę, że jeśli naprawdę chce śledzić ją w dół, pierwszym krokiem będzie próbował obserwować swoje wzorce użycia dysku bardziej ostrożnie (może zatop
,iostat
lub nawet bardziej skuteczne narzędzia jakperf
lubsystemtap
). Rzeczy, których należy szukać, to nadmierne wyszukiwanie, małe operacje we / wy, ciągłe przepisywanie i przenoszenie danych itp.źródło
Mam ten sam problem z laptopem, który ma dysk SSD, więc szukanie czasu nie powinno stanowić problemu.
Znalazłem alternatywne wyjaśnienie . Oto fragment
Jest to więc problem jądra, a nie cokolwiek innego.
źródło
swapoff
jest realizowane. Po zakończeniu procesu zamiany nie trwa to długo.strace swapoff
właściwie wszystko, co robi, to wywoływanie połączeniaswapoff
systemowego.Tak,
swapoff
mechanizm jest strasznie nieefektywny. Obejście tego problemu jest łatwe: iteracja procesów, zamiast iteracji po zamienionych stronach. Użyj tego skryptu python (nie jestem powiązany):Należy pamiętać, że tryb działania demona dotyczy tylko komputerów stacjonarnych / laptopów, które często są hibernowane. Nie uruchomiłbym go jako demona w systemie serwera - wystarczy uruchomić go na pierwszym planie, poczekać, aż zgłosi, że zajął się niektórymi procesami, a następnie zatrzymać go i spróbować:
Ponieważ większość stron jest teraz obecna zarówno w trybie wymiany, jak i pamięci,
swapoff
ma bardzo niewiele do zrobienia i powinna być teraz niesamowicie szybka (widziałem setki MB / s).Sekcja historii przed nami
Wyżej wspomniany skrypt Pythona jest oparty na pozostałej części tej odpowiedzi, co z kolei było moją poprawą tej starszej odpowiedzi autorstwa Jlonga . Ponieważ skrypt jest znacznie bezpieczniejszy, polecam wypróbować resztę odpowiedzi jako ostatnią linię obrony :
Działa to może 2 sekundy i właściwie nic nie robi, po prostu wypisz 10 najlepszych segmentów pamięci (w rzeczywistości drukuje więcej jedno-liniowych; tak , uwielbiam jedno-liniowe; po prostu sprawdź polecenia, zaakceptuj ryzyko, skopiuj i wklej do twoją powłokę; będą one czytać z wymiany).
Główny jednowierszowy jest bezpieczny (dla mnie), tyle że czyta dużo / proc.
Polecenia podrzędne przygotowane do ręcznego sprawdzenia nie są bezpieczne . Każde polecenie zawiesi jeden proces na czas odczytu segmentu pamięci z wymiany. Jest to więc niebezpieczne w przypadku procesów, które nie tolerują żadnych przerw. Prędkości transferu, które widziałem, były rzędu 1 gigabajta na minutę. (Wspomniany skrypt Pythona usunął ten brak).
Innym niebezpieczeństwem jest zbyt duże obciążenie pamięci systemu, więc sprawdź to w zwykły sposób
free -m
Co to robi?
Wynikiem tego skryptu perl jest seria
gdb
poleceń,dump memory (range)
które przywołują zamienione strony do pamięci.Dane wyjściowe zaczynają się od rozmiaru, więc łatwo jest przejść przez nie,
| sort -Vr | head
aby uzyskać 10 największych segmentów według rozmiaru (SSIZE). W-V
oznacza version-liczbowo nadaje sortowania, ale działa dla mojego celu. Nie mogłem wymyślić, jak sprawić, by sortowanie numeryczne działało.źródło
sort -t = -k 2n
/proc/$pid/mem
, wyszukiwać i czytać bezpośrednio. Oto PoC w dużej mierze oparty na twoim fragmencie: gist.github.com/WGH-/91260f6d65db88be2c847053c49be5ae W ten sposób proces nie jest zatrzymywany, AFAIK, nie powinno być z tego powodu żadnych zagrożeń.Jeśli podczas wymiany zostanie wykryty używany slot wymiany, jądro najpierw zamieni się na stronie. Funkcja unuse_process () następnie próbuje znaleźć wszystkie wpisy w tabeli stron, które odpowiadają właśnie zamienionej stronie i dokonuje koniecznej aktualizacji tabel stron. Wyszukiwanie jest wyczerpujące i bardzo czasochłonne: odwiedza każdy deskryptor pamięci (całego systemu) i sprawdza kolejno wpisy w tablicy stron.
Proszę odnieść się do strony 724 w „Understanding the Linux Kernel 3rd version”.
źródło