Skip to main content
☘️ Septvean's Documents
Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

性能优化

下面这份内容,我会刻意避开你已经整理过的 sysctl 参数,只补充那些:

  • 你现在这套配置没有覆盖
  • 生产环境中经常被忽略,但非常关键
  • 必须按场景区分,否则会出问题

并且我会按你一贯偏好的方式来写: 结论先行 + 场景化 + 可落地,不做中英文混搭。


一、一个重要前提(先说清楚)

系统性能 ≠ 只靠 sysctl

真正稳定高性能的 Linux,至少包含 5 个层面:

  1. 内核参数(sysctl)
  2. 资源限制(limits / cgroup)
  3. systemd 行为
  4. 调度与中断(CPU / NUMA / IRQ)
  5. 文件系统与 I/O

你前面已经把 第 1 层 做得非常完整了,下面重点补 2–5 层


二、资源限制(limits)——你现在几乎没动,但非常关键

1️⃣ 文件描述符(必须)

全局(systemd)

## /etc/systemd/system.conf
DefaultLimitNOFILE=1048576

用户级

## /etc/security/limits.conf
* soft nofile 1048576
* hard nofile 1048576

适用场景

服务 必须
Nginx
MySQL / PostgreSQL
Redis
Kafka
Prometheus

2️⃣ 进程数限制(防 fork 风暴)

## /etc/security/limits.conf
* soft nproc 65535
* hard nproc 65535

适合:

  • Jenkins
  • GitLab
  • 编译机
  • CI 节点

三、systemd 级别优化(经常被忽略)

1️⃣ OOM 防护(极其重要)

数据库服务单位文件

[Service]
OOMScoreAdjust=-900
MemoryAccounting=true
服务 建议
MySQL / PostgreSQL 必须
Redis 必须
Elasticsearch 必须

2️⃣ 禁止 systemd 回收缓存(数据库节点)

## /etc/systemd/system.conf
DefaultMemoryAccounting=no

防止 systemd 误判缓存为可回收内存。


3️⃣ journald 限制(防止吃内存 + IO)

## /etc/systemd/journald.conf
SystemMaxUse=500M
RuntimeMaxUse=200M

四、CPU / NUMA / IRQ(你前面提过,但没完整落地)

1️⃣ 数据库是否禁用 irqbalance(再明确一次)

结论

场景 irqbalance
MySQL / PostgreSQL ❌ 关闭
Redis ❌ 关闭
Kafka ❌ 关闭
容器节点 ✅ 保留
Web

同时要做的事

echo performance > /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor

2️⃣ NUMA 策略(数据库节点)

内核参数

kernel.numa_balancing = 0
vm.zone_reclaim_mode = 0

启动服务时

numactl --interleave=all

五、文件系统与 I/O(你几乎没动,这是性能大头)

1️⃣ I/O 调度器(NVMe / SSD)

cat /sys/block/nvme0n1/queue/scheduler
## 选择
none

传统 SSD

mq-deadline

2️⃣ 文件系统挂载参数(数据库)

XFS(强烈推荐)

noatime,nodiratime,logbufs=8,logbsize=256k

ext4

noatime,nodiratime,data=ordered

3️⃣ 禁用透明大页(数据库必做)

echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag

六、网络栈补充(非 sysctl)

1️⃣ 网卡多队列(高并发)

ethtool -L eth0 combined 16

适合:

  • Nginx
  • LVS
  • Kafka

2️⃣ 关闭网卡节能

ethtool -K eth0 gro off gso off tso off

(数据库节点尤其重要)


七、容器 / K8S 特有优化(你前面没展开)

1️⃣ Docker daemon

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m",
    "max-file": "3"
  },
  "storage-driver": "overlay2"
}

2️⃣ Kubelet

--kube-reserved=cpu=500m,memory=1Gi
--system-reserved=cpu=500m,memory=1Gi

八、按场景给你一份「必做清单」

