EC2インスタンスでMTUを永続化

  • 6
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

EC2インスタンスからRedshiftへ接続するためにインスタンスタイプによってはMTUを変更する必要があります。

参考
* クライアントでクエリがハングしたようになり、クラスターに到達しない | AmazonWebServices
* Amazon RedshiftとEC2のインスタンスタイプに於ける"MTU"の関係について | Developers.IO

リンク先のコマンド(ip, ifconfig)でMTUを変更できますが永続化できないため、インターフェイス設定ファイルに記述する必要がありました。

root> echo 'MTU=1500' >> /etc/sysconfig/network-scripts/ifcfg-eth0

しかし、EC2インスタンスの場合、インターフェイス設定ファイルに記述しても永続化できておらず、サーバを再起動するとMTUが元に戻ってしまいました。

調べたところ、AWS Developer Forumsに該当するスレッドがありました。

Here is what should be added to the /etc/dhcp/dhclient.conf (on Ubuntu Precise LTS):

#added these two lines before the request line
default interface-mtu 1500;
supercede interface-mtu 1500;

AWS Developer Forums: How to set MTU permanently on Amazon ...

どうやらdhclientが原因みたいです。

プロセスを確認してみます。

$ ps -ef | grep [d]hclient
root       718     1  0 08:49 ?        00:00:00 /sbin/dhclient -1 -q -lf /var/lib/dhclient/dhclient-eth0.leases -pf /var/run/dhclient-eth0.pid eth0

-lf オプションで指定されているリースファイルを見てみます。

/var/lib/dhclient/dhclient-eth0.leases
lease {
  interface "eth0";
  fixed-address 10.0.0.5;
  option subnet-mask 255.255.255.0;
  option dhcp-lease-time 3600;
  option routers 10.0.0.1;
  option dhcp-message-type 5;
  option dhcp-server-identifier 10.0.0.1;
  option domain-name-servers 10.0.0.2;
  option interface-mtu 9001;
  option broadcast-address 10.0.0.255;
  option host-name "ip-10-0-0-5";
  renew 3 2015/04/08 14:07:19;
  rebind 3 2015/04/08 14:30:01;
  expire 3 2015/04/08 14:37:31;
}
...

MTU値が設定されていました。

さらに、ifup-ethスクリプトで実際の動作を見てみます。

/etc/sysconfig/network-scripts/ifup-eth.
## 99行目あたり
if [ -n "${MTU}" ]; then
   ip link set dev ${DEVICE} mtu ${MTU}
fi

...(省略)...

## 162行目あたり
if [ -n "${DYNCONFIG}" -a -x /sbin/dhclient ]; then
    if [[ "${PERSISTENT_DHCLIENT}" =  [yY1]* ]]; then
       ONESHOT="";
    else
       ONESHOT="-1";
    fi;
    generate_config_file_name
    # copy any lease obtained by the initrd
    for file in /dev/.dhclient-${DEVICE}.leases /dev/.initramfs/net.${DEVICE}.lease ; do
        if [ -f "${file}" ]; then
            mv -f $file /var/lib/dhclient/dhclient-${DEVICE}.leases
            [ -x /sbin/restorecon ] && restorecon /var/lib/dhclient/dhclient-${DEVICE}.leases > /dev/null 2>&1
        fi
    done
    DHCLIENTARGS="${DHCLIENTARGS} ${DHCP_HOSTNAME:+-H $DHCP_HOSTNAME} ${ONESHOT} -q ${DHCLIENTCONF} -lf /var/lib/dhclient/dhclient-${DEVICE}.leases -pf /var/run/dhclient-${DEVICE}.pid"
    echo
    echo -n $"Determining IP information for ${DEVICE}..."
    if [[ "${PERSISTENT_DHCLIENT}" !=  [yY1]* ]] && check_link_down ${DEVICE}; then
        echo $" failed; no link present.  Check cable?"
        exit 1
    fi

    ethtool_set

    if /sbin/dhclient ${DHCLIENTARGS} ${DEVICE} ; then
                echo $" done."
                dhcpipv4="good"
    else
                echo $" failed."
                if [[ "${IPV4_FAILURE_FATAL}"  = [Yy1]* ]] ; then
                        exit 1
                fi
                if [[ "$IPV6INIT" != [yY1]* && "$DHCPV6C" != [yY1]* ]] ; then
                        exit 1
                fi
                net_log "Unable to obtain IPv4 DHCP address ${DEVICE}." warning
    fi
...

99行目あたりでMTUが更新されてますが、162行目あたりでdhclientが動くため、そのときにMTUが上書きされているのが原因かなと思います。

したがって、dhclient.confに次のような記述をします。

/etc/dhcp/dhclient.conf
default interface-mtu 1500;
supersede interface-mtu 1500;

default interface-mtuはAWSのDHCPサーバからMTUが設定されるので記述しなくても良いと思いますが、supersede interface-mtuはDHCPクライアントの値を使うように設定するため、必ず記述してください。

上記のリンク先で、supersedesupercedeにスペルミスしていてそれをコピペしたので、設定が反映されてなくてハマってました(ちゃんとドキュメント読めばすぐ分かったので反省)。

すぐに設定反映させるには、service network restartを実行すれば良いです。

設定反映後のリースファイルを再び見てみます。

/var/lib/dhclient/dhclient-eth0.leases
lease {
  interface "eth0";
  fixed-address 10.0.0.5;
  option subnet-mask 255.255.255.0;
  option routers 10.0.0.1;
  option dhcp-lease-time 3600;
  option dhcp-message-type 5;
  option domain-name-servers 10.0.0.2;
  option dhcp-server-identifier 10.0.0.1;
  option interface-mtu 1500;
  option broadcast-address 10.0.0.255;
  option host-name "ip-10-0-0-5";
  renew 5 2015/04/10 02:43:14;
  rebind 5 2015/04/10 03:12:24;
  expire 5 2015/04/10 03:19:54;
}
...

MTUが1500に変更されていることがわかります。