Ubuntu 12.04で their 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
= 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
/ 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
>
でファイルに追加するのとは対照的に、>>
を使用してファイルのコンテンツを置き換えることに注意してください。
弧のサイズを変更したら、キャッシュを削除する必要があります。
echo 3 > /proc/sys/vm/drop_caches
待機します(プロンプトはすぐには戻りませんが、他のプロセスは引き続き実行されます)。それはゆっくりとキャッシュをアンロードします(64GBのボックスで2Ghz 4歳のCPUの2G RAID 1'd 2TB WDブラックで私の24GBキャッシュに2.5分)-突然、キャッシュがなくなり、データを読み取るプロセスはrawディスクをプルオフするので、おそらくIOが表示されるまで、キャッシュが再投入されるまでジャンプアップします。
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をエクスポートする必要があります。
陥りがちな問題の1つは、ZFSが仮想マシンファイル(仮想ディスク)をキャッシュすることです。これを回避するために、仮想ディスクを含むファイルシステムで、primarycacheプロパティを常に「メタデータ」に設定しました。
論理は、ゲストOSがディスクのどの領域をキャッシュするかについてより良いヒントを持っているということです。
「>
" 多すぎる。
コマンドは
echo 1073741824 > /sys/module/zfs/parameters/zfs_arc_max
「>>
"
>>
は、「追加」(既存のリスト)を意味します。>
は「上書き」(値)を意味します。
これが、質問のコマンドコードが機能しない理由です。
AFAIKは、パラメータを適合させるために、次のいずれかの条件を満たしている必要があります。