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 mã 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: Điều này đề cập đến việc 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 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: Đây là ví dụ cụ thể để minh họa nguyên tắc trên. 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 viết vào tham số mô-đun zfs_arc_max trực tiếp:
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 tập tin /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ạm thời) đặ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: Nếu hệ thống file gốc của bạn là ZFS, 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 vấn đề zfs_arc_max / /etc/modprobe.d/zfs.conf dường như bị bỏ qua trong Proxmox”. Điều này có nghĩa là người dùng đ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 tính đến cài đặt này.
Giải pháp:
Người dùng đã giải quyết được vấn đề bằng cách thêm phiên bản kernel cụ thể “5.4.44-1-pve” vào lệnh update-initramfs
. Dưới đây là phân tích giải pháp:
- Thiết lập zfs_arc_max:
- Trong
/etc/modprobe.d/zfs.conf
, người dùng đặ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:
- Người dùng chạy lệnh sau:
update-initramfs -k 5.4.44-1-pve -u
- Lệnh này cập nhật hệ thống tệp RAM ban đầu (initramfs) với phiên bản kernel cụ thể “5.4.44-1-pve”.
- Người dùng chạy lệnh sau:
- Khởi động lại:
- Người dùng 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 với các bản vá và mô-đun 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
, người dùng đảm bảo rằng initramfs chứa các mô-đun 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.
Lưu ý bổ sung:
- Giải pháp được cung cấp là dành riêng cho Proxmox và phiên bản kernel cụ thể.
- Nếu bạn đang sử dụng phiên bản Proxmox hoặc kernel khác, lệnh chính xác có thể hơi khác.
- Luôn tham khảo tài liệu hoặc diễn đàn chính thức của Proxmox để biết hướng dẫn cụ thể và mẹo khắc phục sự cố.
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
Lệnh vi /etc/modprobe.d/zfs.conf
sẽ mở file /etc/modprobe.d/zfs.conf
trong trình soạn thảo văn bản. Bạn có thể thay đổi các giá trị zfs_arc_max
và zfs_arc_min
tùy theo nhu cầu của mình.
Lệnh update-initramfs -k 5.4.44-1-pve -u
sẽ cập nhật initramfs với phiên bản kernel 5.4.44-1-pve.
Lệnh reboot
sẽ khởi động lại hệ thống.