Làm chủ nhiệt độ Linux Server với lm-sensors: Đừng để CPU ‘bốc hỏa’ rồi mới cuống cuồng

Monitoring tutorial - IT technology blog
Monitoring tutorial - IT technology blog

Chuyện gì xảy ra khi Server “phát hỏa”?

Vài năm trước, mình quản trị một cụm server tại một datacenter nhỏ. Một trưa cuối tuần, hệ thống bỗng chậm chạp lạ thường rồi đột ngột sập nguồn. Đăng nhập qua iDRAC, mình bàng hoàng thấy nhiệt độ CPU đã chạm ngưỡng 95°C. Thủ phạm hóa ra là một chiếc quạt tản nhiệt bị kẹt bụi, ngừng quay từ lúc nào không hay.

Nghịch lý ở chỗ: Nếu bạn chỉ dùng top hay htop, bạn chỉ thấy phần mềm đang ngốn bao nhiêu RAM, CPU. Bạn hoàn toàn mù tịt về sức khỏe vật lý của máy. Server có thể đang “gào thét” vì nóng hoặc điện áp chập chờn, nhưng nếu thiếu công cụ giám sát, bạn sẽ chỉ biết khi mọi chuyện đã quá muộn.

Tại sao Linux không báo trước cho bạn?

Mainboard hiện đại tích hợp hàng tá cảm biến để đo nhiệt độ và điện áp. Tuy nhiên, Linux không mặc định hiển thị các thông số này một cách trực quan.

Nguyên nhân chính là sự phân mảnh phần cứng. Mỗi hãng chip cảm biến như ITE, Winbond hay Fintek lại có cách giao tiếp khác nhau qua bus I2C hoặc SMBus. Kernel Linux cần đúng driver mới đọc được dữ liệu. Nếu không nạp module phù hợp, hệ điều hành đơn giản là không hiểu những con số đó có ý nghĩa gì.

Ba cách theo dõi nhiệt độ phổ biến

Dân sysadmin thường chọn một trong các lộ trình sau:

  • Kiểm tra qua BIOS/IPMI: Độ chính xác tuyệt đối nhưng yêu cầu reboot hoặc có card quản trị từ xa (iDRAC, ILO). Cách này không khả thi để theo dõi real-time khi OS đang chạy.
  • Đọc file trực tiếp từ /sys/class/hwmon/: Phương pháp dành cho dân chuyên. Bạn phải tìm đúng file chứa giá trị millidegree Celsius rồi chia cho 1000. Cực kỳ khó nhớ và tốn công.
  • Sử dụng lm-sensors: Đây là giải pháp tiêu chuẩn. Nó tự động dò tìm cảm biến, nạp driver và trình bày dữ liệu gọn gàng.

Cài đặt và cấu hình lm-sensors trong 5 phút

Mình ưu tiên lm-sensors vì nó nhẹ và dễ tích hợp vào các hệ thống lớn như Zabbix hay Grafana.

Bước 1: Cài đặt gói phần mềm

Với Debian hoặc Ubuntu, bạn dùng lệnh:

sudo apt update && sudo apt install lm-sensors

Nếu đang chạy CentOS/RHEL hoặc AlmaLinux:

sudo yum install lm_sensors

Bước 2: Dò tìm cảm biến (Sensor Detection)

Cài xong, lệnh sensors vẫn chưa hiển thị gì đâu. Bạn cần chạy trình hướng dẫn để quét toàn bộ bo mạch chủ.

sudo sensors-detect

Trình cài đặt sẽ “phỏng vấn” bạn một loạt câu hỏi Yes/No. Kinh nghiệm của mình là cứ gõ YES (hoặc nhấn Enter) cho đến cuối. Ở câu hỏi cuối cùng về việc tự động thêm module vào /etc/modules, hãy chọn YES để cảm biến tự load khi khởi động lại.

Bước 3: Nạp driver ngay lập tức

Để không phải reboot server, hãy nạp các module driver vừa tìm thấy bằng lệnh:

sudo systemctl restart kmod

Hoặc nạp thủ công bằng sudo modprobe [tên_module] nếu bạn biết chính xác chip cảm biến của mình là gì.

Bước 4: Đọc kết quả

Bây giờ, hãy gõ lệnh:

sensors

Kết quả sẽ hiển thị chi tiết như sau:

coretemp-isa-0000
Package id 0:  +45.0°C  (high = +80.0°C, crit = +100.0°C)
Core 0:         +42.0°C  (high = +80.0°C, crit = +100.0°C)

it8728-isa-0a30
fan1:        1200 RPM  (min =    0 RPM)
temp1:        +35.0°C  (low  = +127.0°C, high = +127.0°C)

Hãy chú ý Package id 0 (nhiệt độ tổng CPU) và crit (ngưỡng nguy hiểm). Nếu nhiệt độ chạm mức crit, CPU sẽ tự giảm xung nhịp (throttling) để bảo vệ phần cứng.

Kinh nghiệm thực tế: Tránh bẫy “Nhờn cảnh báo”

Sai lầm kinh điển của mình là đặt cảnh báo quá nhạy. Mình từng setup script bắn Telegram mỗi khi CPU vượt 70°C.

Hệ quả là mỗi khi chạy docker-compose build, điện thoại lại rung liên hồi. Sau một tuần, mình phát ngán và tắt luôn thông báo. Đúng lúc đó server nóng thật thì mình lại bỏ lỡ.

Lời khuyên: Hãy theo dõi nhiệt độ trung bình (baseline) trong 1 tuần. Nếu server thường chạy ở 50°C, hãy đặt cảnh báo ở 80°C và báo động đỏ ở 90°C. Đừng để những biến động tức thời làm loãng thông tin quan trọng.

Tự động hóa với Bash Script cực nhẹ

Không cần hệ thống monitoring cồng kềnh, bạn vẫn có thể tự chế một “đài quan sát” nhỏ. Đây là script mình thường dùng để ghi log:

#!/bin/bash
# Script kiểm tra nhiệt độ CPU
THRESHOLD=85
CURRENT_TEMP=$(sensors | grep "Package id 0" | grep -oE '[0-9]{2,3}' | head -1)
LOG_FILE="/var/log/cpu_temp.log"

echo "$(date): $CURRENT_TEMP°C" >> $LOG_FILE

if [ "$CURRENT_TEMP" -gt "$THRESHOLD" ]; then
    echo "CANH BAO: CPU $CURRENT_TEMP°C" | mail -s "CPU Alert" [email protected]
fi

Chỉ cần cấp quyền chmod +x và đưa vào crontab chạy mỗi 5 phút, bạn đã có thể yên tâm kê cao gối ngủ.

Giám sát phần cứng chưa bao giờ là thừa thải. Hy vọng hướng dẫn này giúp bạn kiểm soát tốt hơn những cỗ máy đang chạy 24/7 của mình.

Share: