Chciałbym wyłączyć odciążanie segmentacji TCP na serwerze CentOS5. Przy użyciu ethtool polecenie brzmi: ethtool -K eth0 tso off
To ustawienie jednak zachowuje się tylko dla tej sesji. Jak mogę utrzymać to przez ponowne uruchomienie?
Chciałbym wyłączyć odciążanie segmentacji TCP na serwerze CentOS5. Przy użyciu ethtool polecenie brzmi: ethtool -K eth0 tso off
To ustawienie jednak zachowuje się tylko dla tej sesji. Jak mogę utrzymać to przez ponowne uruchomienie?
Odpowiedzi:
Z tej strony :
Możesz wprowadzić polecenia ethtool w /etc/rc.local
(lub odpowiedniku twojej dystrybucji), gdzie polecenia są uruchamiane po zakończeniu bieżącego poziomu pracy, ale nie jest to idealne. Usługi sieciowe mogły zostać uruchomione podczas poziomu pracy, a polecenia ethtool zwykle zakłócają ruch w sieci. Bardziej preferowane jest stosowanie poleceń podczas uruchamiania interfejsu.
Usługa sieciowa w CentOS ma taką możliwość. Skrypt /etc/sysconfig/network-scripts/ifup-post
sprawdza istnienie /sbin/ifup-local
, a jeśli istnieje, uruchamia go z nazwą interfejsu jako parametrem (np . /sbin/ifup-local eth0
:)
Możemy utworzyć ten plik za pomocą dotyku, /sbin/ifup-local
aby był wykonywalny, chmod +x /sbin/ifup-local
ustawiając kontekst SELinux za pomocą, chcon --reference /sbin/ifup /sbin/ifup-local
a następnie otwierając go w edytorze.
Prosty skrypt do zastosowania tych samych ustawień do wszystkich interfejsów byłby podobny
#!/bin/bash
if [ -n "$1" ]; then
/sbin/ethtool -G $1 rx 4096 tx 4096
/sbin/ethtool -K $1 tso on gso on
fi
Należy pamiętać, że spróbuje to zastosować ustawienia do WSZYSTKICH interfejsów, nawet do sprzężenia zwrotnego.
Jeśli mamy różne interfejsy, do których chcemy zastosować inne ustawienia lub chcemy pominąć sprzężenie zwrotne, możemy złożyć instrukcję case
#!/bin/bash
case "$1" in
eth0)
/sbin/ethtool -G $1 rx 16384 tx 16384
/sbin/ethtool -K $1 gso on gro on
;;
eth1)
/sbin/ethtool -G $1 rx 64 tx 64
/sbin/ethtool -K $1 tso on gso on
/sbin/ip link set $1 txqueuelen 0
;;
esac
exit 0
Teraz ustawienia ettool są stosowane do interfejsów podczas ich uruchamiania, wszystkie potencjalne przerwy w komunikacji sieciowej są wykonywane w miarę uruchamiania interfejsu, a serwer może nadal uruchamiać się z pełnymi możliwościami sieci.
Dla RHEL7 w / etc / sysconfig / network-scripts / ifcfg- * możesz mieć:
ETHTOOL_OPTS = "- K $ {DEVICE} gso off gro off tso off"
jeśli więcej opcji, użyj jak
ETHTOOL_OPTS = "- K $ {DEVICE} gso wyłączone; -K $ {DEVICE} gro off; -K $ {DEVICE} tso wyłączone"
musisz oczywiście zdefiniować URZĄDZENIE w swoim pliku ifcfg.
Nie potrzeba żadnych skryptów rc.local ani dodatkowych skryptów ifup. Łatwy w ogólnych systemach wdrażania.
Jeśli korzystasz z RHEL7 (lub podobnego) i używasz Network Managera zamiast /etc/init.d/network do kontrolowania interfejsów, proponowana odpowiedź nie będzie działać, ponieważ / sbin / ifup-local (a także ifdown-pre-local i ifdown-local ) nigdy nie zostanie wykonany.
Zamiast tego umieść skrypty w /etc/NetworkManager/dispatcher.d/ i upewnij się, że usługa NetworkManager-dispatcher jest włączona
systemctl enable NetworkManager-dispatcher
Wskazówka: dyspozytor uruchomi się tylko wtedy, gdy NetworkManager dokona zmian w interfejsie, nie musi być uruchomiony ani nic, więc jeśli status brzmi
Active: inactive (dead)
w porządku!
Upewnij się także, że twój skrypt to:
Teraz NetworkManager przekaże dyspozytorowi dwie (2) zmienne:
1 USD to interfejs ( eno16777984 , eth0 , ppp0 itp.)
2 USD za status (w górę lub w dół )
i pozwala na tworzenie łańcuchów skryptów (tak jak / etc / rc ...), aby mieć pewną kontrolę nad kolejnością ich uruchamiania:
10 pierwsze, 20 sekund i tak dalej ...
Kolejność będzie rosła przy połączeniu
jeśli [$ 2 = „w górę”] jest to 10-sekundowy, a następnie 20-sekundowy
i zejście po rozłączeniu
jeśli [$ 2 = "w dół"] otrzymasz 20 sekund, a następnie 10-pierwszy
i tak dalej.
Aby osiągnąć to, czego szukał OP, możesz umieścić coś takiego:
#!/bin/bash
if [ "$1" = "eth0" && "$2" = "up" ]; then
/sbin/ethtool --offload eth0 tso off
fi
w /etc/NetworkManager/dispatcher.d/20-ethtool
I nazwij to dniem.
Twoje zdrowie
if [ "$1" = "eth0" ] && [ "$2" = "up" ]; then
Wystąpiły problemy z zaakceptowaną odpowiedzią (którą, pośpiesznie dodając, okazało się bardzo pomocne), ponieważ korzystałem z połączonych interfejsów.
Długo zajęło mi odkrycie, co się dzieje, ale odkryłem, że przywołując więź, a nawet osobno wychowując niewolnika, ifup-local
skrypt nie będzie wywoływał interfejsów niewolników. Zakładam, że dzieje się tak, ponieważ interfejsy slave nie mają przypisanych żadnych adresów IP.
Aby obejść ten problem, zmodyfikowałem mój, ifup-local
aby przeanalizować zawartość /proc/bonding/bondX
interfejsu, który został przywołany, jeśli to była więź, aby uzyskać nazwy interfejsu slave, a następnie zrobiłem z nimi niezbędne rzeczy.
W końcu mój ifup-local
wyglądał następująco:
#!/bin/bash
if [ -n "$1" ]
then
IFACE="$1"
# If interface is physical
if [[ $IFACE =~ ^eth[0-9]+$ ]]
then
# Do whatever you need for a physical interface here
# example below
/sbin/ethtool -K $IFACE rx off
# Else if it's a bond
elif [[ $IFACE =~ ^bond[0-9]+$ ]]
then
# Do whatever you need for the bond here
# example below
/sbin/ethtool -K $IFACE gso off
# Now deal with slaves
# Pull out slave interface names from /proc/net/bonding/bondX
SLAVES=$(/bin/grep -oP "Slave Interface: \K(eth[0-9]+)" /proc/net/bonding/$IFACE)
for SLAVE in $SLAVES
do
# Do whatever you need with the slave here
# example below
/sbin/ethtool -K $SLAVE tso off gso off
done
fi
fi
Zastrzeżenie: zawartość / proc / net / bonding / bondX może być inna dla różnych wersji RedHat / Fedora / CentOS niż ta, z której korzystałem podczas pisania skryptu, więc polecenie wyciągnięcia nazw interfejsów slave może nie działać .
Nie na temat, dla użytkowników Ubuntu, którzy przybyli tutaj, jak ja, to jako notatka:
Na Ubuntu: podręcznik jest edycja pliku / etc / network / interfaces , który z kolei jest odczytywany przez skrypty init.d / pre-up-up itp. Tak an / etc / network / interfaces plik może wyglądać następująco:
auto eth0
iface eth0 inet static
pre-up /sbin/ethtool -s eth0 speed 10 duplex full
Tak mówią doktorzy, ale to nie działa . Może być tak, że logika analizowania w skryptach wstępnego i wstępnego jest nieco przestarzała i nie analizują wymaganych ustawień z pliku interfejsów. Nie wiem Przynajmniej mi to nie działało.
Więc hack-ish, ale działającym rozwiązaniem jest na razie utworzenie / edycja lokalnego pliku /etc/rc.local i podanie polecenia, które ma zostać tam wykonane (należy jednak pamiętać, że może to przerwać pracę sieci na kilka sekund po tym, jak interfejs został już uruchomiony) wychowany). Mając to:
ethtool -s eth0 speed 10 duplex full autoneg on
w /etc/rc.local jest działającym rozwiązaniem do spowolnienia interfejsu zgodnie z powyższym zamierzeniem.
Na Ubuntu 17.04 i nowszych
Nowsze wersje Ubuntus używają Systemd, a zatem plik rc.local niekoniecznie jest wykonywany po osiągnięciu na przykład poziomu uruchamiania. Usługa „rc-local” musi być włączona. Chociaż wydaje się, że jest to domyślnie, prawdopodobnie ze względu na kompatybilność wsteczną - sprawdź jego status za pomocąsudo systemctl status rc-local
pre-up
Dyrektywa pracował dla mnie na Linux Mint 17,3 do ustawiania flagi OSP dzięki :)
Przekonałem się, że ustawienie tego rodzaju konfiguracji w /etc/network/interfaces
rzeczywistości działa dla Ubuntu ( large-receive-offload
oczywiście, że użyłem go do wyłączenia , ale to nie powinno mieć znaczenia):
auto eth1 iface eth1 inet static adres xxx.xxx.xxx.xxx maska sieci xx pre-up / sbin / ethtool -K $ IFACE lro off
W przypadku Ubuntu możesz to zrobić, dodając następujący wiersz /etc/network/interfaces
:
auto eth0
iface eth0 inet static
[...]
post-up /sbin/ethtool -K eth0 tso off gso off gro off
post-up tutaj wykona daną operację po uruchomieniu określonego interfejsu.
Tak, na razie nie można tego zrobić przy użyciu plików konfiguracyjnych. Możesz wprowadzić polecenie /etc/init.d/rc.local
i należy to zrobić.
Ten plik jest wykonywany na końcu sekwencji rozruchowej, więc interfejs zostałby wyłączony.