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統計からわかるように、構成されているよりも多くのメモリを使用しています(compare 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

私見/ 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

を使用>してファイルに追加するのとは対照的に、ファイルのコンテンツを置換することに注意してください>>

ソース:https : //stackoverflow.com/a/18808311


1
ZFSアークはすぐには縮小しません。ただし(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:Ubuntuの16.04で、私は追加options zfs zfs_vdev_scheduler=cfq私に/etc/modprobe.d/zfs.conf。私は再起動し、機能しました。スケジューラはnoopではなくcfqになりました。なぜupdate-initramfs -u -k all必要なのか詳しく説明していただけますか?
マーティンベレス

@MartinVelez変だと知っていますが、それがなければ、マシンの変更は再起動後に反映されませんでした...別のオプションを作成しようとしていましたzfs_arc_max
lechup


4

アークサイズを変更したら、キャッシュを削除する必要があります。

echo 3 > /proc/sys/vm/drop_caches

待機します(プロンプトはすぐには戻りませんが、他のプロセスは引き続き実行されます)。キャッシュをゆっくりとアンロードします(64 GBのボックスに2Ghz 4歳のCPUを搭載した2組のRAID 1'd 2TB WDブラックの24GBキャッシュで2.5分)-注意してください、突然キャッシュがなくなり、データを読み取るプロセスはrawディスクを引き離すので、キャッシュが再配置されるまでしばらくの間、IO待機がジャンプアップするのを確認できます。


かっこいい!そのprocfsエントリに書き込む値として「3」を使用する理由を説明できますか?
gertvdijk

PageCacheのみを# sync; echo 1 > /proc/sys/vm/drop_caches クリア:デントリとiノードを# sync; echo 2 > /proc/sys/vm/drop_caches クリア:PageCache、デントリとiノードをクリア:# sync; echo 3 > /proc/sys/vm/drop_caches
数学

2

陥りやすい問題の1つは、仮想マシンファイル(仮想ディスク)をキャッシュするZFSです。それを避けるために、私は常に仮想ディスクを含むファイルシステムでprimarycacheプロパティを「メタデータ」に設定します。

ゲストOSは、ディスクのどの領域をキャッシュするかについてより良いヒントを持っているというロジックです。


0

私の知る限り、次のいずれかの条件が満たされていないと、パラメーターを適合させることができません。

  1. 実行中のシステム:すべてのzpoolをエクスポートし、zfsモジュールを削除し、zfsモジュールを再度有効にします(/ fsがzfs上にある場合、これは実行できません)。
  2. パラメータを変更するときにinitramfsイメージを再生成し、再起動後に機能するようにします。これは、ブートプロセスのその時点でzfs.confファイルの場所がまだマウントされていないために必要です。

0

余分な1つの " >"が多すぎます。

コマンドは

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

>>」ではない

>>「追加」(既存のリスト)を意味します。
>「上書き」(値)を意味します。

これが、質問のコマンドコードが機能しない理由です。


それはすでに受け入れられた答えの一部でした。serverfault.com/a/602457/135437
gertvdijk

その投稿は複雑な混乱です、Downvotes氏。著者は、「これが理由だ」または同等のことを述べずに、混乱の終わり近くを通過する際に正しい答えに触れるだけで、物事のラック全体を言います。とても複雑なので、その投稿から答えが得られませんでした。私は質問から理由を見ました。私の投稿理由で支持されました。
偽善者
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.