Linux老手也常踩的5个Unix环境搭建坑
|
那天接口超时告警炸得我头皮发麻,监控大盘上绿色那条线抖得跟癫痫似的——你猜怎么着?排查半天发现是/etc/security/limits.conf里没给用户加nofile,进程堆栈卡在epoll_wait上,文件描述符耗尽了。我原以为这种低级错误早该被淘汰了,结果去年七月帮隔壁组搭Istio环境,又踩了五个更邪乎的坑。 第一个坑是ulimit那点破事。老系统用systemd管服务,我照着文档在service文件里加了LimitNOFILE=65536,结果重启后进程还是只能开4096个文件。后来发现systemd的Override.conf优先级比service文件高,而运维之前为了修OOM杀进程的问题,偷偷在/etc/systemd/system.conf里全局改了DefaultLimitNOFILE=4096。更绝的是,这配置修改后得执行systemctl daemon-reload再重启服务,运维图省事只重启了进程——你说这锅该谁背? 工位对面的老张这会儿正举着手机跟房东吵架,电话里“押一付三”的词儿飘过来,我敲键盘的手都跟着抖。第二个坑是环境变量污染。我们用Envoy做Sidecar,测试环境为了方便调试,在/etc/profile里加了export ENVOY_LOG_LEVEL=debug。结果生产环境部署时,运维直接cp -r了测试环境的/etc目录,导致所有Envoy实例疯狂刷日志,磁盘IO直接拉满。我查日志时发现每行都带[debug]前缀,还以为是Envoy版本问题,直到看见/etc/profile里那行显眼的export——这他妈谁能想到啊? 第三个坑是时区设置。我们微服务依赖的MySQL集群,主库在AWS美国区,从库在阿里云北京区。按理说时区应该统一用UTC,结果运维为了“方便本地查看日志”,偷偷在从库的my.cnf里加了default-time-zone='+08:00'。更骚的是,主库的时区配置是通过AWS Parameter Store动态注入的,而从库的配置是写死在配置文件里的。结果有天定时任务执行时间错位,导致订单状态更新延迟了8小时——这锅最后甩给开发,说我们没做幂等处理。 咖啡机这会儿咕噜咕噜响,我起身接水时瞥见运维小王在工位上啃煎饼果子,碎渣掉键盘上都不带擦的。第四个坑是内核参数调优。我们用Istio的自动注入,Sidecar会占用大量PID资源。我按官方文档在/etc/sysctl.conf里加了kernel.pid_max=65536,结果重启后发现进程数还是卡在32768。查了半天发现是CentOS 7的默认内核版本太老,得手动升级到3.10.0-957以上才能支持更高的pid_max。更坑的是,升级内核后Nginx的TCP_FASTOPEN模块不兼容,又得回滚——这他妈叫什么事儿啊? 第五个坑是文件系统权限。我们用Vault做密钥管理,Sidecar需要读取/var/run/vault/token文件。我按文档用chmod 640设了权限,结果Envoy启动时报Permission denied。后来发现是SELinux启用了,得执行chcon -t vault_token_t /var/run/vault/token才行。更绝的是,测试环境的SELinux是permissive模式,生产环境是enforcing模式,而运维根本没在文档里提这茬——你说这算不算故意埋雷? 外卖筷子这会儿掉地上,我弯腰捡时听见前端小妹在吐槽:“产品又改需求,说订单列表要加个搜索框,结果后端接口得重构。”我抬头看了眼监控,发现刚才的接口超时告警又冒出来了——这次是Redis集群的maxclients设置太小,连接数打满了。我原以为这些老掉牙的Unix配置问题早该被容器化解决,结果发现K8s的Pod里照样会踩坑——比如/etc/resolv.conf被kubelet覆盖,导致DNS解析超时;或者/proc/sys/net/core/somaxconn被限制,导致TCP连接队列溢出。
文章配图,仅供参考 这些坑之所以能存活到现在,我觉着就跟自然选择似的——优胜劣汰。简单的坑早被踩烂了,剩下的都是些“看似简单实则暗藏玄机”的玩意儿。比如ulimit设置,你以为改个数字就完事了?得考虑systemd的优先级、配置文件的加载顺序、进程的继承关系,甚至还得查内核文档看LimitNOFILE到底限制的是软上限还是硬上限。再比如时区设置,你以为统一用UTC就万事大吉?得考虑定时任务的触发时间、日志的切割时间、数据库的事务时间,甚至还得考虑运维半夜爬起来查日志时的心理感受。我现在搭环境都养成习惯了:先查系统版本,再查内核参数,然后看SELinux状态,最后再动配置文件。就算这样,还是会被一些“历史遗留问题”坑到——比如测试环境的/etc/hosts里多了条不存在的域名解析,或者生产环境的/etc/fstab里挂载了个不存在的NFS。这些坑就像祖传代码里的注释,你明明知道它在那儿,却不敢随便动——因为谁也不知道动了会引发什么连锁反应。 说到底,Unix环境搭建这事儿,就跟玩拼图似的。你以为把所有碎片都拼好了,结果发现少了一块——而这块碎片,可能藏在十年前的某个运维手册里,可能藏在某个离职同事的脑子里,也可能藏在某个早就没人维护的Wiki页面上。所以我现在遇到问题,第一反应不是查文档,而是先问运维:“这机器以前有人动过吗?”——通常答案都是:“好像...动过?” (编辑:站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


Linux下H5开发环境搭建与数据库配置
Linux安全环境搭建:13年经验实战指南
Windows数据科学环境搭建:10年实战避坑与高效配置
Linux数据库环境搭建七步实操指南