Chắc hẳn bạn biết rằng việc đọc dữ liệu từ RAM (memory) nhanh hơn nhiều so với đọc dữ liệu từ ổ đĩa cứng (hard disk), và giảm disk I/O (Input/Output operations per second) đáng kể. Trong bài viết này, mình sẽ hướng dẫn các bạn cách lưu trữ files và directories trên memory thay vì lưu trên ổ đĩa cứng với tmpfs (một hệ thống file cho việc tạo memory device). Đây là ý tưởng để sử dụng làm file caches và dữ liệu tạm thời (như file session PHP nếu bạn đang sử dụng session.save_handler = files) bởi vì dữ liệu sẽ bị mất khi bạn tắt hoặc bởi động lại hệ thống. Trước hết chúng ta sẽ cùng tìm hiểu về RAMFS và TMPFS trên linux.
Tổng quan RAMFS và TMPFS
Sử dụng RAMFS và TMPFS, bạn có thể phân bổ một phần bộ nhớ vật lý (physical memory) và sẽ được dùng như một phân vùng (partition). Bạn có thể mount phân vùng này và bắt đầu đọc và ghi file như một phân vùng đĩa cứng. Vì bạn sẽ đọc và ghi dữ liệu vào RAM, nên nó sẽ nhanh hơn.
Khi một process trở nên chậm chạp vì ghi đĩa, bạn có thể chọn file system ramfs hoặc tmpfs cho việc ghi file tới RAM.
Cả hai cách thức mount tmpfs và ramfs đều cung cấp cho bạn khả năng đọc và ghi file nhanh từ và tới memory. Khi bạn kiểm tra tốc độ thực sự trên file nhỏ, bạn sẽ không thấy được sự khác biệt lớn. Bạn chỉ có thể ghi nhận được sự khác biệt thực sự chỉ khi bạn ghi một lượng dữ liệu lớn tới file.
So sánh Ramfs và Tmpfs
Ramfs và Tmpfs đều có một số chức năng tương tự, chỉ với một vài khác biệt nhỏ như sau:
- Ramfs sẽ phát triển động (dynamic). Bạn cần kiểm soát các process ghi dữ liệu để đảm bảo ramfs không vượt quá kích thước RAM khả dụng trong hệ thống. Giả sử bạn có 2GB RAM và tạo 1 GB ramfs và mount tới /tmp/ram. Khi tổng kích cỡ của /tmp/ram vượt quá 1GB, bạn có thể vẫn ghi dữ liệu tới nó. Hệ thống sẽ không dừng việc ghi dữ liệu lớn hơn 1GB. Tuy nhiên, khi vượt quá lượng RAM 2GB, hệ thống có thể sẽ bị treo, vì không có chỗ để lưu dữ liệu nữa.
- Tmpfps sẽ phát triển tĩnh (static). Nó sẽ không cho phép bạn ghi nhiều hơn kích cỡ dung lượng bạn đã chỉ định khi mount tmpfs. Như vậy, bạn không cần phải lo lắng về vấn đề việc kiểm soát process ghi dữ liệu để đảm bảo tmpfs không vượt quá giới hạn chỉ định. Nó có thể đưa ra các lỗi tương tự như “No space left on device”
- Tmpfs dùng swap
- Ramfs không dùng swap
Nhược điểm của ramfs và tmpfs
Vì cả hai ramfs và tmpfs dùng để ghi dữ liệu tới RAM, nó sẽ khởi động lại khi hệ thống khởi động lại hoặc bị hỏng. Vì vậy, bạn nên viết một process để nhận dữ liệu từ ramfs/tmpfs tới disk trong một khoảng thời gian. Bạn cũng có thể viết một process để ghi xuống dữ liệu từ ramfs/tmpfs tới disk trong khi hệ thống đang tắt. Nhưng, điều này sẽ không giúp bạn trong thời gian xảy ra sự cố.
Cách tạo RAM Disk sử dụng tmpfs
Tạo thư mục để mount tmpfs
Trước hết, tạo một thư mục để lưu trữ dữ liệu được lưu trên RAM, bạn có thể tạo thư mục đó ở bất cứ đâu, miễn sao thư mục đó không phải là phân vùng được mount bởi hệ thống.
mkdir -p /usr/local/RAMDisk
Cần phải đảm bảo người dùng thư mục này có full quyền, tương ứng mới chmod = 777
chmod 777 /usr/local/RAMDisk
Tiếp theo bạn cần xác định lượng RAM Disk bạn sẽ sử dụng trong tương lai là bao nhiêu để lưu trữ dữ liệu. Nếu RAM của bạn có nhiều dung lượng thì bạn không cần phải lo lắng nhiều, còn trong trường hợp RAM của bạn có ít, bạn cần phải cân nhắc sử dụng lượng RAM Disk cho thư mục mới tạo hợp lý. Trong bài viết này, mình sẽ sử dụng 100MB cho RAM Disk.
Mount filesystem với tmpfs
Cấu trúc lệnh mount sẽ như sau:
mount -t <list> -o size=<Size> <FSTYPE> <MountPoint>
Trong đó:
<list>: là loại RAM Disk mình sẽ sử dụng, có thể là tmpfs hoặc ramfs
<Size>: là dung lượng từ RAM sẽ được sử dụng cho filesystem chuẩn bị mount
<FSTYPE>: là format filesystem, ta có thể chọn tmpfs, ramfs, ext4,...
<MountPoint>: là vị trí thư mục sẽ mount
Tiến hành mount filesystem
mount -t tmpfs -o size=100mb tmpfs /usr/local/RAMDisk
Kiểm tra xem phân vùng này đã được mount chưa
mount | grep 'tmpfs' | grep '/usr/local/RAMDisk'
Trong trường hợp máy tính của bạn khởi động lại, mà không được cấu hình auto-mount, thì sẽ không tồn tại phân vùng ‘/usr/local/RAMDisk’. Do đó, để cấu hình auto-mount mỗi khi khởi động lại máy, chúng ta sẽ thêm dòng cấu hình trong fstab tại vị trí /etc/fstab.
echo 'tmpfs /usr/local/RAMDisk tmpfs nodev,nosuid,noexec,nodiratime,size=1024M 0 0' >> /etc/fstab
Umount filesystem với tmpfs khi không muốn sử dụng nữa
Trong trường hợp bạn không muốn sử dụng RAM Disk nữa, bạn có thể sẽ muốn umount để lấy lượng lượng RAM kia bằng lệnh sau.
umount /usr/local/RAMDisk