Ngừng đoán mò: Tự động hóa hiệu năng Linux với Tuned Profiles

Linux tutorial - IT technology blog
Linux tutorial - IT technology blog

Nút thắt cổ chai tiềm ẩn trong phần cứng cao cấp

Vài năm trước, tôi đã triển khai một cụm 12 node web có lưu lượng truy cập cao. Trên lý thuyết, thông số kỹ thuật cực kỳ mạnh mẽ: bộ xử lý EPYC kép, 256GB RAM và lưu trữ NVMe. Tuy nhiên, trong đợt tăng đột biến lưu lượng đầu tiên, độ trễ p99 đã vọt lên tới 500ms. Nhật ký hệ thống không hiển thị lỗi ứng dụng; chúng cho thấy một hệ thống đang “ngộp thở”. Hệ điều hành bị nghẽn vì nó đang chạy cấu hình “chung cho mọi trường hợp” nhằm mục đích ổn định tổng thể, chứ không phải cho lưu lượng web có độ đồng thời cao.

Các bản phân phối Linux tiêu chuẩn thường đi kèm với các thiết lập mặc định thận trọng. Các cài đặt này đảm bảo cả Raspberry Pi và máy chủ 128 lõi đều khởi động ổn định, nhưng chúng hiếm khi tối đa hóa tiềm năng phần cứng. Nếu bạn để các mặc định này cho một thực thể PostgreSQL nặng hoặc một proxy Nginx bận rộn, bạn thực chất đang bỏ phí 20-30% hiệu năng thô của mình.

Tại sao tinh chỉnh thủ công thất bại khi mở rộng

Cách khắc phục kiểu cũ thường liên quan đến một chuỗi các chỉnh sửa lộn xộn trong /etc/sysctl.conf/etc/security/limits.conf. Thậm chí bạn có thể thấy mình đang can thiệp trực tiếp vào các bộ lập lịch đĩa trong /sys/block/. Cách tiếp cận này hiệu quả với một máy, nhưng là một ác mộng bảo trì cho một đội ngũ năm mươi máy. Tôi đã thấy các nhóm DevOps mất nhiều ngày để gỡ lỗi các vấn đề hiệu năng “ma” gây ra bởi một đoạn script bash không được bảo trì, vốn áp dụng các tham số kernel lỗi thời khi khởi động.

Tối ưu hóa hệ thống không phải là công việc “thiết lập rồi bỏ đó”. Một cơ sở dữ liệu cần thông lượng đĩa cao và huge pages. Ngược lại, một máy chủ ảo hóa phải cân bằng các chu kỳ CPU trên hàng chục máy khách. Việc cố định các giá trị này làm cho hạ tầng của bạn trở nên mong manh và không thể thích ứng khi bạn nâng cấp phần cứng hoặc thay đổi khối lượng công việc.

Chọn chiến lược tối ưu hóa phù hợp

Trước khi đi sâu vào giải pháp, hãy xem cách hầu hết các nhóm xử lý việc tối ưu hóa:

  • Script tĩnh: Dễ viết nhưng nguy hiểm. Chúng không phát hiện được thay đổi phần cứng, nghĩa là một script được tối ưu hóa cho SSD có thể vô tình làm tê liệt ổ NVMe bằng cách áp dụng các bộ lập lịch IO lỗi thời.
  • Quản lý cấu hình (Ansible/Terraform): Tuyệt vời cho tính nhất quán. Tuy nhiên, bạn vẫn phải tự nghiên cứu và duy trì hàng trăm biến kernel for từng trường hợp sử dụng cụ thể.
  • Tuned: Một daemon thích ứng động. Nó nhóm các cài đặt phức tạp thành các “profile” và có thể điều chỉnh các tham số ngay lập tức dựa trên tải thực tế của hệ thống.

Tôi thích Tuned vì nó coi hiệu năng như một chính sách thay vì một công việc vặt. Thay vì phải ghi nhớ rằng vm.swappiness nên là 10 cho một cơ sở dữ liệu, tôi chỉ cần nói với hệ thống: “Bạn là một máy chủ cơ sở dữ liệu”. Tuned sẽ xử lý phần còn lại.

Triển khai Tuned: Hướng dẫn thực hành

Tuned quản lý các thiết lập sysctl, trạng thái năng lượng, CPU governors và lập lịch đĩa thông qua một giao diện thống nhất duy nhất. Đó là “nút bấm dễ dàng” cho việc tối ưu hóa Linux.

1. Cài đặt và thiết lập dịch vụ

Trên các hệ thống dựa trên RHEL như AlmaLinux hoặc Rocky, Tuned thường được cài đặt sẵn. Đối với người dùng Ubuntu hoặc Debian, bạn có thể sẽ cần lấy nó từ kho lưu trữ:

# Dành cho Ubuntu/Debian
sudo apt update && sudo apt install tuned -y

# Dành cho AlmaLinux/CentOS/Fedora
sudo dnf install tuned -y

# Khởi chạy dịch vụ
sudo systemctl enable --now tuned

Kiểm tra trạng thái hiện tại bằng tuned-adm active. Hầu hết các hệ thống mặc định là balanced, mức này ổn cho máy tính xách tay nhưng mờ nhạt đối với một máy chủ sản xuất.

