Tối ưu hóa ZFS ARC: Giới hạn, ngưỡng và các chỉ số cần đo lường
11 phút đọc - 24 tháng 6, 2026

Tối ưu hóa ZFS ARC theo khối lượng công việc. Các thông số nào quan trọng, cách thiết lập zfs_arc_max trên Linux và FreeBSD, và cách xác định khi nào quá trình tối ưu hóa đã hoàn tất.
Theo mặc định, ZFS sẽ âm thầm chiếm khoảng một nửa RAM hệ thống của bạn để làm bộ nhớ đệm đọc (read cache), và trên loại máy chủ không phù hợp, điều này có thể dẫn đến hoạt động swap, các quá trình bị ngắt do hết bộ nhớ (OOM kills) hoặc cơ sở dữ liệu phải cạnh tranh với hệ thống tệp để giành bộ nhớ. Việc tối ưu hóa ARC của ZFS liên quan đến việc quyết định lượng RAM mà ARC thực sự được phép giữ lại, cũng như những gì bạn phải hy sinh để thiết lập giới hạn đó. Bài viết này trình bày cách ARC sử dụng bộ nhớ, những chỉ số cần đo lường trước khi thực hiện bất kỳ thay đổi nào, một số thông số đáng điều chỉnh, cùng các điểm khởi đầu hợp lý cho máy chủ tệp, hypervisor, cơ sở dữ liệu và các mục tiêu sao lưu. Đối với tính năng snapshot của ZFS, hãy tham khảo hướng dẫn về snapshot ZFS của chúng tôi.
Hãy đo lường ARC trước khi điều chỉnh bất kỳ thông số nào
Không thay đổi bất kỳ thông số nào cho đến khi bạn có số liệu cơ sở từ một khoảng thời gian bận rộn bình thường. Các bản chụp nhanh trong khoảng thời gian ít hoạt động sẽ dẫn bạn đi sai hướng. Sao lưu hàng đêm, báo cáo hàng tuần và các tác vụ hàng loạt thường là những lúc hành vi ARC trở nên thú vị, vì vậy hãy thu thập dữ liệu trong vài ngày.
Ba công cụ sau đây đáp ứng hầu hết nhu cầu của bạn:
arcstat 1cung cấp chế độ xem cuộn trực tiếp các bộ đếm trúng và trượt, hoạt động theo nhu cầu so với hoạt động lấy trước, và kích thước ARC hiện tại. Sử dụng công cụ này trong các bài kiểm tra tải và các khung thời gian sao lưu.arc_summaryin ra một bản chụp nhanh duy nhất: kích thước ARC và mục tiêu, tỷ lệ phân chia MFU/MRU, tỷ lệ siêu dữ liệu và các thông số điều chỉnh đang hoạt động. Chạyarc_summary -s arcchỉ cho phần ARC.- Các chỉ số thô tồn tại trong
/proc/spl/kstat/zfs/arcstatstrên Linux và dướikstat.zfs.miscvàvfs.zfscây sysctl trên FreeBSD. Hãy trích xuất các thông số này từ hệ thống giám sát thay vì phân tích đầu ra đã được định dạng.
Các chỉ số cần ghi lại trước khi thực hiện bất kỳ thay đổi nào:
| Chỉ số | Nơi tìm thấy | Tại sao chỉ số này lại quan trọng |
|---|---|---|
Kích thước ARC, mục tiêu, giá trị tối đa (size, c, c_max) | arcstat, kstat | Cho biết liệu ARC đã đạt đến giới hạn tối đa hay vẫn còn dư địa để mở rộng |
| Tỷ lệ trúng của dữ liệu yêu cầu và siêu dữ liệu | arcstat, arc_summary | Các trường hợp không đáp ứng yêu cầu sẽ dẫn trực tiếp đến độ trễ của ứng dụng |
Bộ nhớ khả dụng và hoạt động trao đổi (si/so) | free -h, vmstat 1 | Hoạt động trao đổi vào/ra liên tục khi ARC ở mức lớn là dấu hiệu rõ ràng nhất của áp lực bộ nhớ |
Thời gian phục vụ đĩa (await) và mức sử dụng | iostat -x | Liên kết các trường hợp ARC không trúng với các điểm nghẽn lưu trữ thực tế |
memory_throttle_count | /proc/spl/kstat/zfs/arcstats | Số lượng tăng lên xác nhận rằng ZFS đang bị giới hạn do áp lực bộ nhớ |
Có hai điều mà mọi người thường nhầm lẫn ở đây. Hãy theo dõi bộ nhớ khả dụng, không phải bộ nhớ trống; Linux thường báo cáo mức RAM trống thấp như một trạng thái ổn định và điều đó bản thân nó không phải là vấn đề. Dấu hiệu quan trọng là bộ nhớ khả dụng gần bằng không kết hợp với hoạt động hoán đổi liên tục (tài liệu giới thiệu về quản lý bộ nhớ Linux giải thích lý do tại sao). Và hãy coi tỷ lệ trúng (hit ratio) như một xu hướng, chứ không phải là mục tiêu. Tỷ lệ trúng 99% trên một hệ thống đang thực hiện hoán đổi là một thất bại trong việc tối ưu hóa, chứ không phải là thành công.
Bốn thông số ARC quan trọng
Hầu hết việc điều chỉnh trong môi trường sản xuất đều tập trung vào bốn thông số này. Hãy điều chỉnh các thông số sao cho phù hợp với áp lực mà bạn đã đo được trong giai đoạn cơ sở. Hoạt động hoán đổi chỉ ra zfs_arc_max. Khôi phục các điểm churn liên tục xóa bộ nhớ cache nóng chỉ ra zfs_arc_min. Tốc độ quét thư mục chậm cho thấy giới hạn metadata.
| Tham số điều chỉnh | Chức năng | Khi nào cần thay đổi | Rủi ro nếu thiết lập sai |
|---|---|---|---|
zfs_arc_max | Giới hạn trên cứng về việc sử dụng RAM ARC | Chạy chung các cơ sở dữ liệu hoặc máy ảo (VM) cần bộ nhớ RAM được dành riêng | Quá thấp: tăng I/O đĩa và độ trễ. Quá cao: áp lực swap hoặc OOM. |
zfs_arc_min | Giới hạn dưới ngăn ARC thu hẹp quá mạnh | Các tải công việc có các đợt tăng đột biến bộ nhớ ngắn khiến bộ nhớ đệm bị xóa liên tục | Quá cao: làm các ứng dụng thiếu bộ nhớ trong tình huống áp lực bộ nhớ thực sự |
zfs_arc_meta_limit_percent | Tỷ lệ ARC dành cho metadata (thay thế cho thông số cũ zfs_arc_meta_limit) | Hàng triệu tệp nhỏ, cây thư mục sâu, chậm ls/find | Quá thấp: việc tìm kiếm thư mục diễn ra chậm chạp. Quá cao: làm cạn kiệt bộ nhớ đệm dữ liệu. |
zfs_arc_free_target | Lượng bộ nhớ hệ thống trống mà ZFS cố gắng duy trì sẵn có | Các máy chủ có các đợt phân bổ bộ nhớ đột ngột lớn (khởi động máy ảo, các kế hoạch truy vấn lớn) | Quá cao: ARC vẫn nhỏ ngay cả khi có RAM sẵn có |
Hãy bắt đầu với thay đổi nhỏ nhất có thể giải quyết áp lực mà bạn đang gặp phải. Đối với zfs_arc_max, mức trần phù hợp phụ thuộc vào khối lượng công việc (sẽ được đề cập trong phần tiếp theo). Đối với zfs_arc_min, mức sàn từ 25% đến 50% zfs_arc_max là điểm khởi đầu hợp lý nếu bạn thực sự cần thiết lập giới hạn này. Đối với siêu dữ liệu, các giá trị mặc định gần đây của OpenZFS đã phân bổ 75% dung lượng ARC cho siêu dữ liệu thông qua zfs_arc_meta_limit_percent, mức này đã rất dồi dào cho hầu hết các khối lượng công việc; chỉ nên điều chỉnh khi các lỗi metadata xuất hiện rõ ràng trong arcstat.
Áp dụng thay đổi trên Linux và FreeBSD
Trên Linux, hãy kiểm tra một thay đổi trong khi hệ thống đang chạy bằng cách ghi vào tệp tham số sysfs. Không cần khởi động lại:
echo 17179869184 > /sys/module/zfs/parameters/zfs_arc_maxĐiều này sẽ thiết lập zfs_arc_max thành 16 GiB ngay lập tức. Để thay đổi này vẫn tồn tại sau khi khởi động lại, hãy thêm nó vào /etc/modprobe.d/zfs.conf:
options zfs zfs_arc_max=17179869184Trên FreeBSD, các thay đổi trong thời gian chạy sử dụng sysctl:
sysctl vfs.zfs.arc_max=17179869184Duy trì cùng giá trị trong /boot/loader.conf:
vfs.zfs.arc_max="17179869184"Thay đổi từng cài đặt một, theo các bước nhỏ khoảng 10% tổng dung lượng RAM. Theo dõi cửa sổ hiển thị vấn đề. Chỉ giữ lại thay đổi nếu swap duy trì ở mức 0 và độ trễ ổn định. Chỉ lưu lại thay đổi sau khi kiểm tra trong quá trình chạy thành công.
Điều chỉnh ARC theo khối lượng công việc
Tổng dung lượng RAM không phải là điểm khởi đầu phù hợp. Việc xác định kích thước ARC nên dựa trên sự kết hợp của các tải công việc trên hệ thống.
| Tải công việc | Khởi động zfs_arc_max | Mức ưu tiên ARC | Ghi chú | Chỉ số chính |
|---|---|---|---|---|
| Máy chủ tệp chuyên dụng / NAS | 75% đến 80% dung lượng RAM | Dữ liệu và siêu dữ liệu | Bật tính năng Prefetch. Điểm mấu chốt là bộ nhớ đệm tích cực. | Tỷ lệ trúng tổng thể |
| Máy chủ ảo hóa | 30% đến 40% dung lượng RAM | Cân bằng | Dành dung lượng trống cho RAM của máy khách và các tác vụ của máy chủ. Bất kỳ giá trị nào khác 0 si/so có nghĩa là giới hạn thêm. | Bộ nhớ hoán đổi của máy chủ (si/so) |
| Máy chủ cơ sở dữ liệu | 25% đến 50% dung lượng RAM | Tập trung vào siêu dữ liệu | Hãy dành bộ nhớ cho DB engine trước. Đặt primarycache=metadata nếu công cụ tự quản lý bộ đệm cache của mình. | Số lần truy cập không trúng |
| Mục tiêu sao lưu / lưu trữ | Giới hạn thận trọng | Chỉ siêu dữ liệu | Đã thiết lập primarycache=metadata để quá trình quét một lần không loại bỏ các khối hữu ích. | Lỗi dự đoán trước, tỷ lệ trúng siêu dữ liệu |
| Phân tích / đọc lặp lại | Giới hạn cao hơn sau khi các bộ đệm khác đã được dành riêng | Tập dữ liệu làm việc (MFU) nặng | L2ARC trên NVMe có thể duy trì tập làm việc nóng trong suốt các lần chạy truy vấn. | Lỗi do yêu cầu |
Máy chủ VM cần chia sẻ bộ nhớ với các máy khách của mình, do đó giới hạn từ 30% đến 40% là mức mặc định an toàn và 50% đã là quá cao đối với hầu hết các bản dựng. Các cơ sở dữ liệu như PostgreSQL và MySQL tự quản lý bộ đệm của riêng mình, vì vậy bạn nên dành bộ nhớ cho động cơ trước và để ARC sử dụng phần còn lại. Các mục tiêu sao lưu được hưởng lợi từ primarycache=metadata vì dữ liệu đang được đọc hiếm khi được sử dụng lại, và bạn không muốn quá trình sao lưu hàng đêm quét toàn bộ vùng nhớ và xóa phần còn lại của bộ đệm trong quá trình đó. Đối với mọi tải công việc, hoạt động trao đổi (swap) khi ARC bị khóa ở zfs_arc_max có nghĩa là giới hạn này quá cao; quy tắc đó không thay đổi.
Chẩn đoán sự cố và biết khi nào nên dừng lại
ARC có dung lượng quá nhỏ sẽ biểu hiện dưới dạng IOPS đọc cao, tỷ lệ truy cập yêu cầu thấp và duyệt thư mục chậm trong khi hệ thống vẫn còn RAM trống. ARC có dung lượng quá lớn thì ít rõ ràng hơn. Tỷ lệ truy cập có vẻ ổn, nhưng máy bắt đầu hoán đổi, tải trung bình tăng cao, các tiến trình bị chặn trong D trong khi kernel thu hồi các trang ARC theo yêu cầu, và trong trường hợp xấu nhất, OOM killer bắt đầu chọn các nạn nhân. Bộ nhớ cache trông vẫn ổn nhưng máy chủ hoạt động rất chậm.
Áp lực siêu dữ liệu xuất hiện khi demand_metadata_bytes cao hơn nhiều so với demand_data_bytes trong arc_summary. Đó là lúc metadata đang tranh giành không gian với dữ liệu, và giới hạn phần trăm metadata đáng được nâng lên.
So sánh những gì bạn thấy với cài đặt đầu tiên cần kiểm tra:
| Triệu chứng | Nguyên nhân có thể | Tham số đầu tiên cần kiểm tra | Bước tiếp theo |
|---|---|---|---|
Cao await với số lần bỏ lỡ yêu cầu cao | Bộ nhớ làm việc vượt quá ARC | zfs_arc_max | Thêm RAM hoặc thêm L2ARC |
| Hoạt động trao đổi khi ARC lớn | ARC làm hệ điều hành hoặc ứng dụng thiếu bộ nhớ | zfs_arc_max | Giảm giới hạn |
| Hiệu suất giảm sút sau khi bộ nhớ tăng đột biến | Quá trình loại bỏ dữ liệu diễn ra mạnh mẽ trong quá trình thu hồi bộ nhớ | zfs_arc_min | Đặt mức sàn từ 25% đến 50% của arc_max |
Chậm ls, find, các thao tác với tệp nhỏ | Thiếu hụt bộ nhớ đệm siêu dữ liệu | zfs_arc_meta_limit_percent | Tăng tỷ lệ phần trăm metadata |
Tăng memory_throttle_count | Áp lực bộ nhớ trên toàn hệ thống | zfs_arc_max | Giảm giới hạn; kiểm tra tình trạng phình to của chỉ mục L2ARC |
L2ARC không phải là miễn phí. Chỉ mục cho các mục L2ARC nằm trong ARC chính, và nếu chi phí này vượt quá khoảng một phần ba tổng dung lượng ARC, bộ nhớ đệm thứ cấp sẽ gây hại nhiều hơn lợi. Chỉ nên sử dụng L2ARC khi tập dữ liệu làm việc lớn hơn RAM nhưng vẫn vừa với thiết bị NVMe nhanh, và chỉ khi tỷ lệ trúng của ARC chính đã ở mức ổn định.
Thời điểm thích hợp để ngừng tối ưu hóa là khi độ trễ ổn định, việc trao đổi bộ nhớ (swap) duy trì ở mức 0 trong cùng khoảng thời gian tải cao đã gây ra vấn đề ban đầu, và các thay đổi tiếp theo không còn mang lại cải thiện nào. Tỷ lệ trúng cao không có ý nghĩa gì nếu máy chủ đang thực hiện trao đổi bộ nhớ. Sau điểm đó, hãy ngừng điều chỉnh cài đặt và chỉ xem xét lại chúng nếu vấn đề tương tự tái diễn dưới cùng tải công việc.
Nếu bạn cần một máy chủ có dung lượng RAM dư dả để chạy ZFS một cách hiệu quả mà không phải cạnh tranh bộ nhớ với các máy ảo (VM) hoặc cơ sở dữ liệu (bạn nên đọc bài viết về lượng RAM thực sự cần thiết trước tiên), hãy tham khảo các máy chủ chuyên dụng FDC.

Mỏi mắt do sử dụng thiết bị kỹ thuật số: Cách bảo vệ thị lực trong thế giới ngập tràn màn hình
Cả ngày chỉ nhìn vào màn hình? Hãy tìm hiểu cách giảm mỏi mắt do sử dụng thiết bị kỹ thuật số với các kỹ thuật và công cụ đã được chứng minh hiệu quả. Hướng dẫn này rất cần thiết cho những người làm việc từ xa, các nhà phát triển và bất kỳ ai làm việc trong lĩnh vực công nghệ.
4 phút đọc - 21 tháng 5, 2025
Tại sao việc sở hữu một VPS mạnh mẽ và không giới hạn băng thông lại quan trọng
8 phút đọc - 9 tháng 5, 2025

Bạn có thắc mắc hoặc cần giải pháp tùy chỉnh?
Các tùy chọn linh hoạt
Phạm vi toàn cầu
Triển khai ngay lập tức
Các tùy chọn linh hoạt
Phạm vi toàn cầu
Triển khai ngay lập tức