FreeBSDでメモリ割り当てがどのように機能するのか理解できませんでした。 有用なすべての種類のドキュメントのうち、覚えられているのは
何年もの間、LinuxはFreeBSDよりもスワップアウトを回避するのに優れた仕事をしたという都市の神話が広まっていますが、これは事実ではありません。 実際に発生していたのは、Linuxが未使用ページをコアに保持し、キャッシュおよびプロセスページに使用できるメモリを少なくしている間に、FreeBSDが未使用ページを積極的にページングしてディスクキャッシュを増やすことでした。

まあ、Linuxよりはましだし、はい。 私は気にしません。 しかし、最も誤解されているメモリ割り当てプロセスよりも悪いことに、
非アクティブなメモリが私を殺していました。 それは何であり、「それ」を無痛で使用することは可能ですか? このメモリをアプリケーションで使用できると見なすべきですか?
アンダーカットでは、答えよりも質問が多くあります。
FreeBSD FAQは次のことを報告しています
16.2。
実行中のプログラムが非常に少ない場合でも、topに空きメモリがほとんど表示されないのはなぜですか?
簡単な答えは、空きメモリは無駄なメモリであるということです。 プログラムが積極的に割り当てないメモリは、FreeBSDカーネル内でディスクキャッシュとして使用されます。 Inact、Cache、およびBufとしてラベル付けされた上部(1)で示される値は、すべて異なるエージングレベルのキャッシュデータです。 このキャッシュされたデータは、システムが最近アクセスしたデータのために低速のディスクに再度アクセスする必要がないことを意味し、したがって全体的なパフォーマンスが向上します。 一般に、上部(1)の[空きメモリ]に表示される値は、それほど低くない場合は低い値が適切です。
さて、それをあるレベルのキャッシュにしますが、この
Inactメモリを
Cacheに入れてみませんか? (多くのフォーラムユーザーによる)使用可能で、すぐにではなくても、リクエストに応じて割り当てることができるからでしょうか?
実用的な方法で調べてみましょう。 私たちが持っています:
つまり、ほとんどすべてのメモリが空きであり、スワップは完全に空きです。
次に、使用可能なメモリを使用するために、tmpfsパーティションを作成します。
同時に
パーティションは単純に作成/マウントされますが、無料なので、それにメモリを割り当てる必要はありません。
ファイルを入れてください。
3ギガバイトのメモリが占有されていますが、同時に
何らかの理由で、それらは
Inactと見なされます。 ただし、アクティブではないため、干渉を試みます。 少し「Hello、world!」をスケッチして、メモリを割り当ててから解放します。
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> int main (int argc, char *argv[]) { int i; char *buffer[64]; long lSize = 1024*1024*1024; int iMB = argc < 2 ? 1 : atoi(argv[1]); printf("iMB:\t%d\n", iMB); for(i=0; i < iMB; i++) { buffer[i] = (char*) malloc (lSize); if(buffer[i] != NULL) { printf("Alloc: %d\n", i); memset(buffer[i], 127, lSize); } else printf("Error!\n"); sleep(1); } sleep(10); for(i=0; i < iMB; i++) { printf("Free: %d\n", i); free (buffer[i]); } return 0; }
なぜそんなに長いの? おそらくInactiveにあると思われるtmpfsがスワップに圧縮されました。
実際、メモリを割り当てると(コードでは
「sleep(10);」の瞬間)、次のように表示されます。
しかし、それよりも悪い。 アプリケーションによってメモリを解放した後:
スワップは引き続き関与しました。
ファイル
アクセスが
Inactでメモリを返しました
スワップが残った理由は不明
です:2502M使用済みしかし、これが正常であり、空きスワップがある場合、この使用済みメモリが非アクティブであると見なし、
Inactとしてマークすることができます。 スワップがない場合はどうなりますか? 関係するメモリが
アクティブになることを望みます。
スワップを削除し、同様に3Gb tmpfsセクションをマウントして埋めます。
私たちの良心をクリアするには、トップが嘘をつかないようにしてください:
そして、スワップがないにもかかわらず、ビジーなメモリはまだアクティブではありません...アクティブではないので、アプリケーションで再び占有しようとします。
Rt そして最後に:
おそらく何らかの結論があるはずですが、そうではありません...