ฉันต้องการปิดการแบ่งส่วนข้อมูล tcp บนเซิร์ฟเวอร์ CentOS5 การใช้ ethtool คำสั่งคือethtool -K eth0 tso off
อย่างไรก็ตามการตั้งค่านี้จะคงอยู่สำหรับเซสชันนี้เท่านั้น ฉันจะทำให้มันคงอยู่ได้ด้วยการรีบูตเครื่อง?
ฉันต้องการปิดการแบ่งส่วนข้อมูล tcp บนเซิร์ฟเวอร์ CentOS5 การใช้ ethtool คำสั่งคือethtool -K eth0 tso off
อย่างไรก็ตามการตั้งค่านี้จะคงอยู่สำหรับเซสชันนี้เท่านั้น ฉันจะทำให้มันคงอยู่ได้ด้วยการรีบูตเครื่อง?
คำตอบ:
จากหน้าเว็บนี้:
คุณสามารถป้อนคำสั่ง ethtool ใน/etc/rc.local
(หรือเทียบเท่าการกระจายของคุณ) ซึ่งคำสั่งจะทำงานหลังจาก runlevel ปัจจุบันเสร็จสมบูรณ์ แต่สิ่งนี้ไม่เหมาะ บริการเครือข่ายอาจเริ่มต้นขึ้นในระหว่างคำสั่ง runlevel และ ethtool มักจะขัดจังหวะการรับส่งข้อมูลเครือข่าย มันจะดีกว่าที่จะมีคำสั่งนำมาใช้เป็นอินเทอร์เฟซถูกนำขึ้นมา
บริการเครือข่ายใน CentOS มีความสามารถในการทำเช่นนี้ สคริปต์/etc/sysconfig/network-scripts/ifup-post
การตรวจสอบสำหรับการดำรงอยู่ของ/sbin/ifup-local
และถ้ามันมีอยู่แล้วทำงานด้วยชื่ออินเตอร์เฟซที่เป็นพารามิเตอร์ (เช่น: /sbin/ifup-local eth0
)
เราสามารถสร้างไฟล์นี้ได้ด้วยการสัมผัส/sbin/ifup-local
ทำให้มันใช้งานได้chmod +x /sbin/ifup-local
ตั้งค่าบริบท SELinux ด้วยchcon --reference /sbin/ifup /sbin/ifup-local
แล้วเปิดมันในโปรแกรมแก้ไข
สคริปต์ง่าย ๆ ที่ใช้การตั้งค่าเดียวกันกับอินเตอร์เฟสทั้งหมดจะเป็นสิ่งที่ต้องการ
#!/bin/bash
if [ -n "$1" ]; then
/sbin/ethtool -G $1 rx 4096 tx 4096
/sbin/ethtool -K $1 tso on gso on
fi
โปรดทราบว่าสิ่งนี้จะพยายามใช้การตั้งค่ากับอินเทอร์เฟซทั้งหมดแม้กระทั่งลูปแบ็ค
หากเรามีอินเทอร์เฟซที่แตกต่างกันเราต้องการใช้การตั้งค่าที่แตกต่างกันหรือต้องการข้ามลูปแบ็คเราสามารถสร้างข้อความสั่งเคส
#!/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
ขณะนี้การตั้งค่า ethtool ถูกนำไปใช้กับอินเทอร์เฟซเมื่อเริ่มต้นการขัดจังหวะที่อาจเกิดขึ้นกับการสื่อสารเครือข่ายทั้งหมดเกิดขึ้นเมื่ออินเทอร์เฟซถูกนำขึ้นมาและเซิร์ฟเวอร์ของคุณสามารถบู๊ตต่อไปได้
สำหรับ RHEL7 ใน / etc / sysconfig / network-สคริปต์ / ifcfg- * คุณอาจมี:
ETHTOOL_OPTS = "- K $ {อุปกรณ์} gso off gro off tso off"
หากตัวเลือกเพิ่มเติมจากนั้นใช้เช่น
ETHTOOL_OPTS = "- K $ {DEVICE} gso off; -K $ {DEVICE} ครางออกไป; -K $ {DEVICE} tso off"
คุณต้องกำหนดอุปกรณ์ตามธรรมชาติในไฟล์ ifcfg ของคุณ
ไม่จำเป็นต้องใช้สคริปต์ rc.local และ ifup พิเศษ ง่ายต่อคุณในระบบการปรับใช้ทั่วไป
หากคุณใช้งานRHEL7 (หรือเหมือนกัน) และใช้Network Managerแทน/etc/init.d/networkเพื่อควบคุมอินเตอร์เฟสของคุณคำตอบที่เสนอจะไม่ทำงานเนื่องจาก/ sbin / ifup-local (เช่นเดียวกับifdown-localและifdown-local ) จะไม่ถูกดำเนินการ
แทนที่จะใส่สคริปต์ของคุณลงใน/etc/NetworkManager/dispatcher.d/และให้แน่ใจว่าบริการNetworkManager-dispatcherเปิดใช้งาน
systemctl enable NetworkManager-dispatcher
คำแนะนำ:โปรแกรมเลือกจ่ายงานจะเริ่มต้นเมื่อ NetworkManager ทำการเปลี่ยนแปลงอินเทอร์เฟซก็ไม่จำเป็นต้องทำงานหรืออะไรก็ตามดังนั้นหากสถานะอ่าน
Active: inactive (dead)
ไม่เป็นไร!
ตรวจสอบให้แน่ใจด้วยว่าสคริปต์ของคุณคือ:
ตอนนี้ NetworkManager จะส่งผ่านตัวแปรสอง (2) ตัวแปรไปยังโปรแกรมเลือกจ่ายงาน:
$ 1เป็นอินเทอร์เฟซ ( eno16777984 , eth0 , ppp0 , ฯลฯ ... )
$ 2ถือสถานะ ( ขึ้นหรือลง )
และอนุญาตให้ผูกมัดสคริปต์ (เช่น / etc / rc ... ) เพื่อควบคุมลำดับที่โปรแกรมเลือกจ่ายงานจะดำเนินการ:
10 แรก, 20 วินาทีและต่อไป ...
คำสั่งซื้อจะเพิ่มขึ้นจากการเชื่อมต่อ
ถ้า [$ 2 = "up"] เป็น 10 ครั้งแรกตามด้วย 20 วินาที
และลดการเชื่อมต่อ
ถ้า [$ 2 = "down"] คุณจะได้รับ 20 วินาทีตามด้วย 10-first
และอื่น ๆ
ดังนั้นเพื่อให้บรรลุถึงสิ่งที่ OP มองหาคุณสามารถวางสิ่งนี้:
#!/bin/bash
if [ "$1" = "eth0" && "$2" = "up" ]; then
/sbin/ethtool --offload eth0 tso off
fi
ใน/etc/NetworkManager/dispatcher.d/20-ethtool
และเรียกมันว่าวันเดียว
ไชโย
if [ "$1" = "eth0" ] && [ "$2" = "up" ]; then
ฉันพบปัญหากับคำตอบที่ยอมรับ (ซึ่งฉันรีบเพิ่มฉันพบว่ามีประโยชน์มาก) เพราะฉันใช้อินเตอร์เฟสที่ถูกผูกมัด
ฉันใช้เวลาสักครู่เพื่อค้นหาว่าเกิดอะไรขึ้น แต่ฉันพบว่าเมื่อนำพันธะขึ้นมาหรือแม้กระทั่งเมื่อนำทาสขึ้นมาทีละifup-local
บทสคริปต์จะไม่ถูกเรียกใช้สำหรับอินเทอร์เฟซของทาส ฉันคิดว่าเป็นเพราะอินเทอร์เฟซสลาฟไม่มีที่อยู่ IP ใด ๆ ที่กำหนดให้
เพื่อแก้ไขปัญหานี้ฉันแก้ไขของฉันifup-local
เพื่อแยกเนื้อหาของ/proc/bonding/bondX
อินเทอร์เฟซที่ถูกนำขึ้นมาถ้าเป็นบอนด์เพื่อรับชื่ออินเทอร์เฟซของทาสแล้วทำสิ่งที่จำเป็นกับพวกเขา
ในท้ายที่สุดฉันifup-local
ดูเหมือนดังต่อไปนี้:
#!/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
ข้อแม้: เนื้อหาของ / proc / net / bonding / bondX อาจแตกต่างกันไปสำหรับ RedHat / Fedora / CentOS รุ่นต่าง ๆ กับที่ฉันใช้เมื่อฉันเขียนสคริปต์ดังนั้นคำสั่งเพื่อดึงชื่ออินเตอร์เฟสทาสอาจไม่ทำงาน .
Off-topic สำหรับผู้ใช้ Ubuntu ที่มาที่นี่เช่นฉันนี่เป็นบันทึกย่อ:
บน Ubuntu วิธีการทำหนังสือคือการแก้ไขไฟล์/ etc / network / interfacesซึ่งสคริปต์ init.d / pre-up-up อ่านแล้วจะถูกอ่าน ดังนั้นไฟล์/ etc / network / interfacesอาจมีลักษณะเช่นนี้:
auto eth0
iface eth0 inet static
pre-up /sbin/ethtool -s eth0 speed 10 duplex full
นั่นคือสิ่งที่เอกสารพูด แต่มันไม่ทำงาน อาจเป็นไปได้ว่าตรรกะการแยกวิเคราะห์ในสคริปต์ก่อนขึ้น - ลงเป็นวันที่บิตและพวกเขาไม่แยกวิเคราะห์การตั้งค่าที่จำเป็นจากไฟล์อินเตอร์เฟส ไม่ทราบ อย่างน้อยมันก็ไม่ได้ผลสำหรับฉัน
ดังนั้น hack-ish แต่วิธีแก้ปัญหาที่ใช้งานได้ในตอนนี้ยังคงสร้าง / แก้ไขไฟล์/etc/rc.localภายในเครื่องและระบุคำสั่งที่จะใช้งานที่นั่น นำขึ้นมา). ดังนั้นมีสิ่งนี้:
ethtool -s eth0 ความเร็ว 10 ดูเพล็กซ์เต็มอัตโนมัติ
in /etc/rc.localเป็นวิธีการทำงานเพื่อชะลออินเทอร์เฟซตามที่ตั้งใจไว้ข้างต้น
บนUbuntu 17.04 ขึ้นไป
Ubuntus ล่าสุดใช้ Systemd ดังนั้นไฟล์ rc.local จึงไม่จำเป็นต้องถูกเรียกใช้เมื่อถึงระดับ 'start' runlevel ต้องเปิดใช้งานบริการ "rc-local" แม้ว่าจะเป็นค่าเริ่มต้นด้วยเหตุผลด้านความเข้ากันได้ย้อนหลังอาจจะ - ตรวจสอบให้แน่ใจว่าได้ตรวจสอบสถานะด้วยsudo systemctl status rc-local
pre-up
สั่งทำงานให้ฉันบน Linux Mint 17.3 สำหรับการตั้งธง TSO ขอบคุณ :)
ฉันพบว่าการตั้งค่าการกำหนดค่าประเภทนี้/etc/network/interfaces
ใช้งานได้จริงกับ Ubuntu (อนุญาตให้ฉันใช้เพื่อปิดlarge-receive-offload
เครื่อง แต่ไม่ควรทำเรื่องสำคัญ):
auto eth1 iface eth1 inet คงที่ ที่อยู่ xxx.xxx.xxx.xxx netmask xx pre-up / sbin / ethtool -K $ IFACE lro ปิด
สำหรับ Ubuntu คุณสามารถทำได้โดยเพิ่มบรรทัดต่อไปนี้ใน/etc/network/interfaces
:
auto eth0
iface eth0 inet static
[...]
post-up /sbin/ethtool -K eth0 tso off gso off gro off
การโพสต์ขึ้นที่นี่จะดำเนินการตามที่กำหนดหลังจากแสดงอินเตอร์เฟสเฉพาะ
ใช่มันไม่สามารถทำได้โดยใช้ไฟล์การกำหนดค่าในขณะนี้ คุณสามารถวางคำสั่งใน/etc/init.d/rc.local
และมันควรจะทำ
ไฟล์นั้นจะถูกดำเนินการในลำดับสุดท้ายของการบูทและดังนั้น tso จะถูกปิดสำหรับอินเตอร์เฟส