ARTICLE DETAIL

资讯详情

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

系统参数配置实战:从内核参数到配置管理一次讲透

系统参数配置实战:从内核参数到配置管理一次讲透 1. 别把配置当杂活先想清楚参数从哪里来做运维和开发这些年我最大的感受就是系统参数配置这个事看起来就是改几个数字、加几行配置真正踩过坑的人才知道它其实是整个系统稳定性的地基。很多线上事故最后排查来排查去根因就是某个参数被人随手改了一下或者某个配置在重启之后悄悄丢了。所以我想把关于系统参数配置的经验系统性地聊一聊从参数分类、系统级参数、实操流程到配置管理一次讲透。先说一个最容易被忽略的问题你手上的参数到底应该放在哪里管理是写死在启动脚本里还是丢进配置文件还是通过环境变量注入这个选择本身就决定了后续的维护体验。我见过不少团队把参数到处乱放。有人把连接池大小写死在代码里有人把超时时间放在每个环境的配置文件里还有人更狠直接在服务器上手动 export 一个变量然后靠 ssh 会话不退出硬撑。这些做法短期都能跑长期全是坑。我自己习惯先给参数分三类代码逻辑类比如算法阈值、功能开关、业务规则这类参数应该跟着代码走用配置中心管改完可以灰度不用重新发布。运行环境类比如 JVM 堆大小、连接超时、线程池大小这类参数跟部署环境强相关应该放在部署编排或者启动脚本里跟着应用走。系统内核类比如文件描述符上限、TCP 缓冲区、内存回收阈值这类参数属于操作系统层面一般通过 sysctl、limits.conf 这类机制管理改动影响面最大也要最谨慎。这三类参数混在一起是绝大多数配置事故的根源。你想想看应用层的参数被误当成内核参数写进 /etc/sysctl.conf或者内核参数被放在应用配置文件里一旦应用没启动整个系统的基础调优就全部失效。所以动手改参数之前先把手上的参数分好类明确它归谁管、怎么管、影响哪些节点这是第一条经验。1.1 配置文件、环境变量还是启动参数同一个参数比如数据库连接的超时时间你可以通过三种方式传进去改配置文件、设置环境变量、在启动命令里加参数。这三种方式各有各的适用场景没有绝对的对错但有一条原则是通用的静态的、所有环境都一样的参数放配置文件动态的、环境之间有差异的参数放环境变量只影响某一次启动的参数放命令行。很多人不理解为什么要有这么多通道。你可以这么想配置文件相当于系统默认设置应用一启动就该知道自己该用谁环境变量相当于每次开会前临时定的规矩不同会场可以有不同的版本启动参数则是只针对这一场会议的特别说明用完就没了。把这三者混为一谈就会出现明明配置文件改对了但环境变量把它覆盖了这种让人抓狂的问题。我自己更倾向于用环境变量来管环境差异因为它在容器化场景下特别方便Kubernetes 的 ConfigMap 和 Secret 本质上就是在管理环境变量。配置文件则保留给那些不随环境变化的默认值避免每个环境放一份相同的配置导致漂移。命令行参数尽量少用因为它不透明进程一重启就不知道当初传了什么。1.2 参数分类哪个变更影响最大如果你刚开始接触系统参数配置我建议你按照改动后的风险等级给参数排个序。最高风险的是内核级参数改错了可能直接导致系统崩溃、网络中断、OOM比如 vm.overcommit_memory 这种参数改完以后内存分配行为立刻变化MySQL 或者 Redis 这种吃内存大户可能瞬间被 kill。第二档是应用级参数比如 JVM 堆大小、线程池核心线程数、连接池 maxTotal。这类参数改错不会让系统宕机但会让服务性能急剧下降或者在流量高峰时出现雪崩。第三档是业务开关类参数比如某个功能是否开启、某个降级阈值是多少这类参数变更虽然频次高但一般都有兜底逻辑风险相对可控。为什么要把参数按风险分级因为你得决定变更的审批流程。内核参数改动我一般要求走变更单、双人复核、先在预发机验证业务开关参数团队内部确认一下就能直接上。如果所有参数都走同一条审批链路那你的变更效率一定很低最后反而会有人偷偷绕过流程去改配置风险更大。2. 系统级参数最常改也最容易翻车的几个聊完了分类我们落到具体的系统参数。这里说的系统级参数主要指 Linux 内核参数和用户态资源限制。我不打算把 /etc/sysctl.conf 里的几百个参数全列出来只挑几个我实际工作中改得最多、也见过最多人改错的逐个拆清楚。2.1 vm.swappiness 与内存回收的直觉vm.swappiness 这个参数恐怕是新手最爱改的一个。网上到处都在说设置成 0 或者 10提升性能但我见过太多人改完以后系统反而出现卡顿甚至 OOM。原因是大家只记住了降低 swappiness 可以让进程少用 swap、多用内存却忽略了整个内存回收机制的运行逻辑。Linux 内核在内存压力下会通过两种方式回收内存回收 page cache或者把匿名页换到 swap。swappiness 控制的是内核倾向使用 swap 的程度取值范围 0 到 100值越大越倾向用 swap。但你把 swappiness 改成 0并不意味着绝不使用 swap它只是让内核在回收内存时更倾向于先回收 page cache。如果应用程序本身存在内存泄漏或者 page cache 已经所剩无几系统该 OOM 还是会 OOM。我在实际项目中见过一个典型的场景一个 Java 应用堆内存很大平时占用系统内存的 70% 左右运维老哥为了性能优化把 swappiness 从默认的 60 改成了 0。结果某个业务高峰page cache 被大量占用内核找不到足够可回收的 page cache又因为 swappiness 太低不愿意把匿名页换出去系统直接进入 OOM 状态把主进程杀了。那次事故之后我给团队定了一个规矩swappiness 不要低于 10而且改之前必须看一眼当前的 memory cgroup 限制和 swap 分区大小。那到底怎么判断一个系统该不该动 swappiness我现在的做法是先看磁盘类型如果应用数据落在机械盘上swap 换入换出确实伤性能可以适度降低如果是 SSD 甚至 NVMeswap 的代价没那么夸张保持默认值就行。再看应用的 memory profile如果应用本身是宁可进程被杀也不希望卡顿的类型比如监控告警系统那可以保留较高 swappiness让内核更平滑如果是数据库这种绝对不能被杀掉的进程那尽量预留足够内存并把 swappiness 调到合理区间同时配合 oom_score_adj 做保护。参数不是孤立存在的它必须放在整个系统里看才有意义。2.2 文件描述符一切IO的隐形瓶颈文件描述符file descriptor限制是另一个高频踩坑点。高并发的服务端程序每建立一个 TCP 连接、每打开一个文件、每创建一个 socket都要消耗一个文件描述符。默认的 1024 上限对日常开发机够用对生产环境的高并发服务来说那就是事故导火索。很多人知道要改 ulimit -n但改完以后发现不生效。为什么会这样因为在 Linux 上文件描述符限制分两层用户态 shell 的 ulimit 限制以及系统级的 fs.file-max。你光改了 /etc/security/limits.conf可能只对登录会话生效如果进程是通过 systemd 启动的还需要在 service 文件里加上 LimitNOFILE如果进程是容器还要看容器运行时有没有设置 ulimits。这四个地方各管一段任何一层没有放开最终进程实际的 nofile 都是那个最小的值。我排查过一个特别隐蔽的问题Nginx 的 worker_connections 配到了 65535系统 fs.file-max 也是 100 万看起来都够但压测时连接数一过 1024Nginx 就开始报 accept failed。查到最后发现Nginx 进程是通过 systemd 跑的而 systemd 默认对服务进程设置了 LimitNOFILE1024这个默认策略会覆盖掉你在 nginx.conf 里的 worker_rlimit_nofile 设置。你光看 Nginx 配置没有用得看 systemd unit 文件里面的限制。后来我把所有服务的 systemd unit 文件统一加上了 LimitNOFILE65535才彻底解决。2.3 网络队列参数高并发下的握手风暴还有一个让我印象深刻的参数net.core.somaxconn。它控制的是每个端口上处于 SYN_RECV 状态、等待应用 accept 的连接队列最大长度。默认值 128对绝大多数场景来说都太小了。一旦流量峰值超过这个值新连接会被直接丢弃客户端看到的现象就是连接超时、握手失败服务端日志里全是 SYN 丢包。我负责过的一个电商网关大促前压测时发现QPS 只要超过 3000就开始出现大量 connection timed out。排查链路发现监听端口的 backlog 队列被打满而应用层 accept 的速度跟不上。当时我们做了两件事第一把 net.core.somaxconn 从 128 调大到了 4096同时把应用监听 socket 的 backlog 参数比如 Nginx 的 listen 指令里的 backlogJava 的 ServerSocket backlog也一起调大第二优化了 worker 进程的 accept 逻辑避免单线程 accept 成为瓶颈。这里有个很容易被忽略的细节somaxconn 只是内核层的上限应用在调用 listen() 时传入的 backlog 参数如果小于 somaxconn那么实际生效的是两者中较小的那个。所以改完 /etc/sysctl.conf 里的 somaxconn 以后千万别忘了检查应用自己有没有设置 backlog否则你会发现改了没用。很多我明明调了参数但没效果的疑惑底层都是这种多重限制叠加的结果任何一个环节没对齐最终生效的永远是那个最小值。3. 实操一条龙从改参数到确认生效参数改错了怎么办其实改参数这个动作本身不难难的是确定改完以后真的生效了并且没有副作用。我见过太多人在改参数这件事上流程极端简化vim 打开配置文件改一个数字写个 :wq完事。等到下次重启系统直接起不来或者服务行为突然变了才想起我是不是哪个参数改坏了。所以我每次做系统参数配置都会走一套固定的流程大概四步改前记录基线、选择正确的修改方式、验证参数生效、把改动固化到资产管理里。每一步看起来都不起眼但少了任何一步后面都可能要花几倍的时间去补。3.1 修改前的基线记录改任何参数之前先记录当前值。这一步听起来多余但它救过我很多次。特别是当你同时改好几个参数、并且跨多台机器操作的时候如果没有基线记录出了问题你根本不知道是哪个参数导致的。我常用的命令组合就三条# 查看内核参数当前值 sysctl -a | grep -E vm.swappiness|net.core.somaxconn|fs.file-max # 查看用户态资源限制 ulimit -a # 查看关键进程的实际限制 cat /proc/pid/limits/proc/ /limits 这个文件特别值得养成习惯去查因为它反映的是某个进程实际生效的软硬限制而不是你在配置文件里写的值。很多参数炸雷都是因为配置文件写了 65535进程实际生效的却是 1024因为进程启动的时候 shell 的 ulimit 还没被正确应用。改前先把这个值记下来改后再查一次对比一下就全清楚了。除了记录参数值本身还要记录关联信息。比如你改了 net.core.somaxconn那么相关的应用 backlog 是多少改了 vm.swappiness系统当前内存还剩多少这些关联信息在复盘的时候比参数值本身还有价值因为它们能帮你还原当时为什么这个值会出问题的完整上下文。我习惯在每次变更时建一个变更文件夹里面放一个 markdown 文件记录时间、操作人、参数名、旧值、新值、变更原因、影响范围。这个习惯坚持了几年帮我挡掉了至少十次想回滚但不知道原来值是什么的尴尬。3.2 永久配置的三种姿势修改系统参数永久生效的办法大致有三种sysctl.conf、limits.conf、systemd override。三种方式分别对应不同类型的参数而且现代 Linux 系统上有很多叠加规则用错了可能被覆盖。先看内核参数。传统做法是编辑 /etc/sysctl.conf然后执行 sysctl -p 让它立即生效。但现在很多发行版比如 CentOS 7、Ubuntu 18.04 之后更推荐把独立参数的文件丢到 /etc/sysctl.d/ 目录下面文件名按照数字排序数字小的先加载。为什么要这么做因为 /etc/sysctl.conf 是所有配置文件的汇总点而 /etc/sysctl.d/ 下每个文件可以分属不同的管理单元比如某个应用安装包自带一个参数文件卸载应用的时候可以单独移除而不会动到别的参数。我现在一般自己加的参数都放到 /etc/sysctl.d/99-custom.conf数字 99 保证它最后加载覆盖掉前面可能有冲突的默认值。再来看文件描述符限制。传统做法是在 /etc/security/limits.conf 里写 * soft nofile 65535 和 * hard nofile 65535。但这个文件只对通过 PAM 登录的会话生效对 systemd 管理的服务默认不生效。systemd 服务要在 unit 文件里加 LimitNOFILE65535并且在 [Service] 段里面写。你可以直接用 systemctl edit 命令生成 override 文件而不要直接改 /usr/lib/systemd/system/xxx.service因为系统升级的时候那个文件会被覆盖而 override 文件会保留。最后是应用级参数的持久化。这一类参数大多写在应用的 conf 文件里或者通过环境变量注入。关键点是你在命令行里 export 的变量、临时 sysctl -w 的修改、直接执行 ulimit -s 改的栈大小都只是当前 shell 或者当前内核运行期生效进程一重启就全没了。要让它在重启后依然存在必须把配置写进相应机制的启动文件里。我曾经见过一个团队因为在 /etc/profile.d/ 里加了一行 export JAVA_OPTS导致所有登录用户都带着一堆只应该给 Java 应用的参数后来一台要跑多个 Java 应用的机器互相踩参数排查了很久。这就是把临时配置和永久配置搞混的典型案例。3.3 验证参数真的生效改完参数以后最忌讳的就是感觉没问题。验证参数生效一定是从实际运行的进程角度去验证而不是从配置文件角度。配置文件只是你希望的值进程实际看到的值才是最终结果。验证分三层。第一层确认系统级参数已加载。比如我刚改完 vm.swappiness用 cat /proc/sys/vm/swappiness 确认当前值执行 sysctl -p 后如果报错说明配置语法有问题必须立刻处理。第二层确认进程级参数已生效。比如调整了 systemd 服务的 LimitNOFILE用 systemctl restart xxx 重启服务然后 cat /proc/ /limits 确认 Nofile 一行确实变成了 65535。这一步尤其重要因为 systemd 的 override 文件有时候会因为 unit 文件里已经有相同配置而静默不生效你不看进程级的值根本发现不了。第三层确认应用自己读到的配置是对的。比如你改了 JVM 堆大小最好用 jcmd VM.flags 或者 jmap -heap 去看实际堆配置而不是只看启动脚本上写了什么。除了确认参数本身生效还要验证业务行为正常。改完参数后我一般会盯一段时间的监控曲线错误率、延迟、CPU 和内存使用。特别是内核参数一个参数的改动可能影响整个内存子系统如果只看进程没挂是不够的还要确认没有出现性能劣化。我见过有人把 vm.overcommit_memory 从 0 改成 2 以后进程倒是没挂但数据库申请内存开始频繁失败因为 overcommit 策略变了系统不再无条件给进程分配超出物理内存的虚拟地址空间。这种问题如果只看存活状态根本发现不了。4. 参数配置的坑我踩过的那几个参数配置的坑往往不是配置写错了这么简单而是配置对的但生效的位置错了或者配置生效了但影响超出了预期。这一节我把这几年踩过的典型坑整理一下每一个都是真实发生过的事故也都对应着一个可以落地的排查思路。4.1 改了没生效语法、权限、顺序第一个坑是改了没生效。这类问题占比最大但排查思路其实是固定的。我一般按顺序检查四个地方语法、权限、加载顺序、覆盖关系。语法问题最容易定位。sysctl 配置文件里多了一个空格或者写错一个关键字执行 sysctl -p 的时候会直接报错。报错不等于没改生效而是意味着整个文件里报错点之后的配置可能全都没有加载这是个非常危险的特性。我规定自己改完 sysctl 配置后必须原地执行一次 sysctl -p 看完整输出不能只看了文件内容就完事。权限问题常见于 limits.conf。如果你给某个用户写 LimitNOFILE 但用户拼错了或者通配符写成了 * 导致某些系统账号也被影响配置看起来没问题但进程实际没拿到。排查方式依旧是 cat /proc/ /limits这是终极判定手段。加载顺序问题主要出现在多配置文件并存的环境。比如某个应用安装了 /etc/sysctl.d/60-mysql.conf你又写了一个 /etc/sysctl.d/99-custom.conf两个文件里都定义了 net.core.somaxconn那最终以 99 的值为准。如果你以为自己改的是 99 文件但系统读的是 60 文件就会觉得改了半天没效果。解决方法是每次加参数之前先 grep 一下 /etc/sysctl.d/ 和 /etc/sysctl.conf 里有没有同名参数有就先用 sysctl -a 看当前系统实际值再去决定改哪里。覆盖关系这个坑最隐蔽。systemd 管理的服务会同时受 /etc/security/limits.conf、systemd unit 文件、进程启动 shell 的 ulimit 影响最终生效的是进程运行时继承的那个值。任何一层没覆盖到位实际值就是最小的那个。这种问题没有捷径只能一层一层排查最终以 /proc/ /limits 为准。4.2 持久化失效重启后打回原形第二个坑是持久化失效你明明改了配置文件重启以后参数却变回去了。我遇到过的典型情况有三种。第一种是改的临时值。很多人图方便直接在 shell 里执行 sysctl -w vm.swappiness10当时生效很开心压根没写进 /etc/sysctl.conf重启自然就丢了。要避免这个坑核心是建立纪律所有临时改动都要标记清楚并且在变更记录里注明需要补充持久化配置不能图省事。第二种是别人的初始化脚本把参数重置了。比如云厂商的初始化脚本、监控 agent 的自愈逻辑会在机器启动时把某些参数重置为它们的默认值导致你写在 /etc/sysctl.d/ 里的配置被覆盖。遇到这种问题只能查启动日志和初始化脚本的执行顺序然后要么修改初始化脚本的配置源要么把自定义配置放到最后加载的路径并确保不会被后续脚本覆盖。第三种是容器镜像层无状态。如果服务跑在 Docker 或者 Kubernetes 里你手动改宿主机参数可能完全不影响容器内进程因为容器有自己的 PID namespace 和资源视图。容器内改 /etc/sysctl.conf 更是只有一个结果重启后配置随着容器重建而消失。容器场景下正确的做法是靠 Kubernetes 的 securityContext.sysctls 或者启动脚本在执行入口里统一配置并且确保镜像构建时就把配置文件打进去而不是容器启动后再手工改。4.3 配置漂移多机环境下的隐形炸弹第三个大坑是配置漂移。这不是某一次改动造成的而是多台机器经过多次变更之后每台机器的配置慢慢变得不一样了。一开始可能只是 A 机器改了 swappinessB 机器没改后来 B 机器加了文件描述符限制A 机器没加。半年以后两台机器从功能上看起来都在跑同一个服务但行为差异巨大出了问题以后根本没法复现。配置漂移的核心原因是缺少一个一致性的校验机制。我跟团队现在用的方案是所有机器配置都通过一个脚本仓库统一管理脚本里定义好每台机器应该有的参数清单然后定期跑一遍 diff把不一致的地方自动告警出来。如果你还没有这种自动化可以先做一个简单版本把每台机器上的 /etc/sysctl.conf、/etc/security/limits.conf 收集起来做一次对拍人工检查差异点。不要小看这个土办法我靠它找出过好几台机器的隐藏差异比如一台机器被同事顺手把 vm.max_map_count 改小了导致 Elasticsearch 在低峰期频繁报 mmap 相关错误。5. 让配置可管可控版本化、校验、灰度与回滚聊完了系统参数和踩坑经验再往上一层说说配置管理的工程化。系统参数配置不只是一次性的操作它会随着业务的发展不断演进。如果没有一套管理机制任何一次配置变更都可能是线上的定时炸弹。5.1 配置即代码的落地配置即代码的核心是把所有配置以文件的形式纳入版本管理而不是散落在服务器上。这样做的价值有两层一层是历史可追溯你能看到每次配置变更的时间、作者、diff 内容另一层是可复现新加一台机器只要从仓库拉取对应角色的配置就能快速获得和已有机器一致的状态。落地方式不复杂。先建一个 git 仓库按角色分目录比如 nginx/、jvm/、sysctl/、limits/每个目录下放对应角色的配置模板。参数值不要直接在模板里写死而是用模板变量标记出来由部署工具在发布时填充。比如 sysctl 模板里写 vm.swappiness{{ vm_swappiness }}然后针对不同环境dev、staging、prod定义不同的取值。这套做法的本质是把参数配置从一次性的手工操作变成一种可审查、可测试、可回滚的工程行为。实施的时候有一个要点版本管理的是期望状态而不是当前状态。如果你的配置仓库和线上机器长期不一致仓库的价值就很低。所以配置即代码必须配套一个持续的同步机制比如用 Ansible 的 role 或者自研的 pull 模式让机器定期从仓库拉取最新配置并报告 diff。我自己用 Ansible 比较多一行 ansible-playbook 可以批量把配置推到几十台机器跑完以后直接看每个任务的 changed 数量就知道哪些机器发生了漂移。5.2 校验上线前的一道闸门配置上线之前的校验是我见过最容易被跳过、也最值得投入的一环。很多团队觉得配置文件不需要测试改完就发发完就看监控。但配置写错造成的损失往往比代码 bug 更隐蔽因为代码有编译器、有单元测试帮你拦一道配置文件经常没有任何自动化检查。至少要做三级校验。第一级是语法校验。比如 /etc/sysctl.conf 可以用 sysctl -p --dry-run 检查语法Nginx 配置可以用 nginx -t 检查systemd unit 文件可以用 systemd-analyze verify。这些工具跑一遍只要几秒能过滤掉绝大部分低级错误。第二级是参数值校验。比如提示提示 TCP 队列大小的参数不能是负数文件描述符上限不能超过 fs.file-max 的值JVM 堆大小不能超过容器内存限制。这部分可以用脚本断言把关键参数的取值范围写成单元测试每次配置变更时跑一遍。第三级是影响面评估。改一个内核参数之前用 git blame 看上次改这个参数的人是谁搜索一下监控系统里有没有这个参数相关告警看看有没有关联依赖它的其他服务。这种查户口式的评估在跨团队协作时尤其重要因为同一个内核参数可能同时影响数据库、缓存、消息队列多个系统。5.3 灰度与回滚别让一次配置杀掉整条链路配置变更和代码变更一样需要灰度发布和回滚预案。很多线上事故之所以失控就是因为配置是一次性推给了所有机器没有观察期。灰度发布的做法最简单的就是分批次先推一台机器或者一个集群观察 10 到 30 分钟确认核心指标稳定后再推下一批。如果使用的是 Kubernetes 这类容器编排工具可以通过分批滚动重启 Pod 实现。这里有一个关键指标不要只看错误率还要看资源配置类指标。比如你调大了 JVM 堆就要盯内存使用量和 GC 频率调大了 somaxconn就要盯连接队列占用和 accept 延迟。配置变更的影响往往都体现在这些和参数直接相关的指标上。回滚预案同样重要。回滚不是简单地把参数改成旧值而是要有一套完整的动作清单改哪些文件、重启哪些服务、验证哪些指标。我习惯把每个应用的配置回滚步骤写成 markdown 文档放在应用仓库的 docs 目录下每次配置变更时一并更新。别觉得写文档麻烦等到凌晨三点线上出问题、你要在十分钟内回滚的时候文档里的每条命令都能帮你少走很多弯路。没有回滚预案的配置变更我建议一律不要在核心生产环境上执行这是底线。6. 一些实在的体会与提醒写了这么多最后还是想分享几个更偏习惯层面的东西。系统参数配置这个工作技术难度其实没有那么多真正难的是细心和留痕这两件事。6.1 用小本子记录每一个改动每次改配置我都会在本子上记录几行字时间、机器、参数、旧值、新值、谁让改的、为什么要改。这个习惯一开始觉得烦后来价值越来越大。有一次线上数据库出现连接耗尽的故障排查到最后发现是早两周有同事把 fs.aio-max-nr 调小了导致 InnoDB 的异步 IO 请求被拒绝数据库连接池迅速堆积。没有那条记录我们可能还要多花半天才能定位到根因。这里分享一个我常用的配置日志模板变更时间、变更人、变更批准人影响的服务/机器清单参数名和完整的前后值变更动机关联哪个工单或故障验证结果进程级、业务级回滚方案回滚步骤验证点这个模板看起来笨重但每一条在出故障的时候都可能救命。尤其回滚方案这一栏很多人默认不写结果真到要回滚的时候临时去翻历史版本又翻了半天耽误了最宝贵的窗口期。我自己的经验是写完配置变更记录之后顺手把这个文件放进一个专门的目录并且同步到仓库里相当于给每台服务器也做了一份配置变更日志。时间长了这套记录本身就是团队的资产新人接手系统时翻这些记录比读任何文档都管用。很多人觉得配置管理是件脏活累活谁来做都行随便改改就行。但我在一线干了这么多年恰恰是这些不起眼的参数决定了系统的性能边界和稳定性天花板。一个负责的工程师不会随便改一个数就完事他会想清楚这个参数为什么存在、改完以后影响哪些链路、出了问题怎么恢复。这种做事方式才是系统参数配置最重要的配置。6.2 配置变更的复盘清单最后附上一份我每次配置变更后都会对照检查的清单也可以理解成一份变更后的卫生习惯。你可以把它打印出来贴在工位上是否记录基线值如果出了问题我能回答原来是什么值这个问题吗是否检查了语法配置文件能通过自带的检查工具吗是否验证进程实际值进程看到的是不是配置文件里写的值是否观察了一段时间改了不是目的稳定才是目的至少看完一个业务周期。是否有回滚方案如果新值导致问题我能在一分钟内恢复旧值吗是否同步到配置仓库下次新加机器能不能自动复现现在的状态这些问题每次配置变更前都过一遍能帮你避免绝大多数低级但致命的配置事故。我对系统参数配置最大的体会就是它永远不要凭感觉每一步都要有依据每一个动作都要留痕。你按这个方式去执行就算偶尔改错了也能很快恢复不至于酿成大事故。
返回列表