Intel i218/i219 NIC lähetysnopeuden ongelmat Linux-kernelillä 4.19 (4.15 alkaen)

Aloin kummastelemaan miksi palvelimella tulee sisään täydellä Gigabit-nopeudella ja ulos lähtee vain puolikkaalla.
Niinpä tein tukipyynnön Hetznerille ja sain melko pian vastauksen: ehkä kyse olisi tästä https://wiki.hetzner.de/index.php/Low_performance_with_Intel_i218/i219_NIC/en.

Kyllä. Tästä oli kyse ja suorituskyky palautui normaaliksi.
Linux-ytimestä 4.15 alkaen näiden Intelin verkkokorttien ajurissa (e1000e) on ollut DMA-käsittelyä hidastava korjaus puskurin ylivuodon bugiin, joka jättää koko laitteen jumiin mikäli palvelin on runsaasti kuormitettu UDP-liikenteellä ja verkkokaapelia irroitetaan muutamia kertoja.

"I219LM and I219V devices can fall into unrecovered Tx hang under very stressfully UDP traffic and multiple reconnection of Ethernet cable. This Tx hang of the LAN Controller is only recovered if the system is rebooted. Slightly slow down DMA access by reducing the number of outstanding requests. This workaround could have an impact on TCP traffic performance on the platform. Disabling TSO eliminates performance loss for TCPtraffic without a noticeable impact on CPU performance." (https://github.com/torvalds/linux/commit/b10effb92e272051dd1ec0d7be56bf9ca85ab927)

Ok, konesalissa kaapelia ei juurikaan kiskota ja DDoS-suojatussa ympäristössä olisi aika harvinaista kärsiä tällaisesta tilanteesta. Näinpä tuo "korjaus" on vain suorituskykyä heikentävä haitta.

Paremman TCP-läpäisyn saavuttamiseksi ongelman voi kiertää poistamalla TCP segmentation offloading -ominaisuuden käytöstä:
ethtool -K <verkkokortin nimi> tso off gso off
Luonnollisesti lisäsin tämän /etc/rc.local, jotta uudelleenkäynnistyksessä ongelman ohitus ei unohtuisi.