如何降频 CPU?

解读

面试官把“降频 CPU”抛给 CouchDB 岗位,并不是考操作系统科普,而是验证候选人能否在国内生产环境里,用最低成本把 CouchDB 进程的 CPU 占用压到安全水位,同时保证集群 SLA 不降级。回答必须围绕“CouchDB 是 Erlang 虚拟机 + 异步 IO”这一事实展开,给出可落地、可度量、可回滚的完整方案,并体现对国产化硬件(鲲鹏、飞腾)、国产化 OS(麒麟、统信 UOS)的适配经验。

知识点

  1. CouchDB 的 CPU 消耗模型:Erlang 调度器忙轮询、JS 视图引擎、全文索引、复制冲突解决、压缩进程。
  2. Linux 降频手段:cpufreq governors(performance→powersave)、cgroups cpu.cfs_quota_us、systemd CPUQuota、nice/ionice、taskset 绑核。
  3. Erlang 层降频:+sbwt none 关闭忙等、+sbt ts 绑定调度器、+P 100000 降低进程数、+sfwi 500 减少 GC 抢占比。
  4. CouchDB 可调参数
    • couchdb/max_dbs_open 限并发库
    • couchdb/compactions/_default 把压缩阈值从 70 % 提到 90 %,减少后台 CPU 突发
    • query_server_config/reduce_limit 降到 100,抑制 JS 视图高频 reduce
    • replicator/connection_timeout 提到 60000,降低重试轮询
  5. 国产芯片适配:鲲鹏 920 在 BIOS 里关闭Turbo即可固定 2.6 GHz;飞腾 S2500 需 echo 1 > /sys/devices/system/cpu/cpu*/cpuidle/state1/disable,防止深空状态唤醒带来的瞬时飙频。
  6. 观测指标:通过 erlang:system_info(scheduler_wall_time) 拿调度器繁忙率,配合 node_local 的 /_node/_stats/erlang 接口,CPU>70 % 持续 5 min 即告警;降频后目标繁忙率<50 %,P99 查询延迟上涨不超过 10 %。

答案

线上 CouchDB 集群 CPU 飙高时,按“OS 层→Erlang 层→CouchDB 层→业务层”四级降频,步骤如下:

  1. OS 层(零重启)
    国产麒麟 OS:

    cpupower frequency-set -g powersave
    echo 60 > /sys/devices/system/cpu/intel_pstate/min_perf_pct   #  Intel 平台
    

    若宿主机为鲲鹏 920,直接进 BIOS 把Turbo关闭,锁定 2.6 GHz;飞腾平台则禁用 idle state1,避免唤醒尖峰。
    立即用 cgroups 把 5984 端口 beam.smp 进程限到 8 核 60 %:

    systemd-run --uid=couchdb --scope -p CPUQuota=60% -p AllowedCPUs=0-7 -- couchdb
    
  2. Erlang 层(热加载)
    在 /opt/couchdb/etc/vm.args 追加:

    +sbwt none
    +sbt ts
    +sfwi 500
    

    执行 sudo -u couchdb bin/couchdb remsh,热生效:

    erlang:system_flag(scheduler_bind_type, thread_spread).
    
  3. CouchDB 层(动态 PUT)

    curl -X PUT http://127.0.0.1:5984/_node/couchdb@127.0.0.1/_config/couchdb/compactions/_default \
         -d '"{db_fragmentation, \"90%\"}, {view_fragmentation, \"90%\"}, {parallel_compact, false}"'
    

    同时把 max_dbs_open 从 500 降到 200,reduce_limit 降到 100,connection_timeout 提到 60 s,均通过 PUT /_config 实时生效,无需重启节点。

  4. 业务层(快速止血)
    若降频后仍高于 70 %,立即把离线同步任务 channel 数从 8 降到 2:

    PUT /_replicator/_design/filter/_rewrite
    

    并给高频视图建立 stale=ok 只读副本,把查询流量切过去,降低 JS 引擎压力。

  5. 回滚策略
    保留原 vm.args 为 vm.args.bak;cgroups 限核通过 systemd 临时 scope,重启即失效;所有 PUT 配置在 24 h 后自动回滚脚本:

    curl -X PUT ... -d `cat /tmp/config_backup.json`
    

    确保白天业务高峰可一键恢复。

拓展思考

  1. 降频≠降质:国内政务云常把 CouchDB 与 OAS 3.0 网关混部,CPU 限核后若磁盘 IO 被打满,同样会触发请求堆积。因此降频同时要把disk_io_concurrency 从 64 提到 128,并在国产统信 UOS 上开启 io_uring,保证 IO 不成为新瓶颈。
  2. 离线优先场景:移动警务终端在 4 G 弱网环境同步,若服务器降频导致复制吞吐下降,可在边缘节点启用 PouchDB 本地缓存,采用延迟写+冲突桶机制,把冲突解决从服务器转移到终端,降低服务器 CPU 负载。
  3. 国产化验收:等保 2.0 三级要求“资源控制”,降频方案必须写入《安全计算环境管理手册》,并留存 6 个月以上的 scheduler_wall_time 审计日志,以备网安支队现场核查。