Làm chủ psutil: ‘Vũ khí’ tối thượng để giám sát hệ thống bằng Python

Python tutorial - IT technology blog
Python tutorial - IT technology blog

Nỗi ám ảnh mang tên ‘Server sập lúc 3 giờ sáng’

Cảnh báo nổ liên hồi vào lúc nửa đêm là cơn ác mộng của mọi DevOps. Mình từng thức trắng đêm chỉ để phát hiện một con script Python bị rò rỉ bộ nhớ, ngốn sạch 16GB RAM khiến toàn bộ dịch vụ tê liệt. Bạn đã bao giờ rơi vào cảnh hì hục check log thủ công trong khi sếp đang hối thúc chưa?

Trong thực tế, việc dùng top hay htop chỉ giải quyết được phần ngọn. Khi quản lý hệ thống lớn, bạn cần một cơ chế tự động: tự bắt lỗi, tự ghi log và tự giải phóng tài nguyên trước khi thảm họa xảy ra. Đó là lý do chúng ta cần đến giải pháp lập trình hóa thay vì gõ lệnh tay.

Tại sao mình từ bỏ việc gọi lệnh Shell truyền thống?

Hồi mới vào nghề, mình hay dùng subprocess để gọi free -m hay df -h rồi dùng Regex để bóc tách dữ liệu. Cách làm này cực kỳ rủi ro. Chỉ cần bạn chuyển từ Ubuntu sang CentOS hoặc Windows, đống script đó sẽ ‘vỡ vụn’ ngay lập tức vì định dạng output khác nhau.

Việc fork một tiến trình mới chỉ để lấy thông tin RAM cũng cực kỳ tốn tài nguyên. psutil (process and system utilities) sinh ra để giải quyết mớ hỗn độn đó. Nó cung cấp một API Python thuần túy, chạy mượt mà trên mọi nền tảng từ Linux, Windows đến macOS.

Triển khai psutil: Từ cơ bản đến nâng cao

Thư viện này giúp chúng ta truy xuất mọi thông số phần cứng mà không cần quan tâm hệ điều hành bên dưới là gì. Dưới đây là cách mình áp dụng nó vào dự án thực tế.

1. Cài đặt nhanh

Mở terminal và cài đặt qua pip. Bạn nên dùng môi trường ảo (venv) để giữ hệ thống sạch sẽ:

pip install psutil

2. Giám sát CPU: Đừng để con số 0.0 đánh lừa bạn

Một lỗi phổ biến là gọi psutil.cpu_percent() mà không truyền tham số. Kết quả trả về thường là 0.0 vì thư viện không có khoảng thời gian để so sánh mức độ sử dụng.

import psutil

# Sai: Thường trả về 0.0
print(f"CPU: {psutil.cpu_percent()}%")

# Đúng: Đợi 1 giây để lấy giá trị trung bình
print(f"CPU thực tế: {psutil.cpu_percent(interval=1)}%")

# Kiểm tra tải trên từng nhân (core)
print(f"Chi tiết từng nhân: {psutil.cpu_percent(interval=1, percpu=True)}")

Với các dashboard cần cập nhật nhanh, mình thường đặt interval=0.1 để cân bằng giữa độ chính xác và tốc độ phản hồi.

3. Quản lý RAM: Nhìn vào con số ‘Available’, đừng nhìn ‘Free’

Trên Linux, RAM ‘Free’ thấp không có nghĩa là máy sắp hết bộ nhớ. Hệ thống thường dùng RAM làm cache để tăng tốc. psutil giúp bạn tính toán con số ‘Available’ – dung lượng thực tế mà ứng dụng có thể chiếm dụng thêm.

mem = psutil.virtual_memory()
print(f"Tổng RAM: {mem.total / (1024**3):.2f} GB")
print(f"Đang dùng: {mem.percent}%")

if mem.percent > 90:
    print("Nguy hiểm: RAM sắp cạn!")

4. Kiểm tra Disk: Chặn đứng thảm họa đầy ổ cứng

Database crash do file log phình to là lỗi cực kỳ ‘ngớ ngẩn’ nhưng lại hay gặp. Bạn có thể tự động hóa việc kiểm tra dung lượng ổ đĩa chỉ với vài dòng code:

disk = psutil.disk_usage('/')
# Cảnh báo nếu dung lượng trống dưới 5GB
if disk.free < (5 * 1024**3):
    print(f"Cảnh báo: Ổ cứng chỉ còn {disk.free / (1024**3):.2f} GB!")

5. Quản lý tiến trình: Tính năng đáng giá nhất

Đây là nơi psutil thực sự tỏa sáng. Bạn có thể tìm, theo dõi và ‘trảm’ bất kỳ tiến trình nào đang làm loạn hệ thống. Mình thường dùng nó để tự kiểm soát chính script đang chạy. Nếu script ngốn quá 2GB RAM, nó sẽ tự động thoát an toàn thay vì đợi hệ điều hành kill thẳng tay.

Case study: Script ‘Sát thủ’ tự động dọn dẹp hệ thống

Dưới đây là đoạn code mình dùng để bảo vệ server worker. Nó sẽ quét các tiến trình Python và tiêu diệt ngay lập tức những con nào ngốn hơn 500MB RAM.

import psutil

def auto_cleanup(keyword, limit_mb):
    for proc in psutil.process_iter(['pid', 'name', 'memory_info']):
        try:
            if keyword.lower() in proc.info['name'].lower():
                usage = proc.info['memory_info'].rss / (1024 * 1024)
                if usage > limit_mb:
                    print(f"Tiêu diệt PID {proc.info['pid']} do ngốn {usage:.1f}MB")
                    psutil.Process(proc.info['pid']).terminate()
        except (psutil.NoSuchProcess, psutil.AccessDenied):
            continue

if __name__ == "__main__":
    auto_cleanup("python", 500)

Lời kết từ kinh nghiệm thực tế

Xây dựng công cụ giám sát riêng bằng Python mang lại sự linh hoạt tuyệt đối. Bạn không cần bỏ hàng nghìn USD cho các giải pháp bên thứ ba để có những tính năng cơ bản. Chỉ cần psutil, bạn đã có thể đẩy cảnh báo lên Telegram hoặc tự động khởi động lại service khi gặp sự cố. Hãy tích hợp nó ngay hôm nay để bảo vệ hệ thống và có những giấc ngủ ngon hơn.

Share: