私は、「プロセスごとのページ共有係数」が何を担当しているかについて多くのことをグーグルで検索しましたが、何も見つかりませんでした。それは私にとって興味深いだけです。今のところ問題はありません。ただ興味があります(もっと知りたいです)。sysctl では次のようになります。
vm.pmap.shpgperproc
前もって感謝します
私は、「プロセスごとのページ共有係数」が何を担当しているかについて多くのことをグーグルで検索しましたが、何も見つかりませんでした。それは私にとって興味深いだけです。今のところ問題はありません。ただ興味があります(もっと知りたいです)。sysctl では次のようになります。
vm.pmap.shpgperproc
前もって感謝します
最初に注意すべきこと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_max
pv_chunk
pv_entry
pv_entry
したがって、スペースが必要な のpv_entry_max
数に基づいて設定したいと考えています。pv_entry
明らかに、少なくとも RAM のページ数と同じ数が必要です (これがどこcnt.v_page_count
から来るのか)。次に、多くのページが異なるプロセスによって複数仮想マッピングされるという事実を考慮に入れる必要があります。これpv_entry
は、そのようなマッピングごとに を割り当てる必要があるためです。したがってshpgperproc
、すべてのアーチでデフォルト値が 200 になっているのは、これをスケーリングする方法にすぎません。多くのページがプロセス間で共有されるシステム (たとえば、apache を実行する高負荷の Web サーバー) では、明らかにpv_entry
s が不足する可能性があるため、それを増やす必要があります。
現在、近くに FreeBSD マシンはありませんが、このパラメーターは pmap.c で定義され、使用されているようです。