NFsec Logo

VMtouch – do cache’u z nim!

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

Kategorie K a t e g o r i e : Administracja

Tagi T a g i : , , , , , ,

Podobne artykuły:

  • Brak tematycznie powiązanych artykułów.

Komentowanie tego wpisu jest zablokowane.