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 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.

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Quăng

24 bài viết.
232 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
134 13
Gần đây mình có present về chủ đề __Một số thao tác và lệnh đơn giản nhưng hữu ích khi sử dụng Linux__ cho một vài bạn bè. Mặc dù nó khá là đơn giả...
Quăng viết 2 năm trước
134 13
White
83 14
1. Giới thiệu Right tool for right job. Trước tiên phải hiểu là MySQL Replication không phải là giải pháp giải quyết mọi bài toán về quá tải hệ th...
Quăng viết gần 3 năm trước
83 14
White
67 5
Sau khi đọc bài viết (Link) của anh thaidn, mình nhớ lại lúc mình mới ra trường, cũng đã từng nghĩ về vấn đề này (lúc đó mình khá thích môn Bảo Mật...
Quăng viết 1 tháng trước
67 5
Bài viết liên quan
White
4 6
Đây là bài toán thực tế trong project của mình Có lẽ cũng nhiều bạn cũng đã gặp trường hợp tương tự Có khi chúng ta thường tặc lưỡi bỏ qua, hay đ...
bonbon1702_ viết 9 tháng trước
4 6
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
24 bài viết.
232 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!