Linux의 ZFS에서 arc_max 설정이 적용되지 않는 이유는 무엇입니까?


20

Ubuntu 12.04 의 PPA 에서 ZoL 0.6.2를 실행 하고 있습니다. KVM / Libvirt를 사용하여 일부 VM을 실행하도록 16GB의 메모리가있는 호스트에 있습니다. 얼마 후 ZoL은 엄청난 양의 메모리를 사용하여 일부 VM이 실행 중일 때 RAM 사용량의 98 %에 도달했습니다. 이로 인해 새로운 프로세스가 "메모리를 할당 할 수 없음"을 시작하지 않습니다. ZFS를 사용하기 전에 약 40-50 %의 RAM을 사용했던 VM을 더 이상 시작할 수 없습니다.

내가 이해하는 한, 조정하지 않고 ZoL은 시스템의 메모리가 부족한 즉시 메모리를 해제해야합니다. 글쎄요. 그래서 arc_max설정을 1GB 로 설정하기로 결정했습니다 .

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

여전히 메모리를 해제하지 않습니다.

아래 ARC 통계에서 볼 수 있듯이, (비교 c= 7572030912with c_max= 1073741824)에 구성된 것보다 많은 메모리를 사용하고 있습니다.

내가 여기서 뭘 잘못하고 있니?

# 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

답변:


22

IMHO / sys / module / zfs / parameters의 매개 변수는 0/ 1- disabled/으로 만 설정할 수 있습니다 enabled. " 수정 : 매개 변수에 따라 다름

zfs의 메모리 사용을 제한하려는 동일한 보트에 있으며 /etc/modprobe.d/zfs.conf 파일을 만들고 매개 변수와 원하는 값을 입력해야합니다. 이 변경 사항은 재부팅시 적용됩니다.

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

실행중인 모듈에 영향을주기 위해 zfs_arc_max 매개 변수를 변경할 수 있습니다.

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

>파일에을 추가하는 것과 달리 파일의 내용을 바꾸려면를 사용하십시오 >>.

출처 : /programming//a/18808311


1
ZFS 아크는 즉시 축소되지 않습니다. 그러나 (ZFSonLinux)는 응용 프로그램이 평소처럼 메모리를 할당하는 동안 회수됩니다. 기억해야 할 것이 있다면 github.com/hilbix/killmem (8K 이후 make static; strip -s killmem)을 살펴보십시오.
Tino

우분투 16.04 update-initramfs -u -k all에서는이 설정을 /etc/modprobe.d/zfs.conf전파 하기 위해 재부팅하기 전에 실행 해야했습니다 .
lechup

@lechup : Ubuntu 16.04에서 /etc/modprobe.d/zfs.conf에 추가 options zfs zfs_vdev_scheduler=cfq했습니다 . 나는 재부팅하고 작동했다. 스케줄러는 이제 noop 대신 cfq 였습니다 . 왜 필요한지 자세히 설명해 주 시겠습니까? update-initramfs -u -k all
마틴 벨 레즈

@MartinVelez 나는 그것이 이상하다는 것을 알고 있지만 내 컴퓨터에 그것 없이는 재부팅 후 전파되지 않았습니다 ... 다른 옵션을 사용하려고 시도 zfs_arc_max했을 것입니다.이 키는 어떻게 든 initramfs에 캐시되어 있습니까?
lechup


4

호 크기를 수정 한 후에는 캐시를 삭제해야합니다.

echo 3 > /proc/sys/vm/drop_caches

기다립니다 (프롬프트는 즉시 반환되지 않지만 다른 프로세스는 계속 실행됩니다). 캐시를 천천히 언로드합니다 (64GB의 상자에 2Ghz 4 년 된 CPU의 2 쌍의 레이드 1 2D WTB 블랙의 24GB 캐시의 경우 2.5 분)-갑자기 캐시가 없습니다. 데이터를 읽는 프로세스는 원시 디스크를 제거하므로 캐시가 다시 채워질 때까지 IO 대기가 잠시 동안 증가하는 것을 볼 수 있습니다.


아 멋지다! 왜 '3'을 해당 procfs 항목에 쓸 값으로 설명 할 수 있습니까?
gertvdijk

Clear PageCache 만 해당 : # sync; echo 1 > /proc/sys/vm/drop_caches dentries 및 inode # sync; echo 2 > /proc/sys/vm/drop_caches 지우기 : PageCache, dentries 및 inode 지우기 :# sync; echo 3 > /proc/sys/vm/drop_caches
math

2

ZFS가 가상 머신 파일 (가상 디스크)을 캐싱하는 것이 문제가 될 수 있습니다. 필자는 항상 가상 디스크를 포함하는 파일 시스템에서 primarycache 등록 정보를 "metadata"로 설정했습니다.

논리는 게스트 OS가 디스크의 어떤 영역을 캐시할지 더 잘 암시한다는 것입니다.


0

AFAIK 매개 변수를 조정하려면 다음 조건 중 하나를 충족해야합니다.

  1. 실행중인 시스템 : 모든 zpool을 내보내고 zfs 모듈을 제거하고 zfs 모듈을 다시 활성화하십시오 (정의에 따라 /가 zfs에있는 경우 수행 할 수 없음).
  2. 매개 변수를 변경할 때 initramfs 이미지를 재생성하여 재부팅 후 작동합니다. 부팅 프로세스에서 zfs.conf 파일 위치가 아직 마운트되지 않았기 때문에이 작업이 필요합니다.

0

추가 " >"가 너무 많습니다.

명령은

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

" >>"가 아님

>>"추가"(기존 목록)를 의미합니다.
>"덮어 쓰기"(값)를 의미합니다.

이것이 질문의 명령 코드가 작동하지 않는 이유입니다.


그것은 이미 받아 들여진 대답의 일부였습니다. serverfault.com/a/602457/135437
gertvdijk

그 게시물은 복잡한 혼란입니다, Downvotes 씨. 저자는 "이것이 이유"라고 말하지 않고 혼란의 끝을 지나갈 때 정답을 만지는 것만으로도 모든 것을 말하고 있습니다. 너무 혼란스러워서 그 게시물에서 답을 얻지 못했습니다. 나는 그 질문에서 그 이유를 보았다. 내 게시물 이유에 의해 투표되었습니다.
Hypocritus
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.