调参喽~
一台机器三种活
这台台式机常年同时干三件事
MC/TShock 群服挂着,给朋友玩,走的是共享校园网出口,高峰期排队丢包是常态 llama-server 给 QQ bot 跑视觉模型,一个 Qwen 9B 的权重文件就好几个 G,常驻内存,一崩就是几个 G 的快照 桌面是我自己天天用的,打游戏写作业,最怕的就是在交互的瞬间被内核某些后台动作卡一下
三种负载对系统参数的需求不一样,有的要吞吐,有的要延迟稳,有的怕垃圾堆积 这次把网络栈、内存策略、日志管控按场景过了一遍,记一下
服务器类:网络栈给长连接让路
群服的问题很典型:长连接多、上传持续、出口是共享链路 默认的 cubic 是丢包驱动的算法,缓冲区一满就开始排队,延迟涨上去还降不下来,就是常说的 bufferbloat BBR 走的是另一条路,不靠丢包猜,直接建模链路的带宽和延迟,IETF 的草案里写得很清楚,对浅缓冲、随机丢包的瓶颈吞吐高不少,对深缓冲也不会把队列塞满
内核 7.x 已经带了 tcp_bbr3 模块,不用自己编译,Google 的 v3 release 说明就是给主线内核用的
sudo modprobe tcp_bbr3sudo sysctl -w net.ipv4.tcp_congestion_control=bbr3为什么选 v3 不是 v1
v1 太激进,持续探测带宽,无视丢包信号,跟 cubic 混在一条链路上的时候不太讲公平 v3 改了,会响应丢包和 ECN,探测节奏也拉长,共存友好很多 宿舍这种跟一堆人共享的出口,选温和的那个
BBR 要配 fq 队列
BBR 是按 pacing 发包的算法,精确限速要靠队列把包匀速放出去 光换算法不换队列,pacing 会退回软件定时器,精度差一截
sudo sysctl -w net.core.default_qdisc=fqfq 还有附带好处,按流排队,一条下载流不会堵住后面所有流
顺手的事
sudo sysctl -w net.ipv4.tcp_slow_start_after_idle=0sudo sysctl -w net.ipv4.tcp_fastopen=3tcp_slow_start_after_idle=0 是给群服这种有空闲期的连接准备的,默认空闲一阵子再发数据会重置慢启动,又得从低速率慢慢爬,关了之后恢复发送直接接着上次的速率走
tcp_fastopen=3 开 TCP 快开,客户端和服务器都启用,重复访问握手省一趟 RTT
坑>无线网卡换不了 fq
执行的时候 tc qdisc replace dev wlp6s0 root fq 报 Operation not supported (-95)
查了才知道无线接口的 root qdisc 归 mac80211 驱动管,显示 noqueue 是正常态,用户态换不了
正确姿势是只设全局 net.core.default_qdisc=fq,接口重建的时候自动挂上,实测之后 wlp6s0 自己就显示 fq 了
同理热点那张 MT7921U 在 AP 模式下连关省电都报 -95,AP 固件要持续发 beacon 本来也睡不了,显示 on 是摆设,不管
持久化
重启不丢要写三个文件,模块加载一个、sysctl 参数一个、网卡省电一个
tcp_bbr3net.ipv4.tcp_congestion_control=bbr3net.core.default_qdisc=fqnet.ipv4.tcp_slow_start_after_idle=0net.ipv4.tcp_fastopen=3[connection]wifi.powersave=2写完 systemctl restart systemd-sysctl 模拟一遍开机应用,status 0,四参数原样,链路是通的
桌面
翻内核参数的时候发现透明大页一直开在 always
[always] madvise neveralways 的意思是内核每次要新内存页都尝试直接分配 2MB 大页 听着是好事,大页能省 TLB 开销,但代价是分配大页经常要先压缩整理物理内存,这个动作是同步的 桌面程序访问大多碎片化,大页根本用不上,白挨整理开销
kernel 文档自己都写,能从大页获益的应用应该对关键 mmap 区域主动 madvise(MADV_HUGEPAGE)
madvise 模式就是这个意思,只有程序自己喊要才给
echo madvise | sudo tee /sys/kernel/mm/transparent_hugepage/enabledecho madvise | sudo tee /sys/kernel/mm/transparent_hugepage/defrag重启会丢,走内核参数持久化,改 grub:
sudo cp /etc/default/grub /etc/default/grub.bak动 grub 之前先 cp 了一份备份(其实是挂了还能回来,虽然挂了不备份也可以救回来就是了)
打开 vim 自己在 GRUB_CMDLINE_LINUX_DEFAULT 末尾敲上去(transparent_hugepage=madvise 和 transparent_hugepage_defrag=madvise)
sudo vim /etc/default/grubsudo grub-mkconfig -o /boot/grub/grub.cfg坑:defrag 那个参数内核根本不认
重启翻 dmesg 才发现的
Unknown kernel command line parameters "transparent_hugepage_defrag=madvise", will be passed to user spacekernel 文档里列的启动参数只有 transparent_hugepage=(还有个按尺寸写的 thp_anon=),defrag 只给 sysfs 接口,没有对应的启动参数
于是 enabled 持久化成功了,defrag 每次开机都回到默认
always defer [defer+madvise] madvise never真想让 defrag 也持久,得开机后往 sysfs 里写(systemd 的 oneshot,或者 tmpfiles 规则),参数这条路走不通
差别也没想象中大,两个档都只作用于声明了 MADV_HUGEPAGE 的区域,区别是 defer+madvise 连同步压缩也一起做,madvise 只做直接回收
桌面另一个漏网点是 WiFi 省电,插着电的台式机根本不需要网卡周期性打盹,省电模式会在交互流量上偶尔加延迟
sudo iw dev wlp6s0 set power_save offAI 服务类
llama-server 这种推理服务有两个属性很烦人
一是权重文件好几个 G,常驻内存,THP 改 madvise 对它是好事,想要大页自己 madvise,不想要也没人天天惦记着合并它的内存
二是它一崩,内存快照大得吓人 某天翻 /var/lib/systemd/coredump 看到个 1.1G 的块头,就是 llama-server 前一天晚上崩的 进程多大 core 就多大,系统默认还不限大小,等于每次大程序崩溃都是 SSD 抗的
给 coredump 上个尺寸锁,coredump.conf(5) 里的 ExternalSizeMax:
[Coredump]ExternalSizeMax=256M超过 256M 的 core 不落盘,只把崩溃摘要记进 journal,程序名、信号、调用栈都在,真想深挖再临时放开重崩一次
journald 同样没上限,默认按磁盘 10% 封顶,我这盘能涨到 95G,现在 3.3G 是自然轮转的结果 journald.conf(5) 里设个硬顶:
[Journal]SystemMaxUse=2G量不小,七天 95 万行,按来源排一下
journalctl --since "7 days ago" --no-pager -o short | grep -oP 'archlinux \K[^\[:]+' | sort | uniq -c | sort -rn | head677733 sudo169098 org_kde_powerdevil 36072 plasmashell 14382 dotnetsudo 占七成,是后来才加的那个热点监控脚本,两秒一次轮询,一天十来万行都出在它身上
感觉有点石就是了,虽然后来优化了
其余是桌面常驻组件和后台服务自己在写
重启 journald 自动收缩,3.3G 掉到 1.9G,以后超了自动丢最老的
最终改动
net.ipv4.tcp_congestion_control = bbr3net.core.default_qdisc = fqnet.ipv4.tcp_slow_start_after_idle = 0net.ipv4.tcp_fastopen = 3iw dev wlp6s0 get power_save = offtransparent_hugepage = [madvise]coredump 目录 = 0 文件journal 占用 = 1.9G调度器、swap、挂载参数那些也查过,都是对的,不用动,能动的就上面这些 服务器要吞吐,桌面要稳,AI,各取所需
如果这篇文章对你有帮助,欢迎分享给更多人!
部分信息可能已经过时