W moim systemie wykorzystałem pewną ilość zamiany:
undefine@uml:~$ free
total used free shared buffers cached
Mem: 16109684 15848264 261420 633496 48668 6096984
-/+ buffers/cache: 9702612 6407072
Swap: 15622140 604 15621536
Jak sprawdzić, co jest w zamianie?
Próbuję to sprawdzić za pomocą procesów, ale dla każdego pid w systemie VmSwap wynosi 0:
undefine@uml:~$ awk '/VmSwap/ {print $2}' /proc/*/status |uniq
0
Co jeszcze może być w zamianie? Myślałem o tmpfs - ale ponownie przeczytałem wszystkie pliki na tmpfs-es - i nie opróżnia on rozmiaru wymiany.
VmSwap
wierszu w/proc/PID/status
? Pytanie nie wymaga ładniejszego wyświetlania, lecz pytanie, co może być w zamianie oprócz danych procesowych.Wczoraj zacząłem to analizować pod kątem moich potrzeb, poniżej znalazłem do tej pory:
SWAP_USED = Used_by_Processes + SwapCached + Part_of_Tmpfs + something_else
Krótka historia:
Used_by_Processes - dane, które zostały całkowicie zamienione z pamięci.
SwapCached - dane, które zostały zamienione na dysk, ale nadal pozostają w pamięci.
Part_of_Tmpfs - część danych tmpfs.
Długa historia:
Used_by_Processes - opublikowano wiele instrukcji, jak błędnie obliczyć ten;) Np. Jeśli zsumujemy wszystkie
VmSwap
wpisy z/proc/*/status
lubSwap
wpisy z/proc/*/smaps
- otrzymamy przeszacowanie (udostępnione zamienione strony można policzyć więcej niż raz). Jeśli nie uruchomimy go z poziomuroot
użytkownika lub systemu operacyjnego - niedoszacowanie zostanie po cichu zwrócone. Nie mam odpowiedniego sposobu na identyfikację udostępnionych stron, ale rozpryskiwanie tych samych „map” daje o wiele lepsze przybliżenie niż inne podejścia: (zauważ, żecat
poniżej nie jest bezużyteczne i faktycznie potrzebuje2>/dev/null
)SwapCached - ten jest prosty i można go łatwo usunąć
/proc/meminfo
. Niektórzy ludzie nie spodziewaliby się, że będzie to liczone jako „używana” zamiana, ponieważ zduplikowaną (niebrudzącą) kopię tej samej strony zarówno w pamięci RAM, jak i Swap można zwolnić z dowolnej strony dość szybko (na wypadek, gdyby pojawił się popyt), dzięki czemu jeden z egzemplarzy „uwolniony”.Part_of_Tmpfs - jasną stroną jest to, że gdy wszystkie Twoje dane tmpfs pozostają nietknięte przez wiele dni i
swappiness
są niezerowe - całkiem prawdopodobne jest, że całe tmpfs jest zamienione (i odwrotnie w przypadku ostatnio używanych danych). Minusem jest to, że nie znalazłem żadnego interfejsu API do wiarygodnego obliczenia progu lub procentu, ile z tego jest zamienionych, chociaż jeśli jest wystarczająca ilość pamięci RAM - możemy skopiować całe dane tmpfs/dev/null
i uzyskać w ten sposób pewną wskazówkę, ile WAS zostało zamienionych.Typowymi błędami popełnianymi podczas obliczania rozmiaru tmpfs są - zakładając, że
/dev/shm
jest to jedyny skonfigurowany tmpfs lub próbuje to zrobić przez rekurencyjne skanowanie poszczególnych plików (nie tylko implementacje mają tendencję do pomijania ukrytych plików lub robienia tego z innych niżroot
, ale także odznacza swapy niektóre strony podczas przejścia). Znacznie łatwiejszym sposobem jest użycie starego dobregodf
.coś_else - patrz
diff 385 MB
poniżej „ ”, wymaga zanurzenia się w źródłach jądra. Zobacz mój skrypt:oraz dane wyjściowe z różnych pól:
I mały eksperyment jako bonus:
PS oprócz wspomnianego wyżej przybliżenia - istnieją inne źródła błędów, takie jak zaokrąglanie KB do MB, teoretyczna możliwość niedopasowania między wielkościami bloków RAM i Swap itp. Nie jestem pewien, czy to wszystko obejmuje, ale mam nadzieję, że to w pewnym stopniu pomaga :)
źródło