加入收藏 | 设为首页 | 会员中心 | 我要投稿 站长网 (https://www.0577zz.cn/)- 应用程序、AI行业应用、CDN、低代码、区块链!
当前位置: 首页 > 服务器 > 搭建环境 > Unix > 正文

Linux运维老手也常踩的5个Unix环境搭建陷阱

发布时间:2026-10-23 14:12:19 所属栏目:Unix 来源:DaWei
导读:  跟产品吵。去年高考期间那波灰度,PM说“用户只看结果”,我盯着监控大屏上左下角那个绿色CPU曲线抖了一下——就一下,毫秒级的尖刺,跟主业务完全无关,但我知道那是NTP服务在重连。没理它。后来背锅背到凌晨三点,就因为/d

  跟产品吵。去年高考期间那波灰度,PM说“用户只看结果”,我盯着监控大屏上左下角那个绿色CPU曲线抖了一下——就一下,毫秒级的尖刺,跟主业务完全无关,但我知道那是NTP服务在重连。没理它。后来背锅背到凌晨三点,就因为/dev/shm里那个IPC socket权限是0755不是0700,前端顺手chmod -R 了整个tmpfs目录,连带着我们预加载的共享内存段全被扫成只读。我原以为只是重启一下redis-client连接池,结果strace一跑,发现glibc malloc直接fallback到mmap,整个服务线程卡在brk系统调用里等页表刷新。


  测试昨天提了个bug单,说“发版后登录态失效”,其实根本不是session过期,是/usr/local/bin/ssh-wrapper脚本里硬编码了/etc/pam.d/common-auth路径,但Debian 12.5把这文件移到了/etc/pam.d/common-auth-local——没人告诉运维要查这个。我敢打包票,上周五下班前上线的三个节点,两个节点用了老base镜像,一个用的是新build的,但新镜像的chroot环境里libnss-systemd.so压根没装。没人测这个。没人想着测。PM拿KPI说话的时候,连oncall手机震了一下,我没接,因为正弯腰去饮水机那儿倒水,咖啡杯上印的公司logo被水渍糊了半边,我看不清是“Block”还是“Chain”。


  第二个坑:sysctl.conf里net.ipv4.tcp_tw_reuse=1,写得没错。但漏写了net.ipv4.ip_local_port_range = 1024 65535。默认是32768 60999。你猜怎么着?当负载打到四百并发,ephemeral port用光之后,新TCP握手卡在SYN_SENT状态十八毫秒,刚好够gRPC timeout触发重试逻辑,但重试请求又撞上同一个端口池——于是两层重试套在一起,上游以为下游挂了,下游还在等ACK。这个我说不准是不是影响了去年六月那次高考志愿填报系统的延时毛刺,但DBA昨儿冲进机房喊“你们网卡驱动有bug”,我就把tcpdump抓包截了三帧发他微信,他看了十秒回了个“…”然后关了VPN。


  第三个是locale。别笑。真有人把LANG=en_US.UTF-8写进/etc/environment,但忘了systemd启动的服务根本不读这玩意儿。你跑sudo -i再export LANG=zh_CN.UTF-8能生效,systemd-run --scope bash里照样报UnicodeDecodeError。上个月我们那个证书吊销验证服务,在AWS China区突然返回一堆乱码错误码,定位到是openssl s_client输出里中文提示被截断,而截断点刚好卡在某个CRL分发点URL的路径参数里。我翻日志时发现第十七行和第三十二行之间空了三行——不是日志丢失,是journalctl的output buffering和LC_ALL=C设置冲突导致printf缓冲区提前刷出。没人修这个,后来靠前端加了个空格占位符糊弄过去。倒水那人今早换班了,新来的不喝咖啡,杯子还在我桌上放着。


  第四个……算了,说个闲的:工资条发下来那个数字,比去年调薪邮件里写的少三百七十二次调用对应的绩效系数。这事不归我管,但我想起上回跟DBA吵,他说“你们应用层连超时都不配自己设”,我把/etc/security/limits.conf里nofile=65536改成131072之后,他当场删了自己监控告警里的“文件描述符使用率>85%”规则。真删了。现在那条规则在Git历史里最后提交人是我,日期是去年冬至。可这跟我今天说的陷阱有屁关系。


文章配图,仅供参考

  第五个最损:用ansible-playbook批量部署时,task里写shell: "echo 'nameserver 8.8.8.8' >> /etc/resolv.conf",看起来很乖。但它会在resolv.conf末尾追加,而systemd-resolved会优先走自己的stub listener(127.0.0.53),结果所有机器都绕过DNS cache,直连外网解析。但你用nslookup测不出来,因为nslookup绕过了glibc的resolver stack;你用dig也测不出来,因为dig根本不走nsswitch;只有curl -v打HTTP请求时,TCP握手前那一次getaddrinfo才真正走这套逻辑。那天我们上线前跑了三轮冒烟,其中一轮里测试点了三下登录按钮,前端报错是“network error”,实际上Wireshark里能看到三百七十二次UDP包飞向8.8.8.8,但没一个回来。PM当时坐我旁边看屏幕,手指在键盘上敲了三次Ctrl+R,第三次敲完说:“你改下代码试试?” 我没改代码,我把那个ansible task注释掉了,改用template模块重写整个resolv.conf——但第二天早上,devops群里有人问“有没有人看到jenkins-agent的DNS日志炸了”,没人回。我也就没再提。


  所以你看,不是配置写错,是配置生效路径太深,深到没人记得systemd init进程第一次读env是哪个顺序。现在我把/etc/sysctl.d/99-custom.conf的备份放在/home/me/.bash_history最后一行,每次rm -rf /tmp/之前都会grep一眼。但我不确定这招能撑多久。刚才又震了一下,oncall手机,这次我没去看。倒水的人换班了,新杯子还没领。先这样。

(编辑:站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!