2. Tăng cường sức mạnh cho khối lượng công việc Database

Các cơ sở dữ liệu như MySQL và PostgreSQL sống còn nhờ sự ổn định của bộ nhớ và I/O đĩa. Chúng bị ảnh hưởng khi hệ điều hành cố gắng tiết kiệm điện bằng cách giảm xung nhịp CPU hoặc swap bộ nhớ ra đĩa trong những lúc rảnh rỗi.

Đối với những máy này, tôi sử dụng profile throughput-performance. Nó ép CPU vào chế độ hiệu năng cao và vô hiệu hóa các tính năng tiết kiệm điện quá mức.

# Xem các profile có sẵn
tuned-adm list

# Áp dụng profile hiệu năng
sudo tuned-adm profile throughput-performance

Lệnh duy nhất này điều chỉnh dirty_ratio (cho phép nhiều dữ liệu ở lại trong bộ nhớ hơn trước khi ghi xuống đĩa) và đảm bảo engine cơ sở dữ liệu nhận được mọi chu kỳ CPU ngay khi nó yêu cầu.

3. Tối ưu hóa cho Web Server có độ đồng thời cao

Các máy chủ web xử lý hàng nghìn kết nối TCP ngắn hạn. Ở đây, độ trễ cực nhỏ là kẻ thù. Trên một bộ cân bằng tải Nginx bận rộn, việc chuyển sang profile network-latency có thể giảm đáng kể độ trễ tail latency.

sudo tuned-adm profile network-latency

Profile này vô hiệu hóa transparent huge pages—thứ có thể gây ra hiện tượng “nấc cụt” không mong muốn trong các ứng dụng web—và tinh chỉnh stack mạng để xử lý các gói tin nhanh hơn. Trong các thử nghiệm của tôi, việc này đã giảm 15% thời gian phản hồi p99 trên một node xử lý 5.000 yêu cầu mỗi giây.

4. Máy chủ ảo hóa (Host) vs. Máy khách ảo (Guest)

Nếu bạn chạy KVM hoặc QEMU, máy chủ và máy khách có những nhu cầu xung đột nhau. Máy chủ cần ưu tiên I/O cho các tệp ảnh đĩa ảo, trong khi máy khách cần biết nó đang chạy trong môi trường ảo hóa để tránh các chu kỳ đồng hồ dư thừa.

Trên máy chủ vật lý (host):

sudo tuned-adm profile virtual-host

Bên trong máy ảo (guest):

sudo tuned-adm profile virtual-guest

Profile virtual-host tăng max_map_count, cho phép hypervisor quản lý lượng lớn bộ nhớ cho các máy khách mà không bị treo.

Tạo Profile tùy chỉnh

Đôi khi bạn cần một cách tiếp cận kết hợp. Tuned cho phép bạn tạo các profile tùy chỉnh “kế thừa” cài đặt từ các profile hiện có. Ví dụ, nếu bạn cần nền tảng của throughput-performance nhưng muốn ép một giới hạn mạng cụ thể, hãy tạo một thư mục trong /etc/tuned/.

sudo mkdir /etc/tuned/app-specific
sudo nano /etc/tuned/app-specific/tuned.conf

Thêm logic của bạn vào tệp cấu hình:

[main]
summary=Tối ưu cho ứng dụng Node.js có độ đồng thời cao
include=throughput-performance

[sysctl]
net.core.somaxconn=8192
vm.swappiness=5

[sysfs]
/sys/kernel/mm/transparent_hugepage/enabled=never

Kích hoạt nó giống như bất kỳ profile nào khác: sudo tuned-adm profile app-specific.

Xác thực: Đừng làm mù quáng

Sau khi quản lý hơn 500 thực thể Linux, tôi đã học được rằng tối ưu hóa mà không đo lường chỉ là đoán mò. Luôn xác thực các thay đổi của bạn. Thà dành mười phút để kiểm tra còn hơn mười giờ để khắc phục sự cố sập hệ thống sản xuất.

  1. Baseline (Điểm chuẩn): Chạy sysbench cho CPU/Đĩa hoặc wrk cho lưu lượng HTTP trước khi thay đổi bất cứ điều gì.
  2. Áp dụng: Sử dụng tuned-adm để chuyển đổi profile.
  3. Giám sát: Sử dụng htopiostat -xz 1 để theo dõi hiện tượng chờ I/O hoặc CPU tăng vọt khi có tải.
  4. Kiểm chứng: Kiểm tra các giá trị kernel thực tế. Ví dụ, chạy cat /proc/sys/vm/swappiness để đảm bảo thay đổi của bạn đã có hiệu lực.

Tuned biến việc tối ưu hóa hiệu năng từ một “ma thuật” thành một quy trình có thể lặp lại. Nếu bạn vẫn đang tinh chỉnh thủ công các tệp sysctl trên nhiều máy chủ, đã đến lúc dừng lại. Hãy để Tuned xử lý các công việc cấp thấp để bạn có thể tập trung vào việc xây dựng kiến trúc tốt hơn.

Share: