linkwatch
是 Linux 内核网络子系统中的一个内核线程(kernel thread),主要用于监控网络链路状态变化(如网卡 UP/DOWN、物理连接断开/恢复等),并及时更新网络配置和路由表。以下是其详细作用和原理分析:
链路状态监控
检测网络接口(如 eth0、wlan0)的物理连接状态变化(例如网线插拔、Wi-Fi 断开等),触发内核事件通知。
事件队列处理
管理一个事件队列(lweventlist
),存放待处理的链路状态变化事件,避免频繁触发操作。
路由表更新
当链路状态变化时(如网卡 DOWN),通知路由子系统更新路由表,移除无效路由或添加新路由。
关联服务通知
通过 Netlink 或内核通知链(notifier chain)告知用户态进程(如 NetworkManager、systemd-networkd)链路变化,触发 DHCP 重连等操作。
事件触发
netif_carrier_on()
或 netif_carrier_off()
通知内核。lweventlist
队列,并唤醒 linkwatch
线程。事件处理
linkwatch
线程从队列中取出事件,调用 __linkwatch_run_queue()
处理:
c
// 内核源码示例(简化)
static void __linkwatch_run_queue(void) {
struct net_device *dev;
while (!list_empty(&lweventlist)) {
dev = list_first_entry(&lweventlist, struct net_device, link_watch_list);
list_del_init(&dev->link_watch_list);
if (dev->flags & IFF_UP) {
rtmsg_ifinfo(RTM_NEWLINK, dev, IFF_UP | IFF_RUNNING);
dev_activate(dev); // 重新激活设备
}
}
}
IFF_RUNNING
标志),触发路由表更新(通过 rtmsg_ifinfo
发送 Netlink 消息)。延迟处理机制
linkwatch
会延迟处理(默认 1 秒),通过定时器(linkwatch_nextevent
)合并事件。查看链路状态
ip link show eth0 # 查看接口状态(UP/DOWN、LOWER_UP)
ethtool eth0 # 检查物理连接(如 "Link detected: yes")
监控内核事件
dmesg -w # 查看内核日志中的链路事件
手动触发事件
ip link set eth0 down # 手动关闭接口,观察 linkwatch 反应
高 CPU 占用
若 linkwatch
频繁触发(如网线接触不良),可能导致 CPU 使用率升高。可通过 ethtool
检查网卡稳定性。
延迟敏感场景
默认 1 秒延迟可能不适合超低延迟需求,可通过调整内核参数(需谨慎):
sysctl -w net.ipv4.conf.eth0.link_watch_delay=100 # 单位:毫秒
虚拟化环境
虚拟机网卡状态可能依赖宿主机,需检查虚拟驱动(如 virtio_net)的链路状态传递。
linkwatch
是 Linux 网络栈中不可或缺的组件,负责链路状态事件的异步处理,确保网络配置的实时性和稳定性。理解其原理有助于诊断网络接口异常或路由问题。