2 giờ sáng, mình nhận alert: throughput từ server database xuống còn 40% so với bình thường, latency tăng vọt. SSH vào xem log — không thấy gì bất thường. top, iostat, vmstat đều bình thường. Cuối cùng mình chạy một lệnh và thấy ngay vấn đề: card mạng đang chạy ở 100Mbps half-duplex thay vì 1Gbps full-duplex vì switch port bị reset sau đợt maintenance. Lệnh đó là ethtool.
Đây là tool mình dùng hàng tuần khi quản lý network cho office 50 người và datacenter nhỏ. Không cần cài gì phức tạp, ethtool có sẵn trên hầu hết distro Linux và cho bạn nhìn thấy mọi thứ về NIC mà ip link hay ifconfig không hiển thị được.
Quick Start: Chạy ngay trong 5 phút
Cài ethtool nếu chưa có:
# Debian/Ubuntu
sudo apt install ethtool
# RHEL/CentOS/Rocky Linux
sudo dnf install ethtool
Kiểm tra ngay trạng thái card mạng:
# Xem tên interface trước
ip link show
# Kiểm tra NIC (thay eth0 bằng tên thực: ens3, enp2s0, ...)
sudo ethtool eth0
Output điển hình:
Settings for eth0:
Supported link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Full
Supports auto-negotiation: Yes
Speed: 1000Mb/s
Duplex: Full
Auto-negotiation: on
Link detected: yes
Ba dòng quan trọng nhất: Speed, Duplex, và Link detected. Thấy Speed là 100Mb/s hoặc Duplex là Half trên server production — đó là vấn đề cần xử lý ngay, không chờ.
Đọc hiểu Output của ethtool
Speed và Duplex — cặp đôi hay gây rắc rối
Speed dễ nhận ra, nhưng Duplex mới là thứ hay gây ra vấn đề mà nhiều người bỏ qua:
- Full-duplex: Gửi và nhận dữ liệu cùng lúc — chế độ bình thường cho server hiện đại.
- Half-duplex: Chỉ làm một chiều tại một thời điểm, như walkie-talkie. Throughput thực tế giảm còn 30–50%, collision tăng vọt.
Tình huống điển hình: server database đột ngột chậm sau khi team infra thay switch, không ai báo gì. ethtool chỉ ra ngay port switch mới mặc định half-duplex. Force cả hai đầu về 1Gbps full-duplex — xong trong 2 phút.
Auto-negotiation
Auto-negotiation tự động thỏa thuận speed/duplex giữa NIC và switch. Hầu hết trường hợp cứ để bật — nó tự lo. Nhưng switch cũ hoặc thiết bị managed giá rẻ đôi khi đàm phán sai, output ra Speed: 100Mb/s dù cáp và port đều chuẩn 1Gbps. Trường hợp đó, force thủ công mới giải quyết được.
Link detected: no
Nếu thấy dòng này — cáp đứt, unplugged, hoặc switch port down. Đừng mất thời gian debug phần mềm khi vấn đề là vật lý.
Các Lệnh ethtool Thực Dụng
Kiểm tra driver và firmware
sudo ethtool -i eth0
driver: e1000e
version: 3.2.6-k
firmware-version: 3.4.4
bus-info: 0000:00:19.0
supports-statistics: yes
Khi gặp lỗi kỳ lạ với NIC, mình luôn check driver version trước. Đôi khi update kernel driver là đủ để fix, khỏi cần đào sâu hơn.
Xem thống kê lỗi mạng
sudo ethtool -S eth0 | grep -E "error|drop|miss|fail"
Tìm các counter như rx_errors, tx_dropped, rx_missed_errors. Nếu những giá trị này tăng liên tục — có vấn đề ở tầng hardware hoặc driver, không phải application.
Cấu Hình Speed và Duplex
Force speed và duplex thủ công
Khi auto-negotiation không hoạt động đúng:
# Force 1Gbps full-duplex, tắt auto-negotiation
sudo ethtool -s eth0 speed 1000 duplex full autoneg off
# Force 100Mbps full-duplex
sudo ethtool -s eth0 speed 100 duplex full autoneg off
# Bật lại auto-negotiation
sudo ethtool -s eth0 autoneg on
Quan trọng: Thay đổi này mất sau reboot. Xem phần Tips bên dưới để làm persistent.
Bật/tắt Wake on LAN
# Bật WoL (magic packet)
sudo ethtool -s eth0 wol g
# Tắt WoL (tiết kiệm điện cho server không cần)
sudo ethtool -s eth0 wol d
Tối Ưu Hiệu Suất NIC (Nâng Cao)
Ring Buffer — bộ đệm quyết định packet sống hay bị drop lúc traffic burst
Ring buffer là vùng nhớ trên NIC dùng để xếp hàng packet trước khi kernel kịp xử lý. Mặc định nhiều NIC chỉ để 256 slot — với server traffic cao, con số đó hết trong vài millisecond lúc burst, và packet bắt đầu bị drop thẳng.
# Xem ring buffer hiện tại
sudo ethtool -g eth0
Ring parameters for eth0:
Pre-set maximums:
RX: 4096
TX: 4096
Current hardware settings:
RX: 256
TX: 256
# Tăng ring buffer lên max
sudo ethtool -G eth0 rx 4096 tx 4096
Mình áp dụng setting này trên tất cả server trong datacenter sau một incident: server xử lý log aggregate đột ngột drop packets lúc peak traffic. Tăng RX buffer từ 256 lên 4096 — vấn đề biến mất hoàn toàn mà không cần thêm phần cứng.
Offloading Features
Card mạng thế hệ mới không đơn thuần chỉ truyền bit — chúng còn xử lý thay CPU nhiều tác vụ tính toán nặng. Tập hợp tính năng đó gọi là offloading. Kiểm tra những gì đang bật:
sudo ethtool -k eth0
Features for eth0:
rx-checksumming: on
tx-checksumming: on
scatter-gather: on
tcp-segmentation-offload: on
generic-segmentation-offload: on
generic-receive-offload: on
large-receive-offload: off [fixed]
Các feature quan trọng:
- rx/tx-checksumming: NIC tự tính checksum thay CPU — nên bật.
- tso (TCP Segmentation Offload): NIC tự chia TCP segment lớn — tăng throughput đáng kể.
- gro (Generic Receive Offload): Gộp nhiều packet nhỏ trước khi đưa lên kernel — giảm interrupt.
# Bật GRO nếu đang tắt
sudo ethtool -K eth0 gro on
# Tắt TSO (đôi khi cần với virtual NIC trong VM)
sudo ethtool -K eth0 tso off
Lưu ý với VM: Trong môi trường ảo hóa (KVM, VMware), một số offload feature có thể gây throughput bất thường. Mình thường tắt LRO và đôi khi cả TSO trên VM nếu thấy hiệu suất lạ mà không giải thích được.
Coalesce Settings — Giảm interrupt CPU
Mỗi packet đến NIC đều trigger một interrupt lên CPU. Server nhận hàng chục nghìn packet mỗi giây thì overhead này đáng kể. Coalescing gom nhiều packet vào một interrupt — giảm số lần CPU bị gián đoạn, throughput cải thiện rõ:
# Xem coalesce settings hiện tại
sudo ethtool -c eth0
# Tăng interrupt coalescing (giảm CPU interrupt, tăng latency một chút)
sudo ethtool -C eth0 rx-usecs 50 tx-usecs 50
Trade-off cần biết: coalescing cao → CPU ít bị gián đoạn hơn, throughput tốt hơn, nhưng latency tăng nhẹ. Phù hợp với workload throughput-heavy như backup và file transfer. Với workload latency-sensitive như real-time processing, giữ giá trị thấp hoặc để mặc định.
Tips Thực Tế Từ Môi Trường Production
Làm persistent sau reboot
Tất cả thay đổi bằng ethtool mất sau reboot. Cách làm persistent trên Ubuntu/Debian dùng networkd-dispatcher:
sudo nano /etc/networkd-dispatcher/routable.d/ethtool-tuning.sh
#!/bin/bash
IFACE="eth0"
ethtool -G $IFACE rx 4096 tx 4096
ethtool -K $IFACE gro on tso on
ethtool -C $IFACE rx-usecs 50
sudo chmod +x /etc/networkd-dispatcher/routable.d/ethtool-tuning.sh
Trên RHEL/CentOS với NetworkManager:
# Thêm vào /etc/sysconfig/network-scripts/ifcfg-eth0
ETHTOOL_OPTS="speed 1000 duplex full autoneg off"
Script kiểm tra nhanh toàn bộ NIC
Mình viết script này để chạy ngay khi tiếp nhận server mới hoặc sau bất kỳ đợt maintenance nào:
#!/bin/bash
# check-nic-health.sh
for iface in $(ls /sys/class/net | grep -v lo); do
echo "=== $iface ==="
speed=$(ethtool $iface 2>/dev/null | grep Speed | awk '{print $2}')
duplex=$(ethtool $iface 2>/dev/null | grep Duplex | awk '{print $2}')
link=$(ethtool $iface 2>/dev/null | grep "Link detected" | awk '{print $3}')
echo " Speed: $speed | Duplex: $duplex | Link: $link"
rx_err=$(ethtool -S $iface 2>/dev/null | grep rx_errors | awk '{print $2}')
tx_drop=$(ethtool -S $iface 2>/dev/null | grep tx_dropped | awk '{print $2}')
[ -n "$rx_err" ] && echo " RX Errors: $rx_err | TX Dropped: $tx_drop"
echo ""
done
sudo bash check-nic-health.sh
Khi nào cần dùng ethtool?
- Throughput thấp bất thường mà CPU/disk/application đều bình thường → check speed/duplex ngay.
- Packet loss không giải thích được →
ethtool -Sđể xem error counters. - Server mới tiếp nhận hoặc sau thay switch/cáp → verify link speed và duplex.
- Tối ưu server xử lý traffic cao (database, proxy, log aggregator) → tune ring buffer và offloading.
- VM bị throughput kỳ lạ → check và điều chỉnh offload features.
ethtool không phải tool dùng hàng ngày, nhưng khi cần — nó cho bạn nhìn thấy đúng chỗ vấn đề mà ping, ss, hay iperf3 không thể chỉ ra. Lần tới lúc 2 giờ sáng khi network bất thường mà không rõ nguyên nhân, sudo ethtool eth0 là lệnh đầu tiên mình chạy sau khi SSH vào server.

