急激に落ちたネットワークのパフォーマンス

初回ということで、サービスイン直後に最初に陥った問題について紹介します。 結論としては、「ネットワーク周りの設定を見直そう」に尽きます。


低負荷のときには正常に動いているかのように見えていた環境が、ネットワーク負荷の高まりにより、急に動作しなくなることがよくあります。
Donutsの場合、まさにこの状況が発生しました。

このようなときは、まずNICの状況を把握し、NICの設定内容が使用している回線に合った設定になっているか、auto-neg、全二重/半二重、通信速度がプロバイダが指定している値と合っているか確認します。

NICの状態を確認する

最初に、ifconfigで現状を確認。

# ifconfig
eth0      Link encap:Ethernet  HWaddr xx:xx:xx:xx:xx:xx  
          inet addr:192.168.xx.xx  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: xxxx/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1236623 errors:7434 dropped:7434 overruns:0 frame:0
          TX packets:1145319 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:463793883 (442.3 MiB)  TX bytes:469182630 (447.4 MiB)

ifconfig で errors, dropped, overruns, frame に0以外の数値が出ていれば、まず間違いなく、何かパラメータがおかしいです。(各項目の詳しい意味については他に任せますが、ルータのマニュアル等が詳しいです)

上記の場合、「packets:1236623 errors:7434 dropped:7434」となっており、何か起こっています。そこで、NICの設定状況を確認します。

NICの設定確認と変更を行う

現在の設定の確認と変更は ethtool で行います。

# ethtool eth0
Settings for eth0:
        Supported ports: [ TP ]
        Supported link modes:   10baseT/Half 10baseT/Full 
                                100baseT/Half 100baseT/Full 
                                1000baseT/Full 
        Supports auto-negotiation: Yes
        Advertised link modes:  Not reported
        Advertised auto-negotiation: No
        Speed: 100Mb/s
        Duplex: Full
        Port: Twisted Pair
        PHYAD: 1
        Transceiver: internal
        Auto-negotiation: yes
        Supports Wake-on: g
        Wake-on: d
        Link detected: yes

プロバイダからは Autoneg は無効と指定されていたのに、yes になっていました。そのせいでDuplex が Full と Half でブレ、結果としてパケットロスが発生していたようです。

# ethtool -s eth0 speed 100 autoneg off duplex full

として、Autonegをoffに変更しましたた。しばらくしてから、もう一度 ifconfig でerrors がそれ以上増えていないことを確認し、一安心。

1000BASE-T の場合は仕様上 Auto-negotiation は常に on なので、

# ethtool -s eth0 speed 1000 autoneg off

などの設定はできません。

Offload処理をチェックする

ついでにOffload処理についても見ておきましょう。Offload処理は、CPUに代わってNICが処理を行うことでCPU負荷を下げる機能なのですが、環境によっては高負荷の時のパケットロスにつながることがあるようで、Donutsのサーバでは全てoff にしてあります。

# ethtool -k eth0
Offload parameters for eth0:
rx-checksumming: off
tx-checksumming: off
scatter-gather: off
tcp segmentation offload: off
udp fragmentation offload: off
generic segmentation offload: off
generic-receive-offload: off

全てoffにする設定はこちら↓

# ethtool -K eth0 rx off tx off tso off

余談ですが、ethtool のオプションは、

  小文字⇒内容確認、大文字⇒設定

である一方で、基本設定(generic options)だけは、

  オプションなし⇒内容確認、「 -s 」⇒設定

であるのは私にはどうも覚えにくくて…