Đừng lãng phí SSD của bạn: Sử dụng tmpfs để tăng tốc I/O trên Linux

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

Nghẽn cổ chai vô hình: Tại sao SSD thôi là chưa đủ

Lưu trữ đã tiến hóa nhanh chóng từ những phiến đĩa quay của HDD cũ kỹ sang hiệu suất bùng nổ của các ổ NVMe hiện đại. Tuy nhiên, ngay cả một ổ SSD Gen4 hàng đầu cũng vấp phải rào cản khi xử lý hàng nghìn tệp nhỏ, tồn tại ngắn hạn. Nếu bạn từng biên dịch một dự án C++ đồ sộ hoặc quản lý một cơ sở dữ liệu lưu lượng cao, có lẽ bạn đã thấy CPU nhàn rỗi trong khi chờ đợi đĩa cứng. Sự chậm trễ này chính là nghẽn cổ chai I/O điển hình.

Tốc độ không phải là mối quan tâm duy nhất; tuổi thọ ổ đĩa cũng rất quan trọng. Mỗi chu kỳ ghi lại đưa SSD của bạn tiến gần hơn đến giới hạn tuổi thọ. Đối với dữ liệu chỉ cần tồn tại đến lần khởi động lại tiếp theo—như tệp phiên (session), sản phẩm build, hoặc cache—việc tiêu tốn chỉ số Terabytes Written (TBW) của SSD là một sự lãng phí. Sau nhiều năm quản lý hàng tá node Linux, tôi nhận thấy việc chuyển các tệp “dùng xong rồi bỏ” này sang tmpfs là cách tối ưu hóa ít tốn công nhất nhưng mang lại hiệu quả cao nhất.

Nguyên nhân gốc rễ: Độ trễ và các lớp trừu tượng

Tất cả các đĩa vật lý tương tác với kernel thông qua nhiều lớp trừu tượng. Mỗi yêu cầu ghi phải được bộ điều khiển (controller) xác nhận, tạo ra độ trễ. Trong khi một ổ NVMe cao cấp có thể có độ trễ 50-100 micro giây, RAM hệ thống hoạt động trong phạm vi nano giây. Tức là nhanh hơn gần 1.000 lần. Khi một tiến trình tạo ra hàng nghìn tệp nhỏ, sự khác biệt về tốc độ này trở nên cực kỳ lớn.

Đó là lúc tmpfs xuất hiện. Hệ thống tệp tạm thời này nằm trực tiếp trong bộ nhớ ảo của Linux kernel. Không giống như các RAM disk truyền thống chiếm một khối bộ nhớ cố định ngay từ đầu, tmpfs có tính co giãn. Nó chỉ tiêu thụ những gì nó thực sự sử dụng. Nếu bạn mount một ổ tmpfs 4GB nhưng chỉ lưu 50MB log, hệ thống của bạn chỉ mất 50MB RAM khả dụng. Nó hiệu quả, nhanh chóng và vô cùng linh hoạt.

Thiết lập tmpfs: Cải thiện hiệu suất tức thì

Điểm tuyệt vời nhất? Bạn không cần cài đặt bất cứ thứ gì. tmpfs đã được tích hợp sẵn trong Linux kernel. Bạn có thể tạo một ổ đĩa tốc độ cao chỉ trong vài giây bằng cách mount một thư mục.

Tạo một Mount tạm thời

Hãy tưởng tượng bạn sắp biên dịch một dự án và muốn ngăn thư mục build “hành hạ” ổ đĩa của mình. Bạn có thể tạo một điểm mount và gán 2GB RAM for nó chỉ với một lệnh:

sudo mkdir -p /mnt/ramdisk
sudo mount -t tmpfs -o size=2G tmpfs /mnt/ramdisk

Nếu bạn không chỉ định kích thước, Linux mặc định sẽ dùng 50% tổng dung lượng RAM. Điều này thường là an toàn. Nếu bộ nhớ sắp hết, Linux có thể chuyển dữ liệu tmpfs sang vùng hoán đổi (swap) trên đĩa. Tuy nhiên, hãy nhớ rằng việc dùng swap sẽ làm mất đi lợi ích hiệu suất mà bạn đang tìm kiếm.

Cấu hình RAM Disk vĩnh viễn qua fstab

Đối với các tác vụ cố định—như di dời /tmp hoặc cache của web server—yêu cầu RAM disk phải tồn tại sau khi khởi động lại, bạn nên định nghĩa điểm mount trong /etc/fstab.

Mở tệp bằng trình soạn thảo bạn chọn:

sudo nano /etc/fstab

Thêm dòng sau vào cuối tệp:

