Mam wirtualny serwer linux (Fedora 17) z 28 GB pamięci RAM i 2 GB wymiany. Serwer działa z bazą danych MySQL skonfigurowaną do korzystania z większości pamięci RAM.
Po pewnym czasie serwer zaczyna używać swap do zamiany niepotrzebnych stron. To dobrze, ponieważ moja zamiana wynosi domyślnie 60 i jest to oczekiwane zachowanie.
Dziwne jest to, że liczba w top / meminfo nie odpowiada informacjom z procesów. Czyli serwer zgłasza te liczby:
/proc/meminfo:
SwapCached: 24588 kB
SwapTotal: 2097148 kB
SwapFree: 865912 kB
top:
Mem: 28189800k total, 27583776k used, 606024k free, 163452k buffers
Swap: 2097148k total, 1231512k used, 865636k free, 6554356k cached
Jeśli użyję skryptu z /server//a/423603/98204 , zgłasza rozsądne liczby (kilka MB zamienionych przez bash'es, systemd itp.) I jeden duży przydział z MySQL (pominąłem wiele wierszy wyjściowych ):
892 [2442] qmgr -l -t fifo -u
896 [2412] /usr/libexec/postfix/master
904 [28382] mysql -u root
976 [27559] -bash
984 [27637] -bash
992 [27931] SCREEN
1000 [27932] /bin/bash
1192 [27558] sshd: admin@pts/0
1196 [27556] sshd: admin [priv]
1244 [1] /usr/lib/systemd/systemd
9444 [26626] /usr/bin/perl /bin/innotop
413852 [31039] /usr/libexec/mysqld --basedir=/usr --datadir=/data/mysql --plugin-dir=/usr/lib64/mysql/plugin --log-error=/data/mysql/err --open-files-limit=8192 --pid-file=/data/mysql/pid --socket=/data/mysql/mysql.sock --port=3306
449264 Total Swap Used
Jeśli więc poprawnie otrzymam wynik skryptu, całkowite użycie wymiany powinno wynosić 449264 K = ok. 440 MB z mysql przy użyciu ok. 90% zamiany.
Pytanie brzmi, dlaczego tak bardzo różni się od górnego i meminfo? Czy jest jakiś sposób, aby „zrzucić” informacje o zamianie, aby zobaczyć, co faktycznie w niej jest, zamiast sumowania zużycia wymiany ze wszystkich procesów?
Analizując problem, wpadłem na różne pomysły, ale wszystkie wydają się błędne:
- Dane wyjściowe skryptu nie są w KB. Nawet gdyby był w jednostkach 512 lub 4KB, nie będzie pasował. W rzeczywistości stosunek (1200: 440) wynosi około 3: 1, co jest liczbą „dziwną”.
- Niektóre strony w swap są w jakiś sposób współdzielone między procesami, jak wspomniano w /server//a/477664/98204 . Jeśli to prawda, jak mogę znaleźć rzeczywistą liczbę pamięci używaną w ten sposób? To znaczy, że musiałoby to zrobić około 800 MB różnicy. I to nie brzmi dobrze w tym scenariuszu.
- Istnieje kilka „starych” stron w zamianie używanych przez procesy, które już się zakończyły. Nie miałbym nic przeciwko, że gdybym mógł dowiedzieć się, ile kosztuje ta „bezpłatna” zamiana.
- Są strony w swapie, które zostały zamienione z powrotem do pamięci i są zamieniane na wypadek, gdyby nie zmieniły się w pamięci RAM i muszą zostać ponownie wymienione, jak wspomniano w /server//a/100636/98204 . Ale wartość SwapCached wynosi tylko 24 MB.
Dziwne jest to, że użycie wymiany powoli rośnie, podczas gdy suma danych wyjściowych skryptu jest mniej więcej taka sama. W ciągu ostatnich 3 dni liczba używanych swapów wzrosła z 1100 MB do obecnych 1230 MB, a suma wzrosła z 430 MB do obecnych 449 MB (ok.).
Serwer ma wystarczającą ilość wolnej (zdolnej) pamięci RAM, więc mogłem po prostu wyłączyć swap i włączyć go ponownie. Lub prawdopodobnie mógłbym ustawić swapiness na 0, więc zamiana przyda się tylko wtedy, gdy nie ma innej możliwości. Chciałbym jednak rozwiązać problem lub przynajmniej dowiedzieć się, co jest tego przyczyną.