Tại sao cài đặt arc_max không được vinh danh trên ZFS trên Linux?


20

Tôi đang chạy ZoL 0.6.2 từ PPA của họ trên Ubuntu 12.04. Đó là trên một máy chủ có bộ nhớ 16GB dự định chạy một số máy ảo sử dụng KVM / Libvirt. Sau một thời gian, ZoL đang sử dụng một lượng bộ nhớ điên rồ, đạt 98% mức sử dụng RAM với một số máy ảo đang chạy. Điều này dẫn đến các quy trình mới từ chối bắt đầu "không thể phân bổ bộ nhớ". Tôi thậm chí không thể khởi động tất cả các máy ảo của mình nữa mà trước khi sử dụng ZFS đã sử dụng khoảng 40-50% RAM.

Theo tôi hiểu, không cần tinh chỉnh, ZoL nên giải phóng bộ nhớ ngay khi hệ thống bị thiếu bộ nhớ. Vâng, nó không. Vì vậy, tôi quyết định đặt arc_maxcài đặt thành 1GB.

# echo 1073741824 >> /sys/module/zfs/parameters/zfs_arc_max

Tuy nhiên, nó không giải phóng bất kỳ bộ nhớ.

Như bạn có thể thấy trong các thống kê ARC bên dưới, nó sử dụng nhiều bộ nhớ hơn so với cấu hình (so sánh c= 7572030912với c_max= 1073741824).

Tôi làm gì sai ở đây?

# cat /proc/spl/kstat/zfs/arcstats
4 1 0x01 84 4032 43757119584 392054268420115
name                            type data
hits                            4    28057644
misses                          4    13975282
demand_data_hits                4    19632274
demand_data_misses              4    571809
demand_metadata_hits            4    6333604
demand_metadata_misses          4    289110
prefetch_data_hits              4    1903379
prefetch_data_misses            4    12884520
prefetch_metadata_hits          4    188387
prefetch_metadata_misses        4    229843
mru_hits                        4    15390332
mru_ghost_hits                  4    1088944
mfu_hits                        4    10586761
mfu_ghost_hits                  4    169152
deleted                         4    35432344
recycle_miss                    4    701686
mutex_miss                      4    35304
evict_skip                      4    60416647
evict_l2_cached                 4    0
evict_l2_eligible               4    3022396862976
evict_l2_ineligible             4    1602907651584
hash_elements                   4    212777
hash_elements_max               4    256438
hash_collisions                 4    17163377
hash_chains                     4    51485
hash_chain_max                  4    10
p                               4    1527347963
c                               4    7572030912
c_min                           4    1038188800
c_max                           4    1073741824
size                            4    7572198224
hdr_size                        4    66873056
data_size                       4    7496095744
other_size                      4    9229424
anon_size                       4    169150464
anon_evict_data                 4    0
anon_evict_metadata             4    0
mru_size                        4    1358216192
mru_evict_data                  4    1352400896
mru_evict_metadata              4    508928
mru_ghost_size                  4    6305992192
mru_ghost_evict_data            4    4919159808
mru_ghost_evict_metadata        4    1386832384
mfu_size                        4    5968729088
mfu_evict_data                  4    5627991552
mfu_evict_metadata              4    336846336
mfu_ghost_size                  4    1330455552
mfu_ghost_evict_data            4    1287782400
mfu_ghost_evict_metadata        4    42673152
l2_hits                         4    0
l2_misses                       4    0
l2_feeds                        4    0
l2_rw_clash                     4    0
l2_read_bytes                   4    0
l2_write_bytes                  4    0
l2_writes_sent                  4    0
l2_writes_done                  4    0
l2_writes_error                 4    0
l2_writes_hdr_miss              4    0
l2_evict_lock_retry             4    0
l2_evict_reading                4    0
l2_free_on_write                4    0
l2_abort_lowmem                 4    0
l2_cksum_bad                    4    0
l2_io_error                     4    0
l2_size                         4    0
l2_asize                        4    0
l2_hdr_size                     4    0
l2_compress_successes           4    0
l2_compress_zeros               4    0
l2_compress_failures            4    0
memory_throttle_count           4    0
duplicate_buffers               4    0
duplicate_buffers_size          4    0
duplicate_reads                 4    0
memory_direct_count             4    66583
memory_indirect_count           4    7657293
arc_no_grow                     4    0
arc_tempreserve                 4    0
arc_loaned_bytes                4    0
arc_prune                       4    0
arc_meta_used                   4    427048272
arc_meta_limit                  4    2076377600
arc_meta_max                    4    498721632

# free -m
             total       used       free     shared    buffers     cached
Mem:         15841      15385        456          0         75         74
-/+ buffers/cache:      15235        606
Swap:            0          0          0

Câu trả lời:


22

IMHO các tham số trong / sys / module / zfs / tham số chỉ có thể được đặt thành 0/ 1- disabled/ enabled. " Chỉnh sửa: phụ thuộc vào tham số

Tôi đang ở trong cùng một chiếc thuyền muốn giới hạn việc sử dụng bộ nhớ của zfs và có vẻ như người ta phải tạo một tệp /etc/modprobe.d/zfs.conf và nhập tham số và giá trị mong muốn trong đó. Thay đổi này sẽ có hiệu lực khi khởi động lại.

echo "options zfs zfs_arc_max=34359738368" >> /etc/modprobe.d/zfs.conf

Để thực hiện mô-đun đang chạy, người ta có thể thay đổi tham số zfs_arc_max.

