本ページは広告が含まれています。気になる広告をクリック頂けますと、サーバ運営費になります(^^
ここ最近、夜10時ごろになるとインターネット接続ができなくなります。この時はルータを再起動する事で元に戻るのですが、これが2日ほど続けて起こっており、もしかしたら今晩も起こるだろうと思うと憂鬱。
ログをあさる
問題が出た、一昨日と、昨日のログの中できになるものが
[root @ untangle] /var/log # egrep 'too many orphaned sockets' syslog.1 |less Jul 25 22:07:37 untangle kernel: [85047.045932] TCP: too many orphaned sockets Jul 25 22:07:37 untangle kernel: [85047.045941] TCP: too many orphaned sockets Jul 25 22:07:37 untangle kernel: [85047.045951] TCP: too many orphaned sockets Jul 25 22:07:37 untangle kernel: [85047.045961] TCP: too many orphaned sockets ・・・続く
他の日は出ていないので、これが原因っぽいです。
tcp_max_orphansとは
システムで保持されたユーザファイルハンドルのいずれにも接続されていない TCP ソケットの最大数。この数を越えると孤立したコネクションは直ちにリセットされ、警告が出力されます。
多分、natする時に利用する接続ポートが足りてないから、それ以上接続しようとすると、切られてしまってインターネット接続できないって事になるんじゃないかと。
だから、
TCP: too many orphaned sockets
孤立したソケットというのは、相手側のセッションがないソケットという意味で、それが多すぎますよ。
なので、tcp_max_orphansを大きくしなきゃいけませんねという事につながります。
指標の確認
[root @ untangle] /var/log # cat /proc/sys/net/ipv4/tcp_mem 17829 23773 35658
最初:low:TCPがこの値以下のメモリーページ数を使用すると、TCPはメモリーの解放を考慮しません。
孤立したソケットの数が多すぎる
2つ目:pressure:TCPがこの値を超えるメモリーページ数を使用すると、TCPはメモリー使用量を安定させようとし、プレッシャーモードに入り、メモリー消費量が下限値を下回るとプレッシャー状態を終了します。
第三:高:TCPソケットが、ページメッセージキューにバッファリングされたデータのすべての量を可能にし、メモリ占有率がこの値を超えた場合、システムが配布ソケットを拒否し、バックグラウンドのログ出力「TCP:孤立したソケットのあまりに多くの」ソケットのうちは(あるべきメモリ)。
上限を超えた場合、dmesgでOut of Socket memoryエラーが報告され、プログラムが強制終了されます
この 17829 23773 35658 という数字はメモリーのページ数で、以下のコマンドを利用すると、ページサイズがどれくらいか分かります。
[root @ untangle] /var/log # getconf PAGESIZE 4096
ページサイズは4096B であり、4KBという事になるため、
17829 23773 35658
71.3MB 95.92MB 142.6MB
という事になります。
既定値は
既定値はブート時に利用可能なメモリの量から計算されます。
networking/ip-sysctl.txt
メモリは4GB搭載しており、だいたいピークでも50%くらいの使用率です。
[root @ untangle] /var/log # free -h total used free shared buff/cache available Mem: 3.9G 1.5G 216M 112M 2.2G 2.1G Swap: 10G 21M 10G
tcp_max_orphansを設定する
システムが、どのユーザファイルハンドルにもアタッチしていない TCP ソケットを保有できる最大数。この数を越えると、 みなしごの接続は直ちにリセットされ、警告が表示されます。 この制限は単純な DoS 攻撃を防ぐためにあります。 この機能に頼りすぎたり、わざと制限を小さくしたりしてはいけません。 ネットワークの状況によって必要な場合は、 (できればメモリを追加してから) デフォルトより増やすのはかまいません。 また、ぐずぐずするネットワークサービスを調整して、 そのような状態を積極的に殺すようにしてください。 再度強調しておきますが、みなしごの接続は、 それぞれスワップ不可能なメモリを最大 64K 消費するのです。
[root @ untangle] /var/log # cat /proc/sys/net/ipv4/tcp_max_orphans 4096
4096 × 64KB = 約262MB これって、tcp_memの上限越えてますよね。だと不具合起こすのかな。
とりあえず、tcp_max_orphansを少し大きくしてみて今晩どうなるか確認してみます。
[root @ untangle] /etc # sysctl -w net.ipv4.tcp_max_orphans=6144 net.ipv4.tcp_max_orphans = 6144 [root @ untangle] /etc # cat /proc/sys/net/ipv4/tcp_max_orphans 6144
また、根本にかかわるtcp_memも大きくしておきました。
vi /etc/sysctrl.conf net.ipv4.tcp_mem = 35658 47546 71316
で、
sysctrl -p
として反映させました。
これでも、
6144 ×64 = 393,216
71316 × 4 = 285,264
で、tcp_memの最大値より、tcp_max_orphansの方が値が大きい状態です。もしかしたらこれではうまくいかないかも。
さらに値を大きくしました。
設定したその夜は大丈夫だったのに、その翌日の夜に再度同じ現象でルータがインターネットへ接続できない状態へ。ダメ元でさらに値を大きくしてみました。
vi /etc/sysctrl.conf net.ipv4.tcp_mem = 71316 95092 142632 net.ipv4.tcp_max_orphans=8192
で、
sysctrl -p
として反映させました。
値を確認すると、
[root @ untangle] ~ # cat /proc/sys/net/ipv4/tcp_mem 71316 95092 142632 [root @ untangle] ~ # cat /proc/sys/net/ipv4/tcp_max_orphans 8192
となっています。
試算してみます。tcp_mem 142632 は、1ページあたり4KBなので、約570MB
それに対して tcp_max_orphansは、8192で、1つの接続が最大64KB消費するので、約524MB
計算上では、8192を越えたら、接続はリセットされていき、tcp_memの上限には達しないはずなので。これでうまくいくかな。
問題が起こる時のUntangleグラフ
この問題は今のところルータを再起動しないと解決しないところにあります。ルータでインターネット接続できない時には下記メッセージが出ています。
[root @ untangle] /var/log # egrep 'too many orphaned sockets' syslog.2 |less Aug 7 21:43:20 untangle kernel: [513515.787011] TCP: too many orphaned sockets Aug 7 21:43:20 untangle kernel: [513515.788008] TCP: too many orphaned sockets Aug 7 21:43:20 untangle kernel: [513515.788014] TCP: too many orphaned sockets Aug 7 21:43:20 untangle kernel: [513515.788016] TCP: too many orphaned sockets Aug 7 21:43:20 untangle kernel: [513515.788018] TCP: too many orphaned sockets
この時間帯のネットワーク使用帯域を確認するものの特に異常な値は出ていません。

アクティブなホストの数も、変な山はできているものの、異常に多くのホストがつなげているという記録もなく。

セッション数もこの時間前後は少し多いのかなと思いはするもののベラボーに多いという事もないようです。ただ、気になるのは9:20 PMあたりから増えてるところでしょうか。

CPUへの負荷が異常が出ています。

CPUだけ負荷が異常で、メモリーにはFree領域があるのが確認できます。

この時に利用されているポート、セッション数の多い通信はDNSアクセスです。

参考
TCP: too many of orphaned sockets