Linux环境搭建太慢?3步避坑提速
|
告警响的那一刻,我正把泡面叉子插进酱包里——滋啦一声,红油糊了半截筷子。手机在桌上震,屏幕还开着三台机器的 tmux 会话,最右边那个窗口连着没退出的 ansible-playbook --limit 进程,光标卡在 “TASK [install packages]” 后头一动不动。开发老张的语音弹出来:“环境今天能跑通不?” 我叼着叉子回:“快了快了”,结果一抬头,窗外天快亮了。 我原以为是仓库源慢。改了清华源、阿里源、中科大源,还手搓了个内网镜像,rsync 同步了三天,磁盘占了八成,结果部署脚本还在 fetch curl 包时卡住——不是超时,是卡在“Resolving”那步,像被谁掐了脖子。查 DNS?dig 响得比心跳还快。查 hosts?全配好了。最后发现某台机器 /etc/resolv.conf 居然被 Ansible 模板里一个 condition 漏掉了覆盖,硬生生留着上任同事写的 192.168.1.1——那地址早拆了,机房的人说他们上周清理机柜时顺手拔了网线。我盯着那行 dead IP 看了四十秒,叉子上的面坨成了灰白色。 第二坑更绝:证书链。不是证书过期,是中间证书压根没装进去。我们用的是 Let’s Encrypt,acme.sh 脚本自动生成的 fullchain.pem 默认含中间证,但团队里有个新人把 nginx 的 ssl_certificate 配成了 cert.pem,漏掉 chain;而 QA 环境又开了 OCSP stapling,OCSP 响应器连不上上游 CA 就挂起连接,TLS 握手拖到 5 秒开外。你猜怎么发现的?是运维老李半夜两点打进来问:“你家 Nginx 日志里为啥每条 $upstream_response_time 都是 4997?”。我抓包一看,Client Hello 发出去,Server Hello 死活不回,tcpdump -n port 443 抓了两分钟,全是重传。火大归火大,但真没法骂他——我自己上个月也干过同款事,把 openssl verify -untrusted 改成了 -CAfile,验了一周假证书都没跳出错。 第三坑,纯属“优胜劣汰”的物理打击。三台机器,硬盘都是 NVMe,IO wait 却高得离谱。iostat -x 看 %util 是 99,%await 上百,但 iotop 显示没几个进程在刷盘。后来发现是 Ansible 执行前默认启用 fact caching,缓存文件写进 /tmp/ansible_facts/,而我们所有机器 /tmp 全挂了 tmpfs,内存撑死 4G——可 playbook 里一万个 role 每个都要 gather_facts,缓存文件瞬间涨到 2G+,内存爆了就 swap 到 SSD,SSD 又被 tmpfs 当 swap 用,等于把高速盘当低速盘使。同事阿哲敲完 df -h 发来截图:“/tmp 已用 99%,但 free -h 显示空闲 300M”。我懵了三秒才反应过来——tmpfs 是内存映射,df 和 free 统计口径根本不打架,它就是在疯狂换页。我删掉 /tmp/ansible_facts 后重跑,单节点部署从四十七分钟缩到六分半。这哪是优化,是让系统活下来。 其实那晚还有别的事岔开。比如值班表排错了,我以为自己轮休,结果凌晨三点收到告警还得爬起来。再比如家里冰箱坏了,早上回家打开门一股酸味,酸奶全凝成块儿浮在盒顶,像某种失败的 CI 构建产物。晚饭?早忘了。泡面酱包吃完后,我啃了半根蔫黄瓜,嘎吱声在安静机房里特别响。谁也没说啥,隔壁工位小陈戴着耳机打呼噜,键盘旁边摊着一张写满密钥格式的草稿纸,字迹潦草得像在解微分方程。 再说个反常识的:现在我搭新环境,第一件事不是配源、不是启服务,是先把 Ansible 的 gather_facts 设成 False,然后手动加 facts ——只加需要的,比如 ansible_distribution 和 ansible_architecture。你别笑,我们上个月在测试集群试过,关闭自动 fact gathering,部署速度直接提升三倍多,因为跳过了整整十二个模块的远程执行链。但我跟开发吵了一架,老张拍桌子:“没 facts 你咋知道系统版本?万一 CentOS 和 Rocky 自动判错咋办?!” 我说:“那你给我写个 register 变量叫 distro_id,执行 lsb_release -si 再判断,五秒钟的事。别让 Ansible 自己去遍历 /etc/redhat-release /etc/os-release /usr/lib/os-release 这七份文件。” 他没回,转身点了支烟,烟灰掉进 coffee 杯里,沉底了都没搅。 我其实没查清到底为什么 resolv.conf 会被 condition 漏掉。模板里写的是 “when: ansible_distribution == 'CentOS'”,但有台机器是 Rocky Linux,Ansible 识别成 Rocky,所以 condition 失效,那行旧 DNS 就活了下来。这个 root cause 我直到写这篇才翻出来,但当时忙着改配置,根本没开 devtools 查 ansible_facts。认了。反正这事本来能避免——只要上线前跑一次 ad-hoc,ansible all -m ping,再补一句 ansible all -a "cat /etc/resolv.conf"。我没做。图快,结果更慢。
文章配图,仅供参考 机房很冷。不是空调调低了,是去年换的新风机组,送风温度设死在 18℃,穿毛衣进去待两小时,指尖发麻。我刚才摸了摸服务器机箱侧面,烫手。热得离谱。冷气吹不到硬件深处,热却捂在壳子里出不来。这事儿挺久没人管,也没人说。反正我现在部署完必跑一遍 ss -tuln | grep :443,看看是不是所有端口都 bind 成功;也必 curl -I https://localhost -k;再顺手 echo "test" > /tmp/healthcheck.tmp,就为了确认 /tmp 没被 tmpfs 逼疯。这些都不是标准流程。是我自己补的。 (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


外闻网站运营避坑指南:站长必知的7大政策雷区
Linux与Windows服务器选型的5大性能陷阱
Linux PHP开发环境零配置全指南
Linux无障碍环境构建:零配置到语音导航全指南
Linux深度学习环境搭建:13年老兵的排障实录
SQL Server入门避坑指南:12个实战关键点
Linux新手避坑指南:9年API开发师亲授安装配置

