急激に落ちたネットワークのパフォーマンス
初回ということで、サービスイン直後に最初に陥った問題について紹介します。 結論としては、「ネットワーク周りの設定を見直そう」に尽きます。
低負荷のときには正常に動いているかのように見えていた環境が、ネットワーク負荷の高まりにより、急に動作しなくなることがよくあります。
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 」⇒設定
であるのは私にはどうも覚えにくくて…