mmap
巨大なページを割り当てるために使用しています。これは問題なく動作しますが、使用可能なヒュージ ページの限界に近づくことがあり、メモリにアクセスすると SIGBUS 障害が発生します。しかし、そもそもメモリがなかったのになぜ成功したのか、十分なメモリがあることを示しているように見えるmmap
理由がわかりませんか?/proc/meminfo
1 に答える
利用可能な巨大なページの数を知りたい場合は、次のことを行う必要があります
grep Huge /proc/meminfo
そして引き算
availablePages = HugePages_Free - HugePages_Rsvd
これは、「無料」が実際に無料という意味ではないためです。それは、記憶がまだ触れられていないことを意味します。が 0 の場合availablePages
、Huge Page をこれ以上正常に割り当てることはできません。したがって、メモリが不足している可能性がありますが、 の恐ろしい出力に混乱しました/proc/meminfo
。
でも、mmap
失敗しません!...次の段落も読んでください。
フラグをオンにmmap
してヒュージ ページを割り当てるために使用すると、残念な欠陥があります。MAP_NORESERVE
これは、スワップ領域を予約しないことを意味します。ただし、システムが処理できない場合でも、ヒュージ ページ メモリの「割り当て」にmmap
は成功します。mmap
メモリの物理的な割り当てが成功し、すぐに使用できるようになるかどうかをテストするには、 mincore()を呼び出して、すべてのページが正常に割り当てられたかどうかを評価します。私はそれを次のようにしました:
ptr = mmap( ... );
...
uint32_t inMemoryPages = 0;
for(int j=0;j<numDesiredPages;j++)
{
uint8_t flag;
int s = mincore((uint8_t*)ptr + j * HugePageSize(), 1,&flag);
// flag is 1 if the page was successfully allocated and in memory
inMemoryPages += flag;
}
if (numDesiredPages != inMemoryPages)
{
std::stringstream ss;
ss << "Unable to fulfill huge page allocation request."
<< " numDesiredPages:" << numDesiredPages
<< " successfulPages:" << inMemoryPages;
throw std::runtime_error(ss.str());
}
それ以外の場合、mmap
呼び出しは成功する可能性がありSIGBUS
ますが、実際には十分なヒュージ ページ メモリがないことが判明したときに後で取得できます。