web-dev-qa-db-ja.com

Ubuntu 20.04のZFSは大量のメモリを使用していますか?

私は64GBをインストールしていますが、htopは20GBを使用しています:

enter image description here

ランニング ps aux | awk '{print $6/1024 " MB\t\t" $11}' | sort -nは、数百メガバイトだけを使用して最大のプロセスを提供し、出力全体を合計すると2.8GB(ps aux | awk '{print $6/1024}' | paste -s -d+ - | bc)。これは多かれ少なかれ、昨日アップグレードしたUbuntu 19.04で得ていたもので、アプリケーションが実行されていないときに3 GBから4 GBに使用されました。では、なぜ20GBがhtopで使用されているのですか?

私がZFSをインストールした(合計1.5 GBのSSDドライブ、3つのプール、そのうちの1つは圧縮されている)ことは事実であり、かなり大きなファイルを移動するので、キャッシュの割り当てがあるかどうかがわかりました。 htop Memバーは、ほとんどが緑色です。これは、バッファ(青)やキャッシュ(オレンジ)ではなく、「使用中のメモリ」を意味するため、かなり気になります。

このZFSは大量のRAMを使用していますか?その場合、他のアプリケーションが必要とする場合、一部のRAMを解放しますか?

編集

Smemの出力は次のとおりです。

tbrowne@RyVe:~$ smem -tw
Area                           Used      Cache   Noncache 
firmware/hardware                 0          0          0 
kernel image                      0          0          0 
kernel dynamic memory      20762532     435044   20327488 
userspace memory            2290448     519736    1770712 
free memory                42823220   42823220          0 
----------------------------------------------------------
                           65876200   43778000   22098200 

それが原因であるのは「カーネルダイナミックメモリ」です。なぜそんなに?

編集2->巨大なファイル作成にリンクされているようです

私は再起動し、RAM使用量は約5GBでした。Firefoxで多数のタグを実行し、いくつかのVMを実行し、RAM最大20GBを使用して、すべて閉じますアプリケーションが5GBに戻った後、Python(1.8Gの乱数CSV))で大きなファイルを作成し、それを40xに連結して72GBのファイルを作成しました。

tbrowne@RyVe:~$ python3
Python 3.8.2 (default, Mar 13 2020, 10:14:16) 
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy as np
>>> import pandas as pd
>>> pd.DataFrame(np.random.Rand(10000, 10000)).to_csv("bigrand.csv")
>>> quit()
tbrowne@RyVe:~$ for i in {1..40}; do cat bigrand.csv >> biggest.csv; done

これですべてが完了し、マシンで何も実行されなくなった後、カーネルで34Gを使用しています。

enter image description here

最終編集(答えをテストするため)

このpython 3スクリプト(pip3 install numpyが必要))は、失敗するまで一度に約1GBを割り当てます。また、以下の回答に従って、実行するとすぐにカーネルメモリが解放されますつまり、キルされる前に64 GBを割り当てることができました(私はスワップをほとんど持っていません)つまり、必要なときにZFSがメモリを解放することを確認しています。

import numpy as np
xx = np.random.Rand(10000, 12500)
import sys
sys.getsizeof(xx)
# 1000000112
# that's about 1 GB
ll = []
index = 1
while True:
    print(index)
    ll.append(np.random.Rand(10000, 12500))
    index = index + 1
7
Thomas Browne

ZFSはデータとメタデータをキャッシュするため、大量の空きメモリが与えられると、これはZFSによって使用されます。メモリプレッシャーが発生し始めると(たとえば、多くのページを必要とするプログラムの読み込みなど)、キャッシュされたデータが削除されます。空きメモリが多い場合は、必要になるまでキャッシュとして使用されます。

arc_summary ZFS ARC(適応置換キャッシュ)によって使用されるリソースを確認するツール

19
Colin Ian King

UNIX/Linuxのすべてのストレージシステムは、RAMが使用可能な場合にキャッシュを追加できるすべての使用可能な空きメモリを使用します。それが使用されているかどうかは関係ありません。ZFS、LVM、ext、xfs、それはカーネルがどのように設計されたかだけです。使用可能なメモリを調べるために使用されているプログラムによっては、多くの混乱が生じます。topには、IOキャッシュに使用されているものを含む、割り当てられたすべてのメモリが表示されますが、freeはそうではありません。コンピューティングの初期の頃から人々を混乱させてきました。

0
Travisdh1