LinuxサーバCacheがメモリを消費しすぎたため、システムメモリが不足し、最終的にjavaアプリケーションがクラッシュする解決策...

4178 ワード

問題の説明
Linuxメモリの使用量がしきい値を超えると、Javaアプリケーションに使用可能なメモリがなくなり、プログラムがクラッシュします.プログラムが停止していないときにプログラムを停止しても、システムメモリは解放されません.
 
原因を探す過程
この問題はもう何ヶ月も私を困らせて、何度も分析しても原因が見つからなかったので、ネットでこの問題を調べて他の人も出会ったことがありますが、良い解決策はありません.プロジェクトはずっとオンラインになっていないので、メモリが不足するたびにプログラムが崩壊してサービスを再開すればいいので、いっそ問題を探すのにあまり時間がかかりません.今プロジェクトはすぐにオンラインになって、プログラムのクラッシュが発生する情況が発生することができなくて、まして前置システムで、更にいかなる問題が発生することができません.
最初はプログラムの原因でメモリが漏れると考えられていたが、jdkが持参したjmap-F-dump:live、format=b、file=/usr/local/sztFront/logs/heapdumpを用いる.binコマンドはdumpファイルを何回か出力し、MemoryAnalyzer分析によりアプリケーションにメモリ消費量の大きい変数はありません.バックグラウンドはログの出力が多すぎるかどうかを推測して、結局前置システムで、毎日のメッセージ量は特に大きくて、ログは5,6個のGに達することができます.だからログ受信メッセージをオフにして、ログの大きさはすぐに下がって、毎日200 Mです.プログラムを切る時間が長くなって、もとは1週間もしないうちに切って、今2週間ぐらいに達してやっと切ることができて、やはりだめで、根本的に問題を解決していません.ネット上で様々な問題を検索した結果、Cachedの値が大きすぎて、システムに再割り当て可能なメモリ領域がないという問題が発生しました.Cachedはファイルをキャッシュするために使用する限り、よく読み書きするファイルがCachedにキャッシュされ、Linuxシステムカーネルから提供する読み書き効率を高めることができる.16以降のコアバージョン、すなわち旧バージョンのオペレーティングシステム、例えば赤旗DC 5.0、RHEL 4.x以前のバージョンはありません.これはなぜ私のプロジェクトがいつも切れたのかを説明することができます.私のプロジェクトは主にファイルを処理しているので、受信とダウンロードしたファイルはキャッシュされ、メモリを消費して解放されず、プログラムを止めてもメモリを解放しません.最後に3つの実行が見つかり、cachedのメモリをクリーンアップできます.
3つのコマンド:
sync
echo 1 >/proc/sys/vm/drop_caches echo 2 >/proc/sys/vm/drop_caches echo 3 >/proc/sys/vm/drop_caches
この3つのコマンドを実行した後free-mコマンドで確認すると、freeはメモリがすぐに増加し、buff/cache列の値が小さくなり、メモリが解放されたことを示していますが、この3つのコマンドを常に手動で実行することはできません.最後にshellスクリプトを書いて、Linuxタイミングタスクcrondを開き、毎朝freeメモリをチェックします.この3つのコマンドは、4 G未満の場合に実行される(注:システムコンテンツ20 G).
注:この3つのコマンドを実行する前に、syncコマンドを実行する必要があります(説明:syncコマンドsyncサブルーチンを実行します.システムを停止する必要がある場合は、syncコマンドを実行してファイルシステムの整合性を確保します.syncコマンドは、変更されたi-Node、遅延されたブロックI/O、および読み書きマッピングファイルを含むすべての未書き込みシステムバッファをディスクに書き込みます)
 
ソリューション(手動)
1.修正/proc/sys/vm/drop_Caches、Slabが使用するcacheメモリを解放します(drop_cachesの公式ドキュメントを参照):
Writing to this will cause the kernel to drop clean caches, dentries and inodes from memory, causing that memory to become free.  
To free pagecache:  
* echo 1 > /proc/sys/vm/drop_caches  
To free dentries and inodes:  
* echo 2 > /proc/sys/vm/drop_caches  
To free pagecache, dentries and inodes:  
* echo 3 > /proc/sys/vm/drop_caches  
As this is a non-destructive operation, and dirty objects are notfreeable, the user should run "sync" first in order to make sure allcached objects are freed.  
This tunable was added in 2.6.16.  

注:syncコマンドは、この3つのコマンドを実行する前に実行します.
 
ソリューション(自動)
1.shellタイミングタスクスクリプトfreememを作成する.sh
 
#! /bin/sh  
used=`free -m | awk 'NR==2' | awk '{print $3}'`  
free=`free -m | awk 'NR==2' | awk '{print $4}'`  
echo "===========================" >> /app/memory/logs/mem.log  
date >> /app/memory/logs/mem.log  
echo "Memory usage before | [Use:${used}MB][Free:${free}MB]" >> /app/memory/logs/mem.log  
if [ $free -le 4000 ] ; then  
                sync && echo 1 > /proc/sys/vm/drop_caches  
                sync && echo 2 > /proc/sys/vm/drop_caches  
                sync && echo 3 > /proc/sys/vm/drop_caches  
                used_ok=`free -m | awk 'NR==2' | awk '{print $3}'`  
                free_ok=`free -m | awk 'NR==2' | awk '{print $4}'`  
                echo "Memory usage after | [Use:${used_ok}MB][Free:${free_ok}MB]" >> /app/memory/logs/mem.log  
                echo "OK" >> /app/memory/logs/mem.log  
else  
                echo "Not required" >> /app/memory/logs/mem.log  
fi  
exit 1 

2、crontab-eコマンドを使用して現在のユーザーのcrontabを編集する
 
0 6 * * * /usr/local/tomcat/sztFileFront/bin/freemem.sh  

タイミングタスク作成リファレンス:http://www.jb51.net/article/15008.htm
 
3、crondサービスの再起動
 
/sbin/service crond restart  

4、crondサービスが再起動に成功したかどうかを確認する
 
/sbin/service crond status  

 
最後に、問題が解決します.私が設定したタイミングタスクは毎朝6時にfreememを実行することです.shスクリプト.
 
 
 
原文参照:http://blog.csdn.net/u014740338/article/details/66975550