🟢 数据库专用节点

  • 禁用 swap
  • 关闭 irqbalance
  • 禁用 THP
  • 设置 OOMScoreAdjust
  • NUMA 交错
  • XFS + noatime
  • systemd 限制 journald

🟡 容器 / K8S 节点

  • ip_forward = 1
  • rp_filter = 0
  • conntrack 调优
  • irqbalance 开启
  • kube-reserved

🔵 高并发网络节点(Nginx / LVS)

  • 多队列网卡
  • 增大 somaxconn
  • TCP 缓冲
  • arp_announce = 2

🔴 大数据 / 消息队列(Kafka / ES)

  • 高 nofile
  • 高 vm.max_map_count
  • 禁用 swap
  • OOM 保护
  • NUMA 感知

九、一句“总纲”,适合写在你文档最前面

Linux 的性能优化不是堆参数,而是按角色约束行为。 谁吃 CPU,谁吃内存,谁吃 IO,必须在系统层面提前划清边界。

如果你愿意,下一步我可以帮你把这些内容:

  • 汇总成 《生产 Linux 优化白名单》
  • 或者 按角色直接生成 Ansible / Shell 脚本

直接交付级别。

这个问题问得非常到位 👍 sysctl 只是“内核接口层”,真正的系统优化一定是「分层 + 分角色 + 分负载模型」的。

下面我按你的技术体系,不重复你已有配置,而是补充那些:

  • 很少被系统性整理
  • 但在生产环境非常关键
  • 且和你关注的数据库 / 容器 / 高并发 / 运维体系强相关

一、优化体系全景(先给结论)

Linux 性能与稳定性优化 = 6 个层次同时生效

硬件 / BIOS
内核(sysctl + scheduler + NUMA)
systemd / limits / cgroup
文件系统 / I/O 调度
网络协议栈(非 sysctl 部分)
应用进程级参数

你现在已经把 第二层(sysctl) 做到 90 分了,下面补的是剩下的 10 分 + 其它层


二、CPU & 调度器优化(常被忽略)

1️⃣ CPU 调频策略(极重要)

查看当前模式

cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

推荐配置

场景 governor
数据库 / Kafka performance
Web / Docker performance
省电 / 笔记本 powersave

设置方式(永久)

cpupower frequency-set -g performance

数据库节点不用 performance = 浪费 CPU 的说法是错的


2️⃣ 禁用 C-States(数据库 / 延迟敏感)

BIOS / Kernel 参数:

intel_idle.max_cstate=1
processor.max_cstate=1

作用:

  • 减少 CPU 唤醒延迟
  • 提升 P99 / P999 延迟稳定性

📌 MySQL / PostgreSQL / Kafka 非常推荐


3️⃣ IRQ 亲和性(你之前问过 irqbalance)

原则

场景 建议
通用服务器 irqbalance 开
数据库 / Kafka irqbalance 关 + 手动绑核
网卡转发 手动绑核

三、NUMA 深度优化(不是开关这么简单)

你已经配置了:

kernel.numa_balancing = 1

但还不够。


1️⃣ 数据库节点建议

建议
kernel.numa_balancing 关闭
numactl 明确绑定
BIOS NUMA 开

示例(PostgreSQL)

numactl --cpunodebind=0 --membind=0 postgres

2️⃣ Docker / K8S

  • 使用 cgroup 自动分配
  • 不要关闭 numa_balancing
  • 避免跨 NUMA 节点调度 Pod

四、内存层补充(防 OOM 的关键)

你已有 sysctl,但OOM 90% 不是 sysctl 引起的


1️⃣ systemd OOM 保护(极关键)

## /etc/systemd/system.conf
DefaultMemoryAccounting=yes
DefaultTasksAccounting=yes

2️⃣ 为关键服务设置硬限制

PostgreSQL

[Service]
MemoryMax=32G
OOMScoreAdjust=-900

Docker

[Service]
OOMScoreAdjust=-500

