Linuxルータインターネット接続ができなくなる原因tcp_max_orphans

ここ最近、夜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

Linux TCP/IP parameter note

networking/ip-sysctl.txt

13.2. あまり知られていない設定

関連コンテンツ