8GB RAM linuxボックスで、4つのTomcatサーバーが実行されています。そのうちの1つは3000MBのメモリに設定され(jvm -Xmsおよび-Xmx設定)、その他は1500MBに設定されています。スワップパーティションも8ギガに設定されています。これらのサーバーを起動すると、スワップファイルの使用率は低くなります。ただし、1日またはすべてのサーバーがピークアクティビティである特定の時間帯に、スワップ使用率が増加し始めます。ここにあります。典型的なsar -r出力。
kbmemfree kbmemused%memused kbbuffers kbcached kbswpfree kbswpused %swpused kbswpcad
48260 8125832 99.41 196440 2761852 7197688 1190912 14.20 316044
75504 8098588 99.08 198032 2399460 7197688 1190912 14.20 316032
現在使用されている14.2%のスワップを示しています。 面白いことは、この%が決して減少しないことです。 増加し続け、最大30-40%に達します。サーバーは毎週再起動します。
%swpusedは、ピークアクティビティの期間中に増加し、アクティビティの少ない期間中に減少すると想定します。一定のままです。これは、スワップスペースがOSによって再利用されることはないようです。
Freeの出力:free -mキャッシュされた使用済みの共有バッファの合計Mem:7982 7937 45 0 32 2088-/ + buffers/cache:5816 2166 Swap:8191 1163 7028
つまり、少なくとも2gの無料のRAMがあります。それで問題は、なぜスワップ領域が増え続け、OSによって解放されないのかということです。またはこれをデバッグして何が起こっているかを理解する方法.
Infoがディスクにスワップアウトされ、後でメモリに読み込まれる場合、スワップ領域が少なくなるまで、スワップ領域に割り当てられたままになることがよくあります。つまり、同じ情報を後で再度スワップアウトする必要があり、変更されていない場合、OSは、割り当てられたRAMからページを削除するだけで、ディスク節約時間に何も書き込む必要がありません。
メモリに読み戻されたものに割り当てられたスワップも解放されます
覗く /proc/meminfo
「SwapCached」という行。このエントリは、RAMとスワップパーティションの両方で見つかったページをカウントします。たとえば、小さなVMをランダムに選択すると、/proc/meminfo
私のVMの1つである仮想ファイルに次のように表示されます。
SwapTotal: 698816 kB
SwapFree: 624520 kB
SwapCached: 17232 kB
74268Kのスワップ領域が割り当てられていることを示しますが、これらのページの17232Kも現在RAMにもマッピングされているため、何かが領域を必要とする場合、スワップからすぐに割り当て解除できます。そうしないと)。
また、何年も前にスワップアウトされて以来、二度と使用されていないページがそこに座っていることは間違いありません。いくつかの空きがあるRAMとして読み込まれるため、カーネルはスワップからページをリロードしません。その空きRAMは、キャッシュまたはバッファに使用する方がよいかもしれません。 -swapに書き込まれたページは通常、次に必要になったときにのみ再読み込みされます。
スワップに何があるかを明らかにしたい場合は、十分な空き容量または空き容量、あるいはその両方(つまり、free + cache + buffers(解放できないRight + Instantのc + bカウントの部分を除く))がある限り、それを回しますオフにして、再びswapoff -a && swapon -a
。
もちろん、どこかでメモリリークが発生する可能性もありますが、これが動作の唯一の説明ではありません。
基本的に、これを気にする必要はありません。知っておくべき重要なことは、IOがどれだけスワップに費やされるかです( 'vmstat'コマンドを確認してください)。スワップに多くのものを置いても何もかかりません。唯一のコストは、ものを入れることですスワップ(ページイン)またはスワップアウト(ページアウト)なので、OSがスワップを大きくすることは完全に合理的です。
利用可能なスワップ領域がある限り、OSがスワップ領域を解放する必要はありません。空きがなくなると解放されます。あなたがこの状況に陥ったとき、あなたは間違いなく問題を抱えています。
これが問題になるかどうかを確認するのに十分な時間サーバーを実行しない限り、これが最終的に問題になるかどうかを判断する方法はありません。
基本的に、OSは使用されていないものをスワップして、新しいプログラムが開始された場合に備えて、常に一部のメモリを解放します。スワップスペースは必要になるまで解放されません。つまり、100%のスワップスペースを使用でき、パフォーマンスの問題は発生しません。心配するのは、これがメモリリークによって引き起こされているかどうかです。これは必ずしもメモリリークではありませんが、可能性があります。
Javaはメモリリークの傾向はありませんが、特に複雑なアプリで発生する可能性があります。