3️⃣ 关闭透明大页(THP)

echo never > /sys/kernel/mm/transparent_hugepage/enabled

几乎所有数据库 / Kafka 都推荐


五、文件系统 & I/O 层(sysctl 覆盖不到)

1️⃣ I/O 调度器选择

设备 推荐
SSD / NVMe none
HDD mq-deadline
echo none > /sys/block/nvme0n1/queue/scheduler

2️⃣ 挂载参数(数据库)

noatime,nodiratime,discard

3️⃣ 文件描述符限制(不是 fs.file-max)

## /etc/security/limits.conf
* soft nofile 1048576
* hard nofile 1048576

六、网络层“非 sysctl”优化

1️⃣ 网卡队列 & RPS/RFS

ethtool -L eth0 combined 16
echo ffffffff > /sys/class/net/eth0/queues/rx-0/rps_cpus

适合:

  • LVS
  • Nginx
  • Kafka

2️⃣ TCP Offload

ethtool -K eth0 gro on gso on tso on

七、容器 & K8S 专项建议

1️⃣ Docker daemon

{
  "log-driver": "json-file",
  "log-opts": { "max-size": "100m", "max-file": "3" },
  "exec-opts": ["native.cgroupdriver=systemd"]
}

2️⃣ K8S 节点

  • 关闭 swap(你已做)
  • 设置 kube-reserved / system-reserved
  • 生产环境启用 static CPU manager

八、不同角色的“终极建议表”

角色 关键优化
MySQL / PostgreSQL THP off、NUMA bind、irq 手动
Redis THP off、vm.overcommit
Kafka fd、network buffer、page cache
Docker / K8S conntrack、cgroup、IP forward
LVS RPS、ARP、irq
Nginx somaxconn、accept_mutex
Prometheus mmap、fd、I/O
GitLab / Jenkins fd、inotify、OOM

九、一句话收尾(给你做体系总结)

真正的 Linux 优化不是“调参数”,而是让 CPU、内存、I/O、网络、调度器各司其职。 sysctl 只是入口,systemd、NUMA、IRQ、I/O 才是稳定性的底座。

如果你愿意,下一步我可以直接帮你输出:

  • ☘️ 《Linux 生产级调优总表(按角色)》
  • 📦 每种服务一份 systemd + sysctl 成品配置
  • 🔍 OOM / 抖动 / 延迟的排查决策树

你可以直接拿去当团队标准。

好,这里我严格按你的指令执行

  • 主结构 =「回复 1(生产 Linux 优化白名单)」
  • 只从「回复 2」中补充「回复 1 没有覆盖,但有价值的内容」
  • 不重复、不堆参数、不混语言
  • 最终结果是一份:可直接作为团队规范的“终版白名单”

生产 Linux 优化白名单(终版)

目标: 稳定优先、可预测、可解释、可回滚 不追求极限 benchmark,只追求长期运行不出事故。


一、适用范围与原则(总纲)

适用系统

  • RHEL / AlmaLinux / Rocky Linux
  • Debian / Ubuntu(参数名一致的部分通用)

三个硬原则

  1. 角色优先于参数 数据库、容器、网络节点不能用同一套参数

  2. sysctl 不是万能 必须配合:

    • limits
    • systemd
    • NUMA / IRQ
    • 文件系统
  3. 能解释,才允许上线 任何参数必须回答两个问题:

    • 解决什么问题
    • 在什么场景下可能有副作用

二、内核参数(sysctl)白名单(你已有的,作为基线)

以下内容 你已经整理得非常完整,作为所有服务器的「基础层」。

分类说明

  • kernel.*:进程、NUMA、IPC
  • fs.*:文件句柄、inotify
  • net.core / net.ipv4:TCP 栈
  • net.netfilter:连接跟踪
  • vm.*:内存管理

⚠️ 原则: 基础节点只启用“安全 + 稳定”项,高负载项按角色覆盖


三、资源限制(limits)——【补充,回复 1 已有,保留】