tmpfs   /var/www/cache   tmpfs   rw,size=1G,nr_inodes=10k,mode=1777   0   0

Hãy cùng phân tích các cờ (flag) đó:

  • rw: Cấp quyền đọc và ghi đầy đủ.
  • size=1G: Giới hạn mount ở mức 1 gigabyte. Bạn cũng có thể dùng tỷ lệ phần trăm như size=15%.
  • nr_inodes=10k: Giới hạn hệ thống tệp ở mức 10.000 tệp. Điều này ngăn một script bị lỗi tạo ra hàng triệu tệp 0-byte và làm treo hệ thống của bạn.
  • mode=1777: Thiết lập quyền sticky bit. Bất kỳ ai cũng có thể ghi, nhưng người dùng chỉ có thể xóa tệp của chính họ.

Các trường hợp sử dụng thực tế cho RAM Disk

Tôi sử dụng tmpfs hàng ngày để giải quyết các vấn đề đau đầu về hiệu suất. Dưới đây là ba lĩnh vực mà nó tỏa sáng:

1. Tăng tốc biên dịch mã nguồn

Các trình biên dịch nổi tiếng với việc tạo ra hàng nghìn tệp trung gian .o hoặc .rlib. Chuyển thư mục build sang RAM có thể cắt giảm đáng kể thời gian biên dịch—tôi đã thấy những lần build 10 phút giảm xuống còn 7 phút trên phần cứng tiêu chuẩn.

# Liên kết thư mục build của dự án với RAM
mkdir /mnt/ramdisk/project-build
ln -s /mnt/ramdisk/project-build ./build

2. Đẩy nhanh các thao tác cơ sở dữ liệu

Các truy vấn SQL phức tạp thường tạo ra các bảng tạm thời khổng lồ. Bằng cách trỏ thư mục tạm của cơ sở dữ liệu sang tmpfs, bạn sẽ giảm tải I/O từ đĩa sang bộ nhớ. Đối với MySQL hoặc MariaDB, chỉ cần cập nhật cài đặt tmpdir trong my.cnf:

[mysqld]
tmpdir = /mnt/ramdisk

3. Cứu SSD khỏi bộ nhớ đệm trình duyệt

Các trình duyệt như Chrome và Firefox ghi dữ liệu rất khủng khiếp. Chúng có thể dễ dàng đổ 1GB dữ liệu cache vào ổ đĩa của bạn chỉ trong một buổi chiều. Chuyển các cache này sang RAM giúp trình duyệt phản hồi nhanh hơn và kéo dài tuổi thọ SSD. Các công cụ như profile-sync-daemon giúp tự động hóa quá trình này trên hầu hết các bản phân phối Linux.

Kiểm tra và Giám sát

Giám sát là tối quan trọng. Vì tmpfs nằm trong bộ nhớ, việc đạt đến giới hạn có thể khiến ứng dụng bị lỗi hoặc kích hoạt trình OOM (Out Of Memory) killer của Linux.

Kiểm tra mức sử dụng

Lệnh df tiêu chuẩn hoạt động hoàn hảo để theo dõi RAM disk:

df -h /mnt/ramdisk

Lệnh này hiển thị mức sử dụng và giới hạn hiện tại. Để xem tổng lượng RAM đang được sử dụng, hãy chạy free:

free -h

Hãy nhìn vào cột “shared”; đó thường là nơi ẩn náu của mức sử dụng tmpfs.

Thay đổi kích thước tức thì

Nếu bạn hết dung lượng giữa chừng, đừng hoảng loạn. Bạn có thể thay đổi kích thước ổ đĩa ngay lập tức mà không cần unmount hoặc làm mất dữ liệu:

sudo mount -o remount,size=4G /mnt/ramdisk

Lệnh này cập nhật giới hạn ngay lập tức. Đây là “phao cứu sinh” khi một quá trình build đồ sộ đã hoàn thành 90% và đột nhiên cần thêm không gian để thở.

Một lời cảnh báo cuối cùng

Mọi thứ trong tmpfs đều dễ bay hơi. Nếu mất điện hoặc hệ thống khởi động lại, mọi tệp trong thư mục đó sẽ biến mất. Chỉ sử dụng tmpfs for dữ liệu đã được sao lưu hoặc có thể tạo lại dễ dàng. Hãy nghe lời khuyên từ một người từng trải: Tôi từng nhầm lẫn đặt một tệp log quan trọng đang chạy trên RAM disk mà không có script đồng bộ. Máy chủ khởi động lại sau một bản cập nhật kernel, và dữ liệu kiểm tra của một tuần đã biến mất mãi mãi. Chỉ sử dụng nó for dữ liệu “dùng xong rồi bỏ” thôi.

Share: