VMtouch – do cache’u z nim!
Napisał: Patryk Krawaczyński
27/10/2012 w Administracja Brak komentarzy. (artykuł nr 378, ilość słów: 791)
P
amięć cache w systemie Linux jest bardzo przydatna – potrafi wykorzystać nieużywaną pamięć RAM (nie zabierając żadnych zasobów od uruchomionych aplikacji), aby zwiększyć szybkość dostępu do obiektów znajdujących się na dysku. Prosty przykład:
Wyczyśćmy RAM z już cache’owanych rzeczy i stwórzmy jeden duży plik i zobaczmy, jak na jego odczyt wpłynie pamięć cache:
[root@stardust ~]# echo 3 > /proc/sys/vm/drop_caches [root@stardust ~]# free -m total used free shared buffers cached Mem: 1885 500 1384 0 0 54 -/+ buffers/cache: 445 1439 Swap: 1998 14 1984 [root@stardust ~]# dd if=/dev/zero of=bigfile bs=1M count=50 50+0 przeczytanych recordów 50+0 zapisanych recordów skopiowane 52428800 bajtów (52 MB), 0,230762 s, 227 MB/s [root@stardust ~]# ls -lh bigfile -rw-r--r-- 1 root root 50M 10-27 20:37 bigfile [root@stardust ~]# free -m total used free shared buffers cached Mem: 1885 551 1333 0 1 104 -/+ buffers/cache: 445 1439 Swap: 1998 14 1984
Plik został właśnie zapisany na dysk, a że w systemie mamy wolną pamięć – zostanie on umieszczony w pamięci cache. Zmierzmy teraz czas jego odczytu z pamięci cache oraz prosto z dysku:
[root@stardust ~]# time cat bigfile > /dev/null real 0m0.054s user 0m0.000s sys 0m0.032s [root@stardust ~]# echo 3 > /proc/sys/vm/drop_caches [root@stardust ~]# time cat bigfile > /dev/null real 0m0.891s user 0m0.001s sys 0m0.081s
Czasy zarówno od strony obsługi systemu (sys
), jak i rzeczywisty czas obsługi polecenia (real
) pokazują wyraźną różnicę opóźnień. Cała ta “magia” z pamięcią cache obsługiwana jest od strony systemu. Pytanie jest następujące: jak stwierdzić, czy dany plik jest umieszczony w pamięci cache systemu? A jeśli nie – jak go tam umieścić? W odpowiedzi na to pytanie może pomóc małe narzędzie vmtouch autorstwa Doug’a Hoyte’a. Sprawdźmy czy po wyczyszczeniu pamięci plik bigfile nadal przebywa w pamięci cache:
[root@stardust ~]# ./vmtouch bigfile Files: 1 Directories: 0 Resident Pages: 0/12800 0/50M 0% Elapsed: 0.000401 seconds
Niestety żadna jego cześć nie znajduje się w pamięci. Umieśćmy go tam z powrotem:
[root@stardust ~]# ./vmtouch -vt bigfile bigfile [OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO] 12800/12800 Files: 1 Directories: 0 Touched Pages: 12800 (50M) Elapsed: 0.70741 seconds
Załóżmy, że umieściliśmy właśnie w katalogu /var/www/ kod naszej strony internetowej i zależy nam na tym, aby cała zawartość tego katalogu, jak i nowe pliki, które w nim się pojawią – były umieszczane w zaalokowanej pamięci cache systemu, a program vmtouch
przeszedł w tryb daemona:
[root@stardust ~]# time ls -alR /var/www/ > /dev/null real 0m0.754s user 0m0.057s sys 0m0.138s [root@stardust ~]# ./vmtouch -dl /var/www/ [root@stardust ~]# ./vmtouch /var/www/ Files: 1895 Directories: 170 Resident Pages: 39112/39112 152M/152M 100% Elapsed: 0.06052 seconds [root@stardust ~]# ps aux | grep vmtouch root 25305 0.7 8.1 158460 156868 ? SLs 21:29 0:00 ./vmtouch -dl /var/www [root@stardust ~]# time ls -alR /var/www/ > /dev/null real 0m0.104s user 0m0.040s sys 0m0.063s
Przy tego rodzaju operacjach należy pamiętać o sumie rozmiarów obiektów, jakie chcemy umieścić w pamięci cache, wolnych zasobach oraz marginesie i rezerwie dla innych aplikacji w systemie – szczególnie korzystając z parametru -l
.
Więcej informacji: the Virtual Memory Toucher, vmtouch.pod man 2 mlock, man 2 mmap
- Brak tematycznie powiązanych artykułów.