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

hero section cover
Mục lục
  • Hãy đo lường ARC trước khi điều chỉnh bất kỳ thông số nào
  • Bốn thông số ARC quan trọng
  • Điều chỉnh ARC theo khối lượng công việc
  • Chẩn đoán sự cố và biết khi nào nên dừng lại
Chia sẻ

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 1 cung 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_summary in 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ạy arc_summary -s arc chỉ cho phần ARC.
  • Các chỉ số thô tồn tại trong /proc/spl/kstat/zfs/arcstats trên Linux và dưới kstat.zfs.miscvfs.zfs câ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ấyTạ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, kstatCho 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ệuarcstat, arc_summaryCá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 1Hoạ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ụngiostat -xLiê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/arcstatsSố 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ỉnhChức năngKhi nào cần thay đổiRủi ro nếu thiết lập sai
zfs_arc_maxGiới hạn trên cứng về việc sử dụng RAM ARCChạy chung các cơ sở dữ liệu hoặc máy ảo (VM) cần bộ nhớ RAM được dành riêngQuá thấp: tăng I/O đĩa và độ trễ. Quá cao: áp lực swap hoặc OOM.
zfs_arc_minGiới hạn dưới ngăn ARC thu hẹp quá mạnhCá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ụcQuá 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_percentTỷ 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/findQuá 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_targetLượ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=17179869184

Trên FreeBSD, các thay đổi trong thời gian chạy sử dụng sysctl:

sysctl vfs.zfs.arc_max=17179869184

Duy 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ệcKhởi động zfs_arc_maxMức ưu tiên ARCGhi chúChỉ số chính
Máy chủ tệp chuyên dụng / NAS75% đến 80% dung lượng RAMDữ liệu và siêu dữ liệuBậ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óa30% đến 40% dung lượng RAMCân bằngDà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ệu25% đến 50% dung lượng RAMTập trung vào siêu dữ liệuHã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ọngChỉ 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ạiGiới hạn cao hơn sau khi các bộ đệm khác đã được dành riêngTập dữ liệu làm việc (MFU) nặngL2ARC 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ư PostgreSQLMySQL 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ứngNguyên nhân có thểTham số đầu tiên cần kiểm traBước tiếp theo
Cao await với số lần bỏ lỡ yêu cầu caoBộ nhớ làm việc vượt quá ARCzfs_arc_maxThêm RAM hoặc thêm L2ARC
Hoạt động trao đổi khi ARC lớnARC làm hệ điều hành hoặc ứng dụng thiếu bộ nhớzfs_arc_maxGiảm giới hạn
Hiệu suất giảm sút sau khi bộ nhớ tăng đột biếnQuá 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ệuzfs_arc_meta_limit_percentTăng tỷ lệ phần trăm metadata
Tăng memory_throttle_countÁp lực bộ nhớ trên toàn hệ thốngzfs_arc_maxGiả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.

Blog

Nổi bật trong tuần

Các bài viết khác
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

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

Các bài viết khác
background image

Bạn có thắc mắc hoặc cần giải pháp tùy chỉnh?

icon

Các tùy chọn linh hoạt

icon

Phạm vi toàn cầu

icon

Triển khai ngay lập tức

icon

Các tùy chọn linh hoạt

icon

Phạm vi toàn cầu

icon

Triển khai ngay lập tức