Cấu hình bộ đệm trang và bộ nhớ ảo
Tham số vm.swappiness quyết định mức độ Linux ưu tiên di chuyển các trang bộ nhớ (page) từ RAM sang swap disk. YugabyteDB cần RAM để caching dữ liệu, do đó ta cần giảm thiểu việc hệ thống đẩy dữ liệu vào swap để tránh latency cao.
Đặt giá trị vm.swappiness về 1 (hoặc 0) để hệ thống chỉ swap khi RAM gần như cạn kiệt hoàn toàn.
Thực hiện lệnh sau để thay đổi tạm thời:
sudo sysctl -w vm.swappiness=1
Kết quả mong đợi: Lệnh trả về vm.swappiness = 1.
Để thay đổi vĩnh viễn, ta cần sửa file cấu hình /etc/sysctl.conf hoặc file trong thư mục /etc/sysctl.d/.
Tạo file cấu hình /etc/sysctl.d/99-yugabyte-memory.conf với nội dung:
cat > /etc/sysctl.d/99-yugabyte-memory.conf
Áp dụng thay đổi:
sudo sysctl --system
Kiểm tra kết quả:
cat /proc/sys/vm/swappiness
Đầu ra phải là số 1.
Tối ưu hóa tham số bộ đệm trang VFS
Tham số vm.vfs_cache_pressure điều khiển mức độ kernel thu hồi cache các entry trong inode và dentry (hệ thống tệp). YugabyteDB tạo rất nhiều file và metadata, do đó ta cần giảm áp lực này để giữ metadata trong RAM.
Giá trị mặc định là 100. Ta sẽ giảm xuống còn 50 để ưu tiên giữ cache inode/dentry.
Thêm dòng cấu hình vào file /etc/sysctl.d/99-yugabyte-memory.conf đã tạo ở bước trên:
echo "vm.vfs_cache_pressure = 50" >> /etc/sysctl.d/99-yugabyte-memory.conf
Lưu nội dung hoàn chỉnh của file /etc/sysctl.d/99-yugabyte-memory.conf:
cat > /etc/sysctl.d/99-yugabyte-memory.conf
Áp dụng lại cấu hình:
sudo sysctl --system
Kiểm tra giá trị hiện hành:
cat /proc/sys/vm/vfs_cache_pressure
Đầu ra phải là số 50.
Cài đặt và cấu hình File System (ZFS hoặc XFS)
YugabyteDB hoạt động tốt nhất trên file system hỗ trợ extent và có tính năng write-through hoặc log mạnh mẽ. Chúng ta sẽ chọn XFS vì tính ổn định cao và hiệu năng tốt cho workload ngẫu nhiên (random I/O) trên Ubuntu 24.04.
Đảm bảo disk target (ví dụ: /dev/nvme0n1) đã được phân vùng. Ở đây giả sử chúng ta dùng toàn bộ disk /dev/nvme0n1 cho data YugabyteDB.
Cài đặt công cụ format XFS:
sudo apt update && sudo apt install -y xfsprogs
Format disk với các tham số tối ưu: inode64 (hỗ trợ inode lớn), noatime (giảm I/O metadata), logbsize=256k (tăng kích thước log để ghi nhanh hơn).
Chú ý: Lệnh sau sẽ xóa sạch dữ liệu trên disk /dev/nvme0n1.
sudo mkfs.xfs -f -d inode64,noatime -l logbsize=256k /dev/nvme0n1
Kết quả mong đợi: Thông báo meta-data=/dev/nvme0n1 ... và không có lỗi.
Tạo thư mục mount point và mount disk:
sudo mkdir -p /mnt/yugabyte-data
sudo mount -o noatime,nodiratime /dev/nvme0n1 /mnt/yugabyte-data
Để mount tự động khi khởi động, cập nhật file /etc/fstab:
echo "/dev/nvme0n1 /mnt/yugabyte-data xfs noatime,nodiratime 0 2" | sudo tee -a /etc/fstab
Verify kết quả mount:
mount | grep yugabyte-data
Đầu ra phải hiển thị /dev/nvme0n1 on /mnt/yugabyte-data type xfs (rw,relatime,noatime,nodiratime...).
Cấu hình I/O Scheduler cho NVMe/SATA
Đối với NVMe SSD, scheduler mặc định kyber hoặc mq-deadline có thể gây overhead không cần thiết. YugabyteDB tự quản lý I/O queue, do đó ta nên sử dụng scheduler none (hoặc none cho NVMe, mq-deadline cho SATA/HDD).
Trên Ubuntu 24.04 với NVMe, ta sẽ set về none để giảm độ trễ (latency).
Xác định tên thiết bị NVMe (ví dụ: nvme0):
ls /sys/block/ | grep nvme
Kiểm tra scheduler hiện tại:
cat /sys/block/nvme0n1/queue/scheduler
Thay đổi scheduler tạm thời:
echo none | sudo tee /sys/block/nvme0n1/queue/scheduler
Kiểm tra lại:
cat /sys/block/nvme0n1/queue/scheduler
Đầu ra phải hiển thị [none] kyber (chữ trong ngoặc vuông là đang hoạt động).
Để cấu hình vĩnh viễn, ta cần thêm tham số khởi động kernel vào /etc/default/grub.
Chỉnh sửa file /etc/default/grub:
sudo nano /etc/default/grub
Thêm tham số nvme_core.default_ps_max_latency_us=0 vào dòng GRUB_CMDLINE_LINUX (nếu có) hoặc thêm vào cuối dòng. Tuy nhiên, để set scheduler cụ thể cho từng disk, cách chuẩn nhất là dùng blk-mq override hoặc module parameter.
Tạo file drop-in cho systemd để set scheduler sau khi boot:
sudo mkdir -p /etc/systemd/system/sysinit.target.d
cat > /etc/systemd/system/sysinit.target.d/99-io-scheduler.conf
Reload systemd daemon:
sudo systemctl daemon-reexec
sudo systemctl daemon-reload
Verify: Restart server và kiểm tra lại bằng lệnh cat /sys/block/nvme0n1/queue/scheduler.
Tăng giới hạn mở file (ulimit nofile)
Mỗi kết nối database và mỗi file data trong YugabyteDB đều chiếm một file descriptor. Mặc định Linux thường giới hạn ở 1024, không đủ cho cụm HTAP có hàng nghìn connection. Ta cần tăng lên ít nhất 65536.
Thay đổi giới hạn cho user yugabyte (nếu chưa có user, tạo trước: sudo useradd -m yugabyte).
Chỉnh sửa file /etc/security/limits.conf:
sudo nano /etc/security/limits.conf
Thêm các dòng sau vào cuối file:
yugabyte soft nofile 65536
yugabyte hard nofile 65536
root soft nofile 65536
root hard nofile 65536
Để đảm bảo systemd cũng áp dụng giới hạn này cho service (vì systemd override limits.conf), ta cần chỉnh file service unit của YugabyteDB. Giả sử service tên là yugabyte.
Tạo file override cho systemd:
sudo mkdir -p /etc/systemd/system/yugabyte.service.d
cat > /etc/systemd/system/yugabyte.service.d/override.conf
Reload và restart systemd (nếu service đã chạy):
sudo systemctl daemon-reload
Kiểm tra giới hạn hiện tại cho user yugabyte (cần login vào user đó để test):
sudo -u yugabyte bash -c "ulimit -n"
Kết quả mong đợi: Đầu ra phải là 65536.
Kiểm tra giới hạn của systemd service (nếu đã khởi động):
systemctl show yugabyte | grep LimitNOFILE
Đầu ra phải hiển thị LimitNOFILE=65536.
Điều hướng series:
Mục lục: Series: Triển khai Database HTAP với YugabyteDB và Linux Kernel Tuning trên Ubuntu 24.04
« Phần 1: Chuẩn bị môi trường Ubuntu 24.04 và yêu cầu phần cứng cho YugabyteDB HTAP
Phần 3: Tinh chỉnh Linux Kernel (Part 2): Tối ưu hóa mạng và bộ nhớ mạng »