ทำไมการตั้งค่า arc_max จึงไม่ได้รับเกียรติบน ZFS บน Linux


20

ฉันใช้ ZoL 0.6.2 จากPPAบน Ubuntu 12.04 อยู่ในโฮสต์ที่มีหน่วยความจำ 16GB ที่ต้องการเรียกใช้ VMs โดยใช้ KVM / Libvirt หลังจากเวลาที่ ZoL ใช้หน่วยความจำจำนวนบ้าถึง 98% ของการใช้ RAM กับ VM บางทำงาน นี่เป็นผลให้กระบวนการใหม่ปฏิเสธที่จะเริ่มต้น "ไม่สามารถจัดสรรหน่วยความจำ" ฉันไม่สามารถเริ่มต้น VMs ทั้งหมดของฉันได้อีกต่อไปซึ่งก่อนที่จะใช้ ZFS นั้นใช้ RAM ประมาณ 40-50%

เท่าที่ฉันเข้าใจโดยไม่ต้องปรับแต่ง ZoL ควรปล่อยหน่วยความจำทันทีที่ระบบมีหน่วยความจำสั้น ก็ไม่เป็นไร ฉันจึงตัดสินใจตั้งarc_maxค่าเป็น 1GB

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

แต่ถึงกระนั้นมันก็ไม่ได้ปล่อยหน่วยความจำใด ๆ

