Hướng dẫn dọn dẹp cache, buffer và swap memory trong Linux

0
clean cache linux

Tương tự như các hệ điều hành khác, Linux cũng được triển khai một cơ chế quản lý bộ nhớ khá hiệu quả và thậm chí còn nhiều hơn thế nữa. Nhưng nếu như có bất kỳ process nào đang sử dụng quá nhiều bộ nhớ và bạn muốn dọn dẹp bớt đi, Linux cung cấp cho bạn một cách khá hiệu quả để dọn dẹp ram cache.

Hướng dẫn dọn dẹp RAM cache

Đối với mọi bản phân phối Linux nào cũng đều có 3 cơ chế dọn dẹp cache mà không gây ra ngắt bất kỳ process hay service nào.

1. Chỉ dọn dẹp PageCache

sync; echo 1 > /proc/sys/vm/drop_caches

2. Chỉ dọn dẹp dentries và inodes

sync; echo 2 > /proc/sys/vm/drop_caches

3. Dọn dẹp luôn cả PageCache, Dentries và Inodes

sync; echo 3 > /proc/sys/vm/drop_caches 

Và ở đây mình sẽ giải thích các câu lệnh bên trên

sync: là lệnh sẽ flush buffer file system. Các câu lệnh được phân tách nhau bằng ký tự “;” để chạy tuần tự . Shell sẽ chờ lệnh này được kết thúc trước khi thực hiện lệnh tiếp theo một cách tuần tự. Như trong tài liệu về kernel, việc ghi vào drop_cache sẽ dọn dẹp cache mà không hề kill bất kỳ process hay ứng dụng dịch vụ nào cả. Do đó sử dụng lệnh echo để thực hiện việc ghi file.

Nếu bạn phải dọn dẹp disk cache, lệnh đầu tiên là an toàn nhất trong các hệ thống sản phẩm doanh nghiệp, vì “echo 1>” sẽ chỉ dọn dẹp PageCache thôi. Và mình sẽ không khuyến khích bạn chạy các lệnh echo 2 hay echo 3 nếu như bạn vẫn chưa hiểu rõ tác dụng của nó là gì. Vì như lệnh echo 3, nó sẽ dọn dẹp Pageche, Dentries và Inodes.

Vậy, có nên giải phóng Cache và Buffer được sử dụng bởi Linux Kernel?

Khi bạn thử áp dụng các thiết lập cài đặt khác nhau và muốn kiểm tra thử (benchmark) hệ thống của mình xem việc sử dụng tài nguyên như thế nào, lúc này bạn mới nên dọn dọn buffer cache. Bạn có thể drop cache như mình đã giải thích bên trên mà không phải khởi động lại hệ thống – nghĩa là không có downtime.

Linux được thiết kế theo cách perfect, trong đó trước kiểm tra disk cache trước đã, sau đó nó mới dòm ngó sang disk. Nếu như nó tìm thấy có tài nguyên cần lấy nằm trên cache, thì nó sẽ không đụng đến disk. Nếu như chúng ta dọn dẹp cache, disk cache sẽ kém hữu ích hơn – vì OS sẽ tìm kiếm tài nguyên trên disk.

Bây giờ, mình sẽ viết một đoạn script thực hiện công việc tự động dọn dẹp cache hàng ngày vào buổi sáng lúc 9h. Tạo một đoạn script với tên file delete_cahe và thêm các dòng sau đây vào file:

#!/bin/bash
use "echo 1"
echo "echo 3 > /proc/sys/vm/drop_caches"

Cấp quyền thực thi cho file này bằng cách chạy lệnh sau

chmod +x delete_cache

Bây giờ, mình đã có thể dọn dẹp RAM cache bất cứ lúc nào mình muốn bằng cách chạy đoạn script ở trên.

Để thiết lập cronjob lập lịch dọn dẹp RAM cache vào lúc 9h sáng mỗi ngày. Mở file crontab để chỉnh sửa:

crontab -e

Thêm dòng sau vào cuối file và sau đó lưu lại

0  9  *  *  *  /opt/delete_cache

Trong đó: /opt/delete_cache là đường dẫn tới file script

Liệu đây có phải là ý tưởng hay để dọn dẹp RAM cache trên các server production không?

Chắc chắn là không rồi! Giả sử trong trường hợp khi bạn lập lịch chạy script dọn dẹp ram cache mỗi ngày lúc 9 giờ sáng. Giả sử vào một ngày đẹp trời nào đó, có một lượng lớn người dùng truy cập vào website của bạn và truy cập sử dụng tài nguyên từ server của bạn.

Tại cùng thời điểm đoạn script dọn dẹp RAM cache và xóa hết mọi thứ trong RAM. Lúc này, tất cả dữ liệu người dùng sử dụng đều phải nạp từ disk ra. Sẽ dẫn đến kết quả crash hoặc corupt database. Do đó, hãy cân nhắc xem bạn nên dọn dẹp RAM cache lúc nào trước khi thực hiện là hợp lý nhất.

Hướng dẫn dọn dẹp Swap Space trên Linux

Nếu bạn muốn dọn dẹp Swap Space, có thể bạn sẽ phải sử dụng lệnh sau:

swapoff -a && swapon -a

Bạn cũng có thể nhét dòng lệnh trên vào đoạn script để chạy – chỉ sau khi bạn đã hiểu rõ về các rủi ro liên quan.

Bây giờ, mình sẽ kết hợp các dòng lệnh trên vào thành một để dọn dẹp RAM cache và Swap Space.

echo 3 > /proc/sys/vm/drop_caches && swapoff -a && swapon -a && printf '\n%s\n' 'Ram-cache and Swap Cleared'

Hoặc

$ su -c "echo 3 >'/proc/sys/vm/drop_caches' && swapoff -a && swapon -a && printf '\n%s\n' 'Ram-cache and Swap Cleared'" root

Sau khi thực hiện câu lệnh trên, mình sẽ chạy lệnh “free -h” trước khi chạy đoạn script để kiểm tra xem đoạn script có chạy đúng theo như mong muốn hay không.

5/5 (1 Review)