ZFS (Zettabyte File System) là một hệ thống file và quản lý lưu trữ hiệu nâng cao được sử dụng trong các hệ thống máy chủ và lưu trữ. Trong hệ thống ZFS, có một khái niệm gọi là Adaptive Replacement Cache (ARC), đó là một phần của bộ nhớ chính (RAM) được sử dụng để lưu trữ dữ liệu lưu trữ và metadata nhằm tăng cường hiệu suất I/O của hệ thống.
Một điểm quan trọng của ARC là việc cấp phát đủ bộ nhớ cho nó, vì nó có thể giúp cải thiện hiệu suất I/O tổng thể của hệ thống ZFS. Tuy nhiên, việc cấp phát nhiều bộ nhớ quá cũng có thể gây ảnh hưởng đến các ứng dụng khác trên hệ thống.
Cụ thể như sau:
- Mặc định, ZFS sử dụng 50% bộ nhớ chính của máy chủ để tạo ARC.
- Việc cấp phát đủ bộ nhớ cho ARC quan trọng để tăng hiệu suất I/O, vì vậy việc giảm nó cần thận trọng.
- Bạn có thể thay đổi giới hạn sử dụng ARC cho phiên khởi động hiện tại (khi khởi động lại, thay đổi này sẽ được đặt lại).
- Đoạn config này cho phép bạn thay đổi giới hạn sử dụng ARC cho phiên khởi động hiện tại bằng cách ghi giá trị mới vào tham số
zfs_arc_max
của module ZFS.
- Một nguyên tắc cơ bản là cấp phát ít nhất 2 GiB bộ nhớ cơ bản cộng với 1 GiB cho mỗi TiB lưu trữ. Ví dụ, nếu bạn có một pool có 8 TiB không gian lưu trữ, bạn nên sử dụng ít nhất 10 GiB bộ nhớ cho ARC.
- Nguyên tắc cơ bản: Đây là một quy tắc căn bản và chung chung.
- Cấp phát ít nhất 2 GiB bộ nhớ cơ bản: Bạn nên cấp phát ít nhất 2 gigabyte (GiB) của bộ nhớ cơ bản (base memory). Bộ nhớ cơ bản ở đây là một phần của bộ nhớ RAM mà hệ thống ZFS sử dụng.
- Cộng với 1 GiB cho mỗi TiB lưu trữ: Bạn nên cộng thêm 1 gigabyte (GiB) cho mỗi terabyte (TiB) của không gian lưu trữ mà hệ thống ZFS quản lý. Terabyte và gigabyte là các đơn vị đo lường dung lượng.
Ví dụ 1: Nếu hệ thống ZFS của bạn quản lý một pool lưu trữ với 8 terabyte không gian lưu trữ, thì theo nguyên tắc, bạn nên cấp phát ít nhất 2 GiB bộ nhớ cơ bản cộng thêm 8 GiB (1 GiB * 8 TiB) để sử dụng cho ARC, tổng cộng là 10 GiB.
Ví dụ 2: Nếu bạn có một hệ thống ZFS với 24 terabyte (TiB) không gian lưu trữ (dung lượng 24TB mà bạn đề cập thường là dung lượng thực tế của các ổ đĩa cộng lại trong hệ thống)
, bạn có thể áp dụng nguyên tắc để tính toán bộ nhớ cho ARC như sau:
- Cấp phát ít nhất 2 GiB bộ nhớ cơ bản.
- Cộng thêm 1 GiB cho mỗi TiB lưu trữ.
Với 24 TiB lưu trữ, bạn có thể tính như sau:
2 GiB (bộ nhớ cơ bản) + 24 GiB (1 GiB * 24 TiB) = 26 GiB
Vì vậy, bạn nên cấp phát ít nhất 26 GiB bộ nhớ cho ARC trong trường hợp có 24 TiB không gian lưu trữ. Tuy nhiên, hãy lưu ý rằng việc cấp phát bộ nhớ cho ARC cần được thực hiện cẩn thận, vì quá nhiều bộ nhớ cho ARC có thể ảnh hưởng đến các ứng dụng khác trong hệ thống.
Bạn có thể thay đổi giới hạn sử dụng ARC cho phiên khởi động hiện tại (một lần khởi động lại sẽ đặt lại thay đổi này) bằng cách sửa trực tiếp tham số zfs_arc_max:
echo "$[10 * 1024*1024*1024]" >/sys/module/zfs/parameters/zfs_arc_max
Để thay đổi vĩnh viễn các giới hạn ARC, thêm dòng sau vào file /etc/modprobe.d/zfs.conf:
options zfs zfs_arc_max=8589934592
Ví dụ trên đặt giới hạn sử dụng là 8 GiB (8 * 2^30).
Quan trọng: Trong trường hợp giá trị zfs_arc_max mong muốn của bạn thấp hơn hoặc bằng zfs_arc_min (mặc định là 1/32 tổng bộ nhớ hệ thống), zfs_arc_max sẽ bị bỏ qua trừ khi bạn cũng đặt zfs_arc_min ít hơn hoặc bằng zfs_arc_max – 1.
echo "$[8 * 1024*1024*1024 - 1]" >/sys/module/zfs/parameters/zfs_arc_min
echo "$[8 * 1024*1024*1024]" >/sys/module/zfs/parameters/zfs_arc_max
Ở ví dụ trên đặt giới hạn sử dụng là 8 GiB (8 * 2^30) trên các hệ thống có hơn 256 GiB bộ nhớ tổng cộng, nơi việc chỉ đặt zfs_arc_max đơn thuần không hoạt động.
Quan trọng: Bạn phải cập nhật initramfs mỗi khi giá trị này thay đổi:
update-initramfs -u -k all
Bạn cần khởi động lại để áp dụng các thay đổi này.
Giải thích vấn đề và giải pháp một câu hỏi tôi đọc được.
Câu hỏi là làm thế nào để giải quyết việc zfs_arc_max trong file /etc/modprobe.d/zfs.conf bị bỏ qua trong Proxmox
. Điều này có nghĩa là họ đang cố gắng đặt dung lượng RAM tối đa được sử dụng bởi ZFS (zfs_arc_max) thông qua file /etc/modprobe.d/zfs.conf
, nhưng có vẻ như Proxmox không áp dụng cài đặt này.
Giải pháp:
Vấn đề sẽ được giải quyết bằng cách thêm phiên bản kernel cụ thể “5.4.44-1-pve” vào lệnh update-initramfs
.
- Thiết lập zfs_arc_max:
- Trong
/etc/modprobe.d/zfs.conf
đặt các tham số sau:zfs_arc_max=8589934592
(RAM tối đa được sử dụng bởi ZFS)zfs_arc_min=1073741824
(RAM tối thiểu được sử dụng bởi ZFS)
- Trong
- Cập nhật initramfs:
- Chạy lệnh sau:
update-initramfs -k 5.4.44-1-pve -u
- Lệnh này cập nhật initramfs với phiên bản kernel cụ thể “5.4.44-1-pve”.
- Khởi động lại:
- Khởi động lại hệ thống để các thay đổi có hiệu lực.
Lý do thêm phiên bản kernel:
- Proxmox sử dụng kernel tùy chỉnh cùng với các bản vá và module bổ sung.
- Các cài đặt
modprobe.d/zfs.conf
có thể chỉ được áp dụng khi sử dụng phiên bản kernel tương ứng. - Bằng cách chỉ định phiên bản kernel chính xác (“5.4.44-1-pve”) trong lệnh
update-initramfs
, chúng ta đảm bảo rằng initramfs chứa các module và cài đặt cần thiết cho phiên bản kernel cụ thể đó, cho phép cài đặtzfs_arc_max
được nhận dạng và áp dụng.
Ví dụ:
Nếu bạn đang sử dụng phiên bản Proxmox 7.2 và kernel 5.4.44-1-pve, bạn sẽ sử dụng các lệnh sau:
vi /etc/modprobe.d/zfs.conf
#Max Ram Used by ZFS
options zfs zfs_arc_max=8589934592
#Min Ram Used by ZFS
options zfs zfs_arc_min=1073741824
update-initramfs -k 5.4.44-1-pve -u
reboot