問題の簡単な説明:Intel Core-2 Q6600の64ビットGentooは、再起動後に合計メモリ8GBのうち約3GBが使用されたことを報告します。このメモリはどのプロセスでも占有されず、バッファ/キャッシュでは使用されません。
コンテキスト:emerge
ソースからOctaveをビルドしようとしたときに、OOMがプロセスを終了した後に初めてこの動作が検出されました。システムが再応答したときに、どのプロセスでも使用されていない約3 GBのメモリがまだ残っていました。 (最初はこれが実際にそうだったと確信することはできません。おそらく以前に気づかなかったかもしれません。)
OOMの問題についてよく知らずに再起動してみましたが、メモリが再利用されているそうです。
その後、Memcheck86+を試してみましたが、3246.3MBで「失敗したアドレス」エラーが報告されました(5回繰り返しテスト)。 RAM周波数を下げるとエラーが消えました(テスト3回繰り返し)。
しかし、私のGentooには、明確な説明なしに3GBが使用されているという継続的な報告があります(下記の診断レポートを参照)。
私はまた、ライブディストリビューション(Parted Magic)を試しましたが、明らかに正常に動作しました(開始後約数百のラムを使用しました)。
考えられる原因や解決策の提案がありますか?
編集する: これでこの問題を克服できますが、まだ説明できません。これまで私が追跡した内容を説明します。
- シングルユーザーモードで起動すると、3GBのメモリは使用されません。
ブート
iptables
の結果、3GB の使用量が発生し、dmesg は以下を報告します。nf_conntrack: vmalloc に置き換え
後続の停止では、
iptables
プロセスは再開されず、メモリは引き続き使用されます。
nf_conntrack
その後、組み込まれなくなってモジュールにロードされるようにカーネル設定を変更しました。再起動後、起動時にメッセージが表示されiptables
ず、falling back to vmalloc
3GBが消費されません。
どのように説明するのか分かりません。一部のカーネル開発者は、この動作の原因が正確に何であるかを説明するのに役立ちますか?
関連レポート:
答え1
この問題は、接続追跡テーブルとハッシュテーブルの最大サイズ設定が正しくないために発生することがあります。 Linuxカーネルは、iptables nf_conntrackモジュールの接続テーブルを追跡するために連続ページを割り当てようとします。 conntrack は、物理メモリ不足のために vmalloc にフェイルバックします。
テーブルは確立された接続に基づいて動的に作成されませんが、一部のカーネルパラメータに基づいて完全に割り当てられます。
いくつかの追加の症状が大量に見られることがあります。nf_conntrack: vmalloc に置き換えます。/var/log/messages (または /var/log/kern.log またはその両方) のメッセージです。
この問題は、リンクされたトラックテーブルを簡単に調整し、サイズを小さくすることで簡単に解決できます。システム使用量に応じて適切な調整を行う必要があります。このシステムで専用のネットワークファイアウォールを運用している場合は、接続追跡テーブルを高くする必要がありますが、ネットワーク侵入から保護するためにiptablesを使用すると、接続追跡テーブルははるかに低くなる可能性があります。
接続追跡の調整の詳細については、次を参照してください。https://wiki.khnet.info/index.php/Conntrack_tuning
conntrack -L
システム値を微調整するには、まず(または)を実行して、システムが開いた接続数を評価できます /sbin/sysctl net.netfilter.nf_conntrack_count
。より良いことは、時間の経過とともに接続を追跡する統計を維持することです(ムニンうまくいきました)追跡された最大接続数に基づいて使用してください。この情報に基づいて/etc/sysctl.confを適切に設定できます。
微調整時に追跡テーブルへの接続が維持される期間も確認してください。場合によっては、ネットワーク構成エラーまたはエラーが原因で、conntrackテーブルに偽のデータ接続が含まれることがあります。たとえば、サーバーが決して閉じられていないSYN接続を受信したり、クライアントが突然接続を切断したり、ソケットを長時間開いたままにすることがあります。
第二に、conntrackエントリが正しいことを確認してください。場合によっては、一部のネットワークまたはファイアウォールの設定が正しくないため、conntrack テーブルにゴミがいっぱいになることがあります。通常、これは完全に設定されていない接続項目です。たとえば、サーバーが着信接続のSYNパケットを受信したが、サーバーの応答が常にネットワークのどこかで失われる場合、これが発生する可能性があります。
ランニングを実行すると、これらの値を微調整するときにsysctl -a | grep conntrack | grep timeout
いくつかの洞察が得られます。デフォルトは非常に保守的です。典型的なタイムアウトの場合、600(10分)、確立されたTCP接続(5日)は432000です。システムの使用量とネットワークの動作によっては、conntrackテーブルのアクティブな接続数を減らすために微調整する必要があります。これはより低い値を定義するのに役立ちます。
ただし、conntrackテーブルのサイズを小さくしすぎないように注意してください。それ以外の場合、反対の効果が発生する可能性があります。接続は追跡できないため、iptablesによって削除され、次のメッセージがログファイルに表示され始めます。"カーネル:ip_conntrack:テーブルがいっぱいになり、パケットが破棄されます。"
これが問題であることを確認するには、次の出力を提供します。
cat /proc/sys/net/ipv4/ip_conntrack_max
cat /proc/sys/net/ipv4/netfilter/ip_conntrack_buckets