AWS-hosted instances with optimized networking-support enabled see the 10Gbps interface as an Intel 10Gbps ethernet adapter (`
lspci | grep Ethernet` will display a string similar to
Intel Corporation 82599 Virtual Function). This interface makes use the
ixgbevf network-driver. Enterprise Linux 6 and 7 bundle the version 2.12.x version of the driver into the
kernel RPM. Per the
Enabling Enhanced Networking with the Intel 82599 VF Interface on Linux Instances in a VPC document, AWS enhanced networking recommends version 2.14.2 or higher of the
ixgbevf network-driver. To meet AWS's recommendations for 10Gbps support within an EL6 instance, it will be necessary to update the
ixgbevf driver to at least version 2.14.2.
The
ixgbevf network-driver source-code can be found on
SourceForge. It should be noted that not every AWS-compatible version will successfully compile on EL 6. Version 3.2.2 is known to successfully compile, without intervention, on EL6.
Notes:
>>>CRITICAL ITEM<<<
It is necessary to recompile the
ixgbevf driver and inject it into the kernel
each time the kernel version changes. This needs to be done between changing the kernel version and rebooting into the new kernel version. Failure to update the driver each time the kernel changes will result in the instance failing to return to the network after a reboot event.
Step #10 from the implementation procedure:
rpm -qa kernel | sed 's/^kernel-//' | xargs -I {} dracut -v -f /boot/initramfs-{}.img {}
Is the easiest way to ensure any available kernels are properly linked against the
ixgbevf driver.
>>>CRITICAL ITEM<<<
It is
possible that the above process can be avoided by installing
DKMS and letting it coordinate the insertion of the
ixgbevf driver modules into updated kernels.
Procedure:
The following assumes the instance-owner has privileged access to the instance OS and can make AWS-level configuration changes to the instance-configuration:
- Login to the instance
- Escalate privileges to root
- Install the up-to-date ixgbevf driver. This can be installed either by compiling from source or using pre-compiled binaries.
- Delete any `*persistent-net*.rules` files found in the /etc/udev/rules.d directory (one or both of 70-persistent-net.rules and 75-persistent-net-generator.rules may be present)
- Ensure that an `/etc/modprobe.d` file with the following minimum contents exists:
alias eth0 ixgbevf
Recommend creating/placing in /etc/modprobe.d/ifaliases.conf
- Unload any ixgbevf drivers that may be in the running kernel:
modprobe -rv ixgbevf
- Load the updated ixgbevf driver into the running kernel:
modprobe -v ixgbevf
- Ensure that the /etc/modprobe.d/ixgbevf.conf file exists. Its contents should resemble:
options ixgbevf InterruptThrottleRate=1
- Update the /etc/dracut.conf. Ensure that the add_drivers+="" directive is uncommented and contains reference to the ixgbevf modules (i.e., `add_drivers+="ixgbevf"`)
- Recompile all installed kernels:
rpm -qa kernel | sed 's/^kernel-//' | xargs -I {} dracut -v -f /boot/initramfs-{}.img {}
- Shut down the instance
- When the instance has stopped, use the AWS CLI tool to enable optimized networking support:
aws ec2 --region modify-instance-attribute --instance-id --sriov-net-support simple
- Power the instance back on
- Verify that 10Gbps capability is available:
- Check that the ixgbevf module is loaded
$ sudo lsmod
Module Size Used by
ipv6 336282 46
ixgbevf 63414 0
i2c_piix4 11232 0
i2c_core 29132 1 i2c_piix4
ext4 379559 6
jbd2 93252 1 ext4
mbcache 8193 1 ext4
xen_blkfront 21998 3
pata_acpi 3701 0
ata_generic 3837 0
ata_piix 24409 0
dm_mirror 14864 0
dm_region_hash 12085 1 dm_mirror
dm_log 9930 2 dm_mirror,dm_region_hash
dm_mod 102467 20 dm_mirror,dm_log
- Check that `ethtool` is showing that the default interface (typicall "`eth0`") is using the ixgbevf driver:
$ sudo ethtool -i eth0
driver: ixgbevf
version: 3.2.2
firmware-version: N/A
bus-info: 0000:00:03.0
supports-statistics: yes
supports-test: yes
supports-eeprom-access: no
supports-register-dump: yes
supports-priv-flags: no
- Verify that the interface is listed as supporting a link mode of `10000baseT/Full` and a speed of `10000Mb/s`:
$ sudo ethtool eth0
Settings for eth0:
Supported ports: [ ]
Supported link modes: 10000baseT/Full
Supported pause frame use: No
Supports auto-negotiation: No
Advertised link modes: Not reported
Advertised pause frame use: No
Advertised auto-negotiation: No
Speed: 10000Mb/s
Duplex: Full
Port: Other
PHYAD: 0
Transceiver: Unknown!
Auto-negotiation: off
Current message level: 0x00000007 (7)
drv probe link
Link detected: yes