ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

KeyarchOS服务器带宽限速:wondershaper安装配置与实战调优

KeyarchOS服务器带宽限速:wondershaper安装配置与实战调优 一台浪潮信息KeyarchOS服务器业务高峰期带宽管理一直是个头疼问题某个后台服务一跑大流量任务前端延迟马上飙到几百毫秒。我当时的处理思路很简单——做限速但没打算直接手搓tc规则那玩意儿不是不能用而是改起来太费劲还容易把正在跑的业务给“搓”断。最后选定了wondershaper 1.2.1-2一个老牌带宽限速工具部署简单、规则直观在KeyarchOS下配合内核的HTB队列和ifb重定向能把单机带宽管得明明白白。这篇文章不聊虚的就把我在KeyarchOS上从装包、配置到稳定运行的过程完整拆一遍踩过的坑也一并列出。适合正在用KeyarchOS做服务器运维、又不想被复杂流量控制脚本折磨的朋友。你需要的是一台能操作的KOS环境以及一点耐心。1. 先搞清楚为什么在KeyarchOS上用wondershaper1.1 KeyarchOS的定位和这次的实际背景KeyarchOS是浪潮信息面向企业关键业务推出的服务器操作系统定位于数据中心、云计算、边缘计算这类基础设施场景。它兼容主流Linux生态软件包体系对RHEL/CentOS系比较友好所以在KeyarchOS上跑常规运维工具基本不会有“水土不服”的问题。也正因为这种企业级定位它面对的流量压力通常比普通桌面环境大得多——多业务并发、备份任务、开发测试集群共享网络出口带宽成了稀缺资源。我这次要处理的机器就是典型的单机多业务场景。白天有业务API对外提供服务夜间有定时备份任务拉数据。问题是备份任务一旦跑起来会直接把出口带宽吃满白天遇到更新包下载或日志同步这种突发流量前端接口延迟立刻飙升监控图上都能看到明显的“锯齿”。最粗暴的办法是给带宽“一刀切”但完全不限又不行。这时候就需要一个能在指定网卡上快速做流量整形、又能长期稳定运行的工具。1.2 wondershaper到底解决什么问题wondershaper本质上是对Linux内核tctraffic control能力的封装。它的核心原理是在上行方向通过HTBHierarchical Token Bucket层次令牌桶队列规则限制出口带宽在下行方向借助ifbIntermediate Functional Block虚拟接口把入口流量重定向后再做同样的限速处理。说得直白点HTB就像在网卡出口装了一个闸门闸门的开合频率决定了每秒能放行多少数据ifb则像一条“检查通道”入口流量先拐进这条通道被计量再放行给本机应用。那为什么不直接写tc命令因为tc的语法对大多数人来说并不友好而且一条规则写错就可能把整个网络队列搞乱。wondershaper的价值在于把“设置带宽上限、清掉规则、查看状态”这些高频操作收敛成了一条命令比如wondershaper eth0 20000 5000这里eth0是网卡名20000是下行带宽上限kbps5000是上行带宽上限kbps。一行命令做完HTB队列创建、ifb重定向、过滤器挂载这些事后台自动处理好绝大部分细节。这也是我最终选它而不是自己写脚本的原因——稳定、简单、出错了也容易回滚。2. KeyarchOS安装wondershaper的前置检查与依赖准备2.1 确认系统版本和网卡命名安装任何软件之前先确认系统版本和架构这能避免装错包。在KeyarchOS上执行cat /etc/os-release uname -m我这边输出的是KeyarchOS 3.0版本x86_64架构。如果你是aarch64ARM机器后面下载rpm包时要注意选对架构。另外用ip link show确认要限速的网卡名。KOS服务器上常见的命名有ens3f0、enp3s0这类一致网卡名少部分老配置才是eth0。这里很容易踩坑很多人拿着配置文档里的eth0直接抄结果在KOS上根本没有这个接口命令执行不报错但限速也完全不生效。还有一个小细节如果服务器上有多个网卡建议先把网卡的MAC地址记录下来。后面配置自启服务时如果担心重启后接口名变化可以在systemd层面或者udev规则里做固化这里先不急后面会细说。2.2 准备rpm安装包和依赖环境wondershaper 1.2.1-2这个版本以rpm包形式分发安装包可能放在你的软件源里也可能需要手动下载。如果软件源里直接有最简单的安装方式是yum install -y wondershaper如果源里没有就准备好对应的rpm文件放到服务器本地再离线安装。比如拿到wondershaper-1.2.1-2.el8.noarch.rpm之后用rpm -ivh wondershaper-1.2.1-2.el8.noarch.rpm为了稳妥我建议用yum localinstall或者dnf localinstall来装yum localinstall -y wondershaper-1.2.1-2.el8.noarch.rpm这样做的原因是它能自动解析依赖。wondershaper本身是bash脚本封装但它依赖系统里的tc命令和ip命令这些由iproute和iproute2包提供。万一你的最小化安装环境里没装这些组件yum localinstall会一并把它们拉进来rpm -ivh则只会生硬地报依赖缺失然后退出。安装前还可以顺手检查一下内核模块支持modinfo ifb看到参数说明信息就说明当前内核支持ifb模块。wondershaper 1.2.1在下行限速时要通过ifb做流量重定向如果内核里连这个模块都没有后面执行限速命令时报错的概率极高。这个检查30秒就能完成别跳过。3. 安装wondershaper-1.2.1-2并配置限速参数3.1 安装后的文件布局和校验装完rpm包后关注几个关键文件路径。主脚本一般位于/usr/sbin/wondershaper配置文件是/etc/wondershaper/wondershaper.conf。有的发行版打包会把脚本放在/sbin/wondershaper区别不大执行前用which wondershaper看一眼就行。安装完成后先跑一次命令确认脚本能正常识别参数wondershaper --help如果输出一堆英文选项说明没有问题。要是提示command not found多半是PATH环境变量没包含/usr/sbin直接用绝对路径执行即可。3.2 配置文件里的单位换算技巧wondershaper支持两种用法命令行直接传参数或者把参数写进配置文件。生产环境我建议走配置文件因为参数固化后便于维护、也方便开机自启脚本去读取。打开/etc/wondershaper/wondershaper.conf核心就是三行IFACEens3f0 DOWNLINK160000 UPLINK40000这里最大的坑是单位。配置文件里的数值单位是kbps也就是千比特每秒不是很多人习惯的KB/s更不是MB/s。1MB/s 8Mbps 8000kbps。如果说你想把下行限速控制在20MB/s那应该填160000而不是20。填错单位的效果就是你以为限到了20MB/s实际可能只给了20kbps直接把网卡限到几乎不可用。还有一个配置经验不要按物理带宽的100%去限要留出15%~20%的余量。假设你的服务器接入带宽是200Mbps那DOWNLINK建议控制在160000kbps上下。原因是TCP本身有拥塞控制机制如果把队列速率顶到物理链路极限一旦出现瞬时突发流量包就会在队列里排队反而造成更大的延迟抖动。留出余量让队列能喘口气实际体验会平滑很多。3.3 启动、停止和状态检查命令配置写好后手动启动限速wondershaper ens3f0如果没走配置文件直接命令行传参也行wondershaper ens3f0 160000 40000查看当前生效的限速规则wondershaper ens3f0 status清掉限速规则恢复网卡原有状态wondershaper ens3f0 clear这里提个醒清规则这个动作在紧急排障时特别有用。假如你限速后把某条业务链路给限挂了只要还能ssh登录clear一下就能立刻恢复不用重启网卡或服务器。我第一次用的时候不知道这个命令限完发现自己把管理网段也限了当时差点重启网卡后来才发现clear才是正规退路。验证限速是否生效建议用tc直接看队列统计tc -s qdisc show dev ens3f0 tc -s class show dev ens3f0输出里能看到当前队列的类型、速率参数、以及实际经过的包和字节数。如果限速生效class统计里的bytes会持续增长且速率约等于你设定的带宽值。这个验证方式比单独跑一个测速脚本更直观因为它看到的是内核层的真实计数器不会受测速工具自身精度影响。4. 提升稳定性的开机自启与调优经验4.1 给老版wondershaper补一个systemd自启单元wondershaper 1.2.1-2这个打包版本默认没有自带systemd自启服务单元。这意味着安装完、手动配置好之后一旦重启服务器之前设置的限速规则全部失效。对于一台跑业务的服务器来说重启后忘记恢复限速就可能再次出现带宽被占满的故障。所以“让限速规则在开机能自动应用”是稳定运行的关键一步这也是标题里“提升稳定性”的实际落点。手动创建一个systemd服务文件vim /etc/systemd/system/wondershaper.service内容如下[Unit] DescriptionWondershaper bandwidth shaping Afternetwork-online.target Wantsnetwork-online.target [Service] Typeoneshot RemainAfterExityes ExecStart/usr/sbin/wondershaper ens3f0 ExecStop/usr/sbin/wondershaper ens3f0 clear [Install] WantedBymulti-user.target然后重新加载并启用systemctl daemon-reload systemctl enable --now wondershaper这里有几个细节值得解释。Typeoneshot表示这个服务执行完启动命令就算完成不会一直驻留进程配合RemainAfterExityes让systemd认为服务仍然处于激活状态这样后面执行systemctl status能看到服务状态是active排障时更直观。Afternetwork-online.target保证了服务在网络就绪之后才执行避免开机瞬间网卡还没起来就强行挂队列导致失败。如果你觉得开机时网卡就绪时机依然不够稳可以在ExecStart前加一行延迟ExecStartPre/bin/sleep 5这个看实际情况我在部分KOS版本上遇到过NetworkManager在开机阶段重置网卡导致队列被清掉的情况加个sleep能显著降低这种偶发失败的概率。4.2 生产环境调优的几条实操心得服务能自启只是第一步真正稳还要注意下面的细节。第一限速前先确认网卡没有被别的队列规则占用。如果你之前手动配置过tc规则或者别的限速工具也在同一张网卡上挂过HTB再启动wondershaper可能直接报File exists。遇到这种情况先执行tc qdisc del dev ens3f0 root wondershaper ens3f0 clear把历史规则清干净再重新限速。这个操作我在切换工具的时候踩过不清旧规则就启动新规则根本挂不上去。第二不要在bond的从属接口上叠加限速。如果你的服务器网卡做了bond比如bond0由ens3f0和ens3f1组成那限速应该加在bond0上而不是分别加在两个从属接口上。叠加在从属接口上的队列规则一旦配合bond的负载均衡模式会出现流量被不规则的拆分限速效果跟预期差距很大甚至造成丢包。第三要注意管理通道。如果你是通过ssh远程操作这台机器限速时务必确认你的管理网段不会撞上被限速的网卡或者至少别把速率限到0。配置文件里的DOWNLINK如果被错误设置成0意味着下行流量被完全阻断你的ssh连接会立刻卡死只能去机房或者通过带外管理口恢复非常狼狈。第四wondershaper适合做“网卡级”的粗粒度限速不适合做精细的按IP限速或应用优先级调度。它能把一张网卡的总带宽控制住但不会区分“数据库流量优先于备份流量”。如果你未来要做的是一套复杂的QoS策略比如给不同内网IP分配不同带宽配额、给特定端口做高优先级队列wondershaper就有点不够用了得回到tc直接写HTB子类策略或者用其他流量控制方案。理解这个边界你就知道什么时候该用它、什么时候不该硬撑。4.3 监控限速后的实际效果限速规则上线后我习惯用iftop观察实时流量用tc -s class show dev ens3f0看队列计数再配合ping测一下延迟。有一个比较典型的对比数据可以分享未限速时下载任务占满带宽本机到网关的ping平均延迟能从正常的8ms飙到180ms以上限速到160000kbps之后延迟回落到12ms左右而下载任务依然能稳定跑在你设定的带宽上限附近。这就是“稳定性”最直观的体现——业务延迟不再跟着突发流量剧烈抖动。5. 常见问题排查与实测案例5.1 初装阶段高频问题速查表下面这个表格基本覆盖了我在KeyarchOS上使用wondershaper 1.2.1-2遇到的高频问题你可以直接对照排查。现象可能原因处理方法执行时报command not found脚本路径不在PATH中或未安装成功使用/usr/sbin/wondershaper执行重新安装rpm报tc: qdisc add failed: No such deviceifb内核模块未加载执行modprobe ifb再用lsmod上行限速生效下行没反应ifb重定向链路异常检查modprobe ifb后的dmesg日志确认网卡名正确重启后规则消失未配置自启服务按第4节创建systemd单元并enable限速后延迟反而升高配置速率超过物理链路带宽调低DOWNLINK/UPLINK留出余量规则挂载报File exists网卡已有旧队列规则用tc qdisc del dev 网卡 root清掉旧规则限速没有作用但命令无报错网卡名配置错误ip link show核对接口名改配置文件配置文件DOWNLINK设为0后断网0表示完全阻断下行立即wondershaper clear恢复再改配置5.2 现场排查案例备份流量拖垮业务出口最后分享一个我实际处理过的案例。某天的监控告警业务API接口响应时间明显爬升查看带宽监控发现出口流量接近物理上限但业务流量本身并不大。追查后发现是一台内网开发机在深夜通过rsync拉了大量测试数据白天下班时任务没结束把出口带宽全占满了。处理过程是这样的。先登录服务器确认业务网卡名然后执行wondershaper ens3f0 clear wondershaper ens3f0 100000 20000把总带宽限制在下行100Mbps、上行20Mbps。观察几分钟iftop显示流量峰值稳定在限制值附近没有再冲破物理上限API的响应时间也随之恢复。确认没问题后把配置写进/etc/wondershaper/wondershaper.conf创建了systemd自启服务最后systemctl enable --now wondershaper固化。这个案例里还有个教训rsync任务本身是可以限速的--bwlimit参数就能控制传输速率。但问题是你不可能控制每台开发机上跑什么命令、用什么参数。在出口网卡这一层做总闸才是对所有业务通用的兜底方案。这也是wondershaper这类工具的核心价值——不依赖业务侧配合在基础设施层就把问题兜住。另外提一句加了限速规则后最好在夜间备份任务执行时间窗口再瞄一眼监控确认限速后的备份速度还能满足业务要求。如果发现备份时长超出预期可以适当调高限速值找到一个“既不影响业务、又能让备份任务跑完”的平衡点。限速并不是越狠越好而是在可用性和带宽公平性之间找平衡。这套组合我用了不短时间最大的感受是“够用但别贪心”。wondershaper适合把带宽资源用粗粒度管起来比如谁占路就让它限速让路而不是指望它做出精细的流量调度。真要做UDP优先、按业务分流调优那些细活还是得回到tc或者上更专业的QoS方案。另外如果你后续要升级版本建议先把/etc/wondershaper/wondershaper.conf备份一份新老版本的参数格式有差别重新配置时能省不少事。装之前看模块配之前算单位上线之前写自启——这三点做到了带宽管理基本就能稳下来。
返回列表