JavaサーバーはLinuxで特定のポートで実行され、何千人ものユーザーの永続的な接続を受け入れます。最近、クライアントはタイムアウトエラーで接続できなくなりました。トラフィックを疑っていますが高すぎますが、Java=ログは実際には1秒あたりに接続されている接続が少ないことを示しています。
同時に試行している人数が多すぎて、基本的にOSレベルで削除されているため、Javaプログラムが実際に接続を受け入れる機会を得ることはありませんか?誰かがソケットをヒットしようとしていることを示すことができるLinuxのある種のログ?
iptables -I INPUT -p tcp --dport some_port -j LOG
その後tail -f /var/log/messages
その後、そのルールによってヒットしたデータの量を確認するには:iptables -L -n -v
または、tcpdumpを実行してポートをgrepで出力することもできます。
本当に厄介なネットワーク問題があるとき、私は wireshark を起動する傾向があります。私にとって、重要な詳細に取り掛かる必要がある場合、これ以上のネットワーク診断ツールはありません。また、ソースボックスまたは宛先ボックスのどちらにもインストールできない場合も心配はいりません。あなたはtcpdump -w
開始時および/または終了時にパケットデータをファイルに書き込み、必要に応じて別のボックスのWiresharkにファイルをフィードします。
watch -n1 -d "netstat -an | grep ESTABLISHED | wc -l"
現在確立されている接続を表示します。
これをアクティブなulimit
設定と比較してください。もちろん、Javaアプリが処理できる接続の最大数と比較してください。
Javaスレッドがソケットレベルで取得しているものを正確に確認するのは良いことです。同時に、それをOSネットワーク情報と関連付ける必要があります。AppFirstを見てください。この種のもの。