1

私は、「プロセスごとのページ共有係数」が何を担当しているかについて多くのことをグーグルで検索しましたが、何も見つかりませんでした。それは私にとって興味深いだけです。今のところ問題はありません。ただ興味があります(もっと知りたいです)。sysctl では次のようになります。

vm.pmap.shpgperproc

前もって感謝します

4

2 に答える 2

3

最初に注意すべきことshpgperprocは、 はローダーの調整可能変数であるため、起動時に で適切なディレクティブを使用してのみ設定でき、loader.confその後は読み取り専用になることです。

2 つ目の注意点は<arch>/<arch>/pmap.c、vm サブシステムのアーキテクチャに依存する部分を処理する で定義されていることです。特に、実際には amd64 には存在しませんpmap.c- かなり最近削除されたので、これについては後で少し説明します。ただし、他のアーキテクチャ (i386、arm など) にも存在し、各アーキテクチャで同じように使用されます。つまり、次のように表示されます。

    void
    pmap_init(void)
    {
            ...
            TUNABLE_INT_FETCH("vm.pmap.shpgperproc", &shpgperproc);
            pv_entry_max = shpgperproc * maxproc + cnt.v_page_count;

そして、それは他のどこにも使用されていません。pmap_init()一度だけ呼び出されます: vm サブシステムの初期化の一部として起動時に。maxproc、存在できるプロセスの最大数 (つまりkern.maxproc) であり、cnt.v_page_count使用可能なメモリの物理ページ数 (つまりvm.stats.v_page_count) です。

Apv_entryは基本的に物理ページの単なる仮想マッピングです (より正確には astruct vm_pageです。したがって、2 つのプロセスがページを共有し、両方がそれらをマップしている場合、pv_entryマッピングごとに個別の構造が存在struct vm_pageします。ダーティまたはページ アウト、またはハードウェア ページ テーブルの更新が必要な場合、対応するマップされた仮想ページのリストは、対応する のリストを見ることで簡単に見つけることができますpv_entry(例として、 を参照してくださいi386/i386/pmap.c:pmap_remove_all())。

s を使用するとpv_entry、特定の VM 操作がより効率的になりますが、現在の実装 (少なくとも i386 の場合) では、 を管理するために使用される s に静的な量のスペース ( に基づいて設定される を参照) が割り当てられているようpv_maxchunksです。非アクティブなものの割り当てを解除した後にカーネルが割り当てられない場合、カーネルはパニックに陥ります。pv_entry_maxpv_chunkpv_entrypv_entry

したがって、スペースが必要な のpv_entry_max数に基づいて設定したいと考えています。pv_entry明らかに、少なくとも RAM のページ数と同じ数が必要です (これがどこcnt.v_page_countから来るのか)。次に、多くのページが異なるプロセスによって複数仮想マッピングされるという事実を考慮に入れる必要があります。これpv_entryは、そのようなマッピングごとに を割り当てる必要があるためです。したがってshpgperproc、すべてのアーチでデフォルト値が 200 になっているのは、これをスケーリングする方法にすぎません。多くのページがプロセス間で共有されるシステム (たとえば、apache を実行する高負荷の Web サーバー) では、明らかにpv_entrys が不足する可能性があるため、それを増やす必要があります。

于 2012-05-06T08:53:57.260 に答える
0

現在、近くに FreeBSD マシンはありませんが、このパラメーターは pmap.c で定義され、使用されているようです

于 2012-05-05T10:35:21.523 に答える