1

mmap巨大なページを割り当てるために使用しています。これは問題なく動作しますが、使用可能なヒュージ ページの限界に近づくことがあり、メモリにアクセスすると SIGBUS 障害が発生します。しかし、そもそもメモリがなかったのになぜ成功したのか、十分なメモリがあることを示しているように見えるmmap理由がわかりませんか?/proc/meminfo

4

1 に答える 1

2

利用可能な巨大なページの数を知りたい場合は、次のことを行う必要があります

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ますが、実際には十分なヒュージ ページ メモリがないことが判明したときに後で取得できます。

于 2016-06-21T21:13:41.050 に答える