全局文件描述符

## /etc/systemd/system.conf
DefaultLimitNOFILE=1048576
## /etc/security/limits.conf
* soft nofile 1048576
* hard nofile 1048576

进程数限制(防 fork 风暴)

* soft nproc 65535
* hard nproc 65535

四、systemd 行为约束(补充细化)

1️⃣ OOM 行为控制(数据库 / 中间件必做)

[Service]
OOMScoreAdjust=-900
MemoryAccounting=true

说明:

  • 防止 systemd 在内存压力下优先杀数据库
  • 比 sysctl 防 OOM 更可靠

2️⃣ journald 限制(避免 IO / 内存噪音)

SystemMaxUse=500M
RuntimeMaxUse=200M

3️⃣ 禁止 systemd 参与内存回收(数据库节点)

DefaultMemoryAccounting=no

五、CPU / NUMA / IRQ 策略(回复 1 主体 + 补充说明)

irqbalance 使用原则(明确版)

节点角色 irqbalance
MySQL / PostgreSQL 禁用
Redis 禁用
Kafka 禁用
容器节点 启用
Web / API 启用

原因:

  • 数据库追求 中断稳定性
  • 容器节点追求 均衡

CPU 调度策略(数据库 / 高负载)

echo performance > /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor

NUMA 策略(数据库)

kernel.numa_balancing = 0
vm.zone_reclaim_mode = 0

启动方式:

numactl --interleave=all

六、内存管理(补充细化)

1️⃣ Swap 策略(数据库专用)

vm.swappiness = 0

并在系统层面:

swapoff -a

2️⃣ 透明大页(数据库必禁)

echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag

3️⃣ vm.max_map_count(ES / Kafka)

vm.max_map_count = 262144

七、文件系统与 I/O(回复 2 中补充,回复 1 未完全展开)

I/O 调度器选择

磁盘类型 调度器
NVMe none
SSD mq-deadline
HDD bfq

文件系统挂载参数(数据库)

XFS(推荐)
noatime,nodiratime,logbufs=8,logbsize=256k
ext4
noatime,nodiratime,data=ordered

八、网络栈(非 sysctl 层补充)

1️⃣ 网卡多队列(高并发)

ethtool -L eth0 combined 16

2️⃣ 禁用网卡 offload(数据库)

ethtool -K eth0 gro off gso off tso off

九、容器 / K8S 专用补充(来自回复 2)

Docker daemon 日志限制

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m",
    "max-file": "3"
  }
}

Kubelet 资源预留

--kube-reserved=cpu=500m,memory=1Gi
--system-reserved=cpu=500m,memory=1Gi

十、按角色的“必须项”速查表(终版)

🟢 数据库节点(MySQL / PostgreSQL / MongoDB)

  • 禁用 swap
  • 禁用 irqbalance
  • 禁用 THP
  • OOMScoreAdjust
  • NUMA 交错
  • XFS + noatime
  • journald 限制

🟡 容器 / K8S 节点

  • ip_forward = 1
  • conntrack 调优
  • irqbalance 启用
  • kube-reserved
  • overlay2 日志限制

🔵 高并发网络节点(Nginx / LVS)

  • somaxconn
  • TCP 缓冲
  • 多队列网卡
  • arp_announce = 2

🔴 中间件 / 大数据(Kafka / ES)

  • 高 nofile
  • vm.max_map_count
  • 禁用 swap
  • OOM 保护
  • NUMA 感知

十一、一句可以写进规范首页的话

系统优化不是“把参数调满”,而是提前告诉内核: 谁重要,谁可以让步,谁绝不能被杀。


如果你愿意,下一步我可以直接帮你做三件事之一(任选):

  1. 拆成 /etc/sysctl.d/ 按角色文件
  2. 生成 数据库 / 容器 / 网络 三套落地模板
  3. 转成 Ansible Role / Shell 一键初始化

你这套内容,已经是准运维教材级别了。