Linuxタグに答えています。私の答えはLinuxだけに固有のものです。
はい、巨大なページは断片化の傾向があります。メモリには2つのビューがあります。1つはプロセスが取得するもの(仮想)、もう1つはカーネルが管理するもの(実際)です。特にページが大きいほど、隣接するグループをグループ化(および維持)するのが難しくなります。特に、デフォルトで他のメモリよりも多くのメモリを割り当てて書き込むシステムもサポートしているシステムで実行している場合はなおさらです。実際に使用することになります。
(実際の)許可されたアドレスのカーネルのマッピングはプライベートです。カーネルはユーザー空間を混乱させることなくオーバーコミットできる必要があるため、カーネルがそれらを表示するときにユーザー空間がそれらを見る非常に良い理由があります。あなたのプロセスは、素敵な、連続的な取得「Disneyfied」カーネルが実際にされているものの忘れて仕事にでアドレス空間、やっ舞台裏そのメモリとを。
長時間実行されているサーバーでパフォーマンスが低下するのは、明示的にロックされていない(たとえば、mlock()
/ mlockall()
またはposix_madvise()
)しばらくの間変更されていない割り当てられたブロックがページアウトされたためです。それら。この動作を変更すると、プロセスが悪い隣人になります。これが、多くの人がweb / php / python / ruby / whateverとはまったく異なるサーバーにRDBMSを配置する理由です。それを正す唯一の方法は、連続したブロックの競合を減らすことです。
断片化は、ページAがメモリ内にあり、ページBがスワップに移動した場合にのみ(ほとんどの場合)実際に顕著です。当然、サービスを再起動するとこれが「治癒」するように見えますが、それはカーネルがプロセスをページアウトする機会をまだ持っていないためです(現在)、オーバーコミット率の範囲内で新しく割り当てられたブロック。
実際、高負荷の状態で「apache」を再起動すると(たとえば)、他のサービスが所有するブロックを直接ディスクに送信する可能性があります。そのため、「apache」は短期間で改善されますが、「mysql」は、少なくとも十分な物理メモリが不足しているときに少なくともカーネルが同等に苦しめるまでは苦しむ可能性があります。
メモリを追加するか、要求の厳しいmalloc()
コンシューマーを分割します:)注目すべき断片化だけではありません。
vmstat
実際に何がどこに保存されているかの概要を取得してください。