11/08/2018, 21:06

Kiểm tra và điều khiển bộ nhớ cached trên Linux với vmtouch

Trong một bài viết trước đây mình có giải thích về cached trên Linux. Ứng dụng dễ thấy của nó là load các tập tin từ đĩa vào memory để tăng tốc quá trình đọc/ghi dữ liệu. Cơ chế này do hệ điều hành quản lý nên ta cũng không quan tâm lắm về cách nó thực hiện như thế nào. Nhưng một ngày bạn muốn ...

Trong một bài viết trước đây mình có giải thích về cached trên Linux. Ứng dụng dễ thấy của nó là load các tập tin từ đĩa vào memory để tăng tốc quá trình đọc/ghi dữ liệu. Cơ chế này do hệ điều hành quản lý nên ta cũng không quan tâm lắm về cách nó thực hiện như thế nào.

Nhưng một ngày bạn muốn biết là trong Memory của mình đang cached những file nào, một file cụ thể nào đó có được cached trong memory hay không hoặc cached bao nhiêu phần. Hoặc bạn muốn load/warm-up data của bạn từ đĩa vào Memory trước khi có một tiến trình nào đó đọc/ghi ... Thì làm thế nào?

Có một công cụ khá thú vị tên là vmtouch, công cụ này cung cấp các chức năng

  • Check xem một file có được cached hay không?
  • "Nói" với HĐH cached hoặc xóa một file khỏi memory
  • "Nói" với HĐH lock 1 file trong memory, không cho tự động xóa khỏi memory
  • ...

Mình sẽ nói chủ yếu về 3 tính năng trên, giờ ta sẽ thử vài ví dụ để xem nó hoạt động như thế nào.

1. Cài đặt

Nó khá là dễ dàng để cài đặt theo các step

~$ git clone https://github.com/hoytech/vmtouch.git
~$ cd vmtouch
~$ make
~$ sudo make install

2. Ví dụ

Mình chuẩn bị một số file text để thử như sau

~$ ls -larht Device100.csv
-rw-r--r-- 1 xluffy users 1.1G Jun 23 10:26 Device100.csvy

~$ wc -l Device100.csv
23849205 Device100.csv

Sau khi chạy lệnh check số dòng của file thì file đã được cached lên memory rồi nên mình sẽ phải flush cached đi. Thao tác này sẽ lặp đi lặp lại để đảm bảo kết quả chính xác.

~$ echo 3 > /proc/sys/vm/drop_caches && free -m
              total        used        free      shared  buff/cache   available
Mem:           3828        2261        1143         236         422        1275
Swap:          3814         331        348

Như ta thấy cột buff/cache của mình đang là 422MB

Example 1: Kiểm tra xem file Device100.csv có được cached trong memory hay không?

~$ vmtouch -v Device100.csv 
Device100.csv
[                                                            ] 0/267838

           Files: 1
     Directories: 0
  Resident Pages: 0/267838  0/1G  0%
         Elapsed: 0.028238 seconds

=> 0%, không có gì trên memory cả (hợp lí vì mình có flush cache ở trên)

Example 2: Thao tác đọc 1 triệu dòng của file đó

~$ tail -n 1000000 Device100.csv > /dev/null
~$ vmtouch -v Device100.csv 
Device100.csv
[                                                         oOO] 11232/267838

           Files: 1
     Directories: 0
  Resident Pages: 11232/267838  43M/1G  4.19%
         Elapsed: 0.012056 seconds

=> Kết quả ta thấy là có 43MB/1G, khoảng 4.2% data đã được cached vào memory

Example 3: Nói với HĐH xóa file đó khỏi cache

~$  vmtouch -v Device100.csv
           Files: 1
     Directories: 0
   Evicted Pages: 267838 (1G)
         Elapsed: 0.11456 seconds
:: You are xquang -at- COM019 [~/tmp]
$ vmtouch -v Device100.csv 
Device100.csv
[                                                            ] 0/267838

           Files: 1
     Directories: 0
  Resident Pages: 0/267838  0/1G  0%
         Elapsed: 0.012569 seconds

Example 4: Load file vào memory và kiểm tra bộ nhớ

~$ echo 3 > /proc/sys/vm/drop_caches && free -m
              total        used        free      shared  buff/cache   available
Mem:           3828        2261        1143         236         422        1275
Swap:          3814         331        348
~$ vmtouch -tv Device100.csv 
Device100.csv
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO] 267838/267838

           Files: 1
     Directories: 0
   Touched Pages: 267838 (1G)
         Elapsed: 6.773 seconds
~$ free -m
              total        used        free      shared  buff/cache   available
Mem:           3828        2239         123         233        1465        1299
Swap:          3814         385        3429

=> Như ta thấy cột buff/cache đã tăng từ 422MB lên 1465MB

Example 5: Ta sẽ test tốc độ của việc trước và sau khi load file vào memory (warm-up dữ liệu).

Không có cached

~$ echo 3 > /proc/sys/vm/drop_caches
~$ time wc -l Device100.csv
23849205 Device100.csv

real    0m9.402s
user    0m0.430s
sys     0m0.537s

=> Tốn khoảng 9s để đọc toàn bộ file này, Giờ ta sẽ thử warm-up nó và đọc lại.

~$ echo 3 > /proc/sys/vm/drop_caches
~$ vmtouch -tv Device100.csv 
Device100.csv
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO] 267838/267838

           Files: 1
     Directories: 0
   Touched Pages: 267838 (1G)
         Elapsed: 6.773 seconds

~$ vmtouch -v Device100.csv 
Device100.csv
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO] 267838/267838

           Files: 1
     Directories: 0
  Resident Pages: 267838/267838  1G/1G  100%
         Elapsed: 0.033391 seconds

Ok, đã load đủ 1GB (100%) và memory. Giờ đếm lại số dòng

~$ time wc -l Device100.csv
23849205 Device100.csv

real    0m0.563s
user    0m0.237s
sys     0m0.290s

=> Ta chỉ tốn nửa giây để đọc toàn bộ file.

3. Tóm lại

Cá nhân mình thấy đây là một công cụ khá thú vị, nó giúp mình hiểu thêm một chút về cached, cũng hữu ích khi debug hệ thống. Với tính năng load và lock cache có thể giúp ta warm-up dữ liệu trước khi chạy start dịch vụ để đảm bảo performance.

0