ดังที่คุณเห็นได้จากสถิติ ARC ด้านล่างแสดงว่าใช้หน่วยความจำมากกว่าที่กำหนดไว้ (เปรียบเทียบc= 7572030912กับ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 / พารามิเตอร์สามารถตั้งค่าเป็น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 arc ไม่หดตัวทันที อย่างไรก็ตาม (ZFSonLinux) จะถูกเรียกคืนในขณะที่แอปพลิเคชันจัดสรรหน่วยความจำนั้น - ตามปกติ หากคุณต้องการบางสิ่งบางอย่างเพื่อหมูในหน่วยความจำอาจจะดูgithub.com/hilbix/killmem (เพียง 8K หลังจากmake static; strip -s killmem)
Tino

บน Ubuntu 16.04 ฉันจำเป็นต้องเรียกใช้update-initramfs -u -k allก่อนที่จะรีบูตเพื่อให้การตั้งค่านี้ไม่/etc/modprobe.d/zfs.confแพร่กระจาย
lechup

@lechup: บน Ubuntu 16.04 ฉันเพิ่มoptions zfs zfs_vdev_scheduler=cfqของฉัน/etc/modprobe.d/zfs.conf ฉันรีบูทและใช้งานได้ กำหนดการตอนนี้CFQแทนnoop คุณช่วยอธิบายupdate-initramfs -u -k allได้ไหมว่าทำไมถึงจำเป็น?
Martin Velez

@MartinVelez ฉันรู้ว่ามันแปลก แต่ไม่มีการเปลี่ยนแปลงในเครื่องของฉันไม่ได้เผยแพร่หลังจากรีบูต ... ฉันพยายามที่จะเผยแพร่ตัวเลือกที่แตกต่างกันzfs_arc_maxบางทีคีย์นี้จะถูกเก็บไว้อย่างใดใน initramfs?
lechup

5

http://fibrevillage.com/storage/169-zfs-arc-on-linux-how-to-set-and-monitor-on-linux

บทความนี้ดีมาก

เวอร์ชันเริ่มต้น ZoL 0.6.2 คุณสามารถตั้งค่า c_max เมื่อรันไทม์อย่างไรก็ตามขนาด ARC จะไม่ถูกปล่อยออกมาโดยอัตโนมัติ เพื่อบังคับให้ RAM วางจำหน่ายจำเป็นต้องมีการส่งออก zpool


4

เมื่อคุณแก้ไขขนาดส่วนโค้งของคุณคุณจะต้องวางแคชของคุณ

echo 3 > /proc/sys/vm/drop_caches

และรอ (พรอมต์ของคุณจะไม่กลับมาทันที แต่กระบวนการอื่นจะยังคงทำงานต่อไป) มันจะยกเลิกการโหลดแคชอย่างช้า ๆ (2.5 นาทีสำหรับแคช 24GB ของฉันในการจู่โจม 2 คู่ 1D 2TB WDs blacks บนซีพียูอายุ 2Ghz 4 ปีบนกล่องที่มี 64GB) - ระวังคุณจะไม่มีแคชและสิ่งใด ๆ กระบวนการอ่านข้อมูลจะถูกดึงออกจากดิสก์ดิบดังนั้นคุณอาจเห็นว่า IO รอกระโดดขึ้นมาสักครู่แคชจะถูกเติมใหม่


อ๋อ! คุณช่วยอธิบายได้ไหมว่าทำไม '3' เป็นค่าที่จะเขียนไปยังรายการ procfs นั้น
gertvdijk

ล้าง PageCache เท่านั้น: # sync; echo 1 > /proc/sys/vm/drop_caches ล้าง Dentices และ inodes: # sync; echo 2 > /proc/sys/vm/drop_caches ล้าง PageCache, Dentries และ inodes:# sync; echo 3 > /proc/sys/vm/drop_caches
คณิตศาสตร์

2

ปัญหาหนึ่งที่คุณอาจประสบคือ ZFS แคชไฟล์เครื่องเสมือน (ดิสก์เสมือน) เพื่อหลีกเลี่ยงการที่ฉันตั้งค่าคุณสมบัติ primarycache เป็น "metadata" บนระบบไฟล์ที่มีดิสก์เสมือนอยู่เสมอ

เหตุผลคือว่าแขกระบบปฏิบัติการมีคำแนะนำที่ดีกว่าในพื้นที่ของดิสก์ที่จะแคช


0

AFAIK ต้องตรงตามเงื่อนไขใด ๆ ต่อไปนี้เพื่อปรับพารามิเตอร์

  1. บนระบบที่รันอยู่: เอ็กซ์พอร์ต zpool ทั้งหมด, ลบโมดูล zfs, เปิดใช้งานโมดูล zfs อีกครั้ง (ตามคำจำกัดความซึ่งไม่สามารถทำได้หาก / อยู่ใน zfs)
  2. สร้างอิมเมจเริ่มต้นใหม่เมื่อเปลี่ยนพารามิเตอร์ดังนั้นหลังจากรีบูตเครื่องจะทำงาน จำเป็นต้องใช้เนื่องจากตำแหน่งไฟล์ zfs.conf ยังไม่ได้เมานต์ในขณะนั้นในกระบวนการบู๊ต

0

คุณมี>มากเกินไปหนึ่งรายการ " " มากเกินไป

คำสั่งควรเป็น

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

ไม่ใช่ " >>"

>>หมายถึง "เพิ่มไปยัง" (รายการที่มีอยู่)
>หมายถึง "เขียนทับ" (ค่า)

นี่คือสาเหตุที่รหัสคำสั่งในคำถามของคุณไม่ทำงาน


นั่นเป็นส่วนหนึ่งของคำตอบที่ยอมรับแล้วปัจจุบัน serverfault.com/a/602457/135437
gertvdijk

โพสต์นั้นเป็นระเบียบที่ซับซ้อนนาย Downvotes ผู้เขียนกล่าวว่าสิ่งต่าง ๆ ทั้งชั้นเพียงสัมผัสคำตอบที่ถูกต้องในการผ่านใกล้ถึงจุดสิ้นสุดของความยุ่งเหยิงโดยไม่ระบุว่า "นี่คือเหตุผล" หรือเทียบเท่า สับสนดังนั้นฉันไม่ได้รับคำตอบจากโพสต์นั้น ฉันเห็นเหตุผลจากคำถาม โพสต์ของฉันถูก upvoted ด้วยเหตุผล
Hypocritus
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.