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.