echo "34359738368" > /sys/module/zfs/parameters/zfs_arc_max

Xin lưu ý việc sử dụng >để thay thế nội dung của tệp trái ngược với việc thêm vào tệp bằng >>.

nguồn: /programming//a/18808311


1
Vòng cung ZFS không co lại ngay lập tức. Tuy nhiên (ZFSonLinux) nó được thu hồi trong khi các ứng dụng phân bổ bộ nhớ đó - như bình thường. Nếu bạn cần một cái gì đó để lưu trữ trên bộ nhớ, có lẽ hãy xem github.com/hilbix/killmem (chỉ 8K sau make static; strip -s killmem)
Tino

Trên Ubuntu 16.04, tôi cần chạy update-initramfs -u -k alltrước khi khởi động lại để cài đặt này được /etc/modprobe.d/zfs.confphổ biến.
lechup

@lechup: Trên Ubuntu 16.04, tôi đã thêm options zfs zfs_vdev_scheduler=cfqđể tôi /etc/modprobe.d/zfs.conf . Tôi khởi động lại và nó hoạt động; bộ lập lịch giờ là cfq thay vì noop . Bạn có thể giải thích tại sao update-initramfs -u -k alllà cần thiết?
Martin Velez

@MartinVelez Tôi biết đó là lạ, nhưng nếu không có nó vào những thay đổi máy tính của tôi không được tuyên truyền sau khi khởi động lại ... Tôi đã cố gắng để popagate tùy chọn khác nhau zfs_arc_maxcó lẽ chính điều này bằng cách nào đó được lưu trữ trong initramfs?
lechup

5

http://fibrevillage.com/st lí /

Bài viết này là rất tốt

bắt đầu phiên bản ZoL 0.6.2, bạn có thể đặt c_max khi chạy, tuy nhiên kích thước ARC sẽ không được tự động phát hành. để buộc RAM được giải phóng, cần phải xuất zpool.


4

Khi bạn sửa đổi kích thước vòng cung của mình, bạn cần bỏ bộ nhớ cache.

echo 3 > /proc/sys/vm/drop_caches

và chờ đợi (lời nhắc của bạn sẽ không trở lại ngay lập tức, nhưng các quy trình khác sẽ tiếp tục chạy). Nó sẽ từ từ dỡ bộ nhớ cache (2,5 phút cho bộ nhớ cache 24 GB của tôi trên 2 cặp đột kích 1'd 2TB WD màu đen trên cpu 4 năm 2Ghz trên hộp w / 64GB) - hãy cẩn thận, bạn sẽ đột nhiên không có bộ nhớ cache và bất kỳ các quá trình đọc dữ liệu sẽ được lấy ra khỏi đĩa thô, vì vậy bạn có thể sẽ thấy IO chờ nhảy lên một lúc cho đến khi bộ nhớ cache được lặp lại.


Ah tuyệt! Bạn có thể giải thích tại sao '3' làm giá trị để ghi vào mục Procfs đó không?
gertvdijk

Rõ ràng chủBộ nhớ đệm chỉ: # sync; echo 1 > /proc/sys/vm/drop_caches rõ ràng dentries và inodes: # sync; echo 2 > /proc/sys/vm/drop_caches rõ ràng chủBộ nhớ đệm, dentries và inodes:# sync; echo 3 > /proc/sys/vm/drop_caches
toán

2

Một vấn đề bạn có thể rơi vào là ZFS lưu trữ các tệp máy ảo (đĩa ảo). Để tránh điều đó, tôi luôn đặt thuộc tính chính là "siêu dữ liệu" trên các hệ thống tệp có chứa đĩa ảo.

Logic là hệ điều hành khách có gợi ý tốt hơn về các khu vực của đĩa để lưu vào bộ đệm.


0

AFAIK một trong những điều kiện sau đây phải được đáp ứng để điều chỉnh tham số.

  1. Trên hệ thống đang chạy: xuất tất cả các zpool, loại bỏ các mô-đun zfs, kích hoạt lại mô-đun zfs (theo định nghĩa, điều này không thể thực hiện được nếu / nằm trên zfs).
  2. Tạo lại hình ảnh initramfs khi thay đổi tham số để sau khi khởi động lại, nó sẽ hoạt động. Điều này là cần thiết vì vị trí tệp zfs.conf chưa được gắn vào thời điểm đó trong quá trình khởi động.

0

Bạn có thêm một " >" quá nhiều.

Lệnh nên

echo 1073741824 > /sys/module/zfs/parameters/zfs_arc_max

không phải " >>"

>>có nghĩa là "thêm vào" (danh sách hiện có).
>có nghĩa là "ghi đè" (giá trị).

Đây là lý do tại sao mã lệnh trong câu hỏi của bạn sẽ không hoạt động.


Đó đã là một phần của câu trả lời được chấp nhận. serverfault.com/a/602456/135437
gertvdijk

Bài viết đó là một mớ hỗn độn, ông Downvotes. Tác giả nói toàn bộ giá trị của mọi thứ, chỉ chạm vào câu trả lời đúng khi đi gần cuối mớ hỗn độn, mà không nêu rõ, "đây là lý do" hoặc tương đương. Quá bối rối, rằng tôi đã không nhận được câu trả lời của mình từ bài đăng đó. Tôi thấy lý do từ câu hỏi. Bài viết của tôi đã được nâng cấp vì một lý do.
Hypocritus
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.