性能优化
下面这份内容,我会刻意避开你已经整理过的 sysctl 参数,只补充那些:
- 你现在这套配置没有覆盖
- 在生产环境中经常被忽略,但非常关键
- 必须按场景区分,否则会出问题
并且我会按你一贯偏好的方式来写: 结论先行 + 场景化 + 可落地,不做中英文混搭。
系统性能 ≠ 只靠 sysctl
真正稳定高性能的 Linux,至少包含 5 个层面:
- 内核参数(sysctl)
- 资源限制(limits / cgroup)
- systemd 行为
- 调度与中断(CPU / NUMA / IRQ)
- 文件系统与 I/O
你前面已经把 第 1 层 做得非常完整了,下面重点补 2–5 层。
## /etc/systemd/system.conf
DefaultLimitNOFILE=1048576
## /etc/security/limits.conf
* soft nofile 1048576
* hard nofile 1048576
| 服务 | 必须 |
|---|---|
| Nginx | ✅ |
| MySQL / PostgreSQL | ✅ |
| Redis | ✅ |
| Kafka | ✅ |
| Prometheus | ✅ |
## /etc/security/limits.conf
* soft nproc 65535
* hard nproc 65535
适合:
- Jenkins
- GitLab
- 编译机
- CI 节点
[Service]
OOMScoreAdjust=-900
MemoryAccounting=true
| 服务 | 建议 |
|---|---|
| MySQL / PostgreSQL | 必须 |
| Redis | 必须 |
| Elasticsearch | 必须 |
## /etc/systemd/system.conf
DefaultMemoryAccounting=no
防止 systemd 误判缓存为可回收内存。
## /etc/systemd/journald.conf
SystemMaxUse=500M
RuntimeMaxUse=200M
| 场景 | irqbalance |
|---|---|
| MySQL / PostgreSQL | ❌ 关闭 |
| Redis | ❌ 关闭 |
| Kafka | ❌ 关闭 |
| 容器节点 | ✅ 保留 |
| Web | ✅ |
echo performance > /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
kernel.numa_balancing = 0
vm.zone_reclaim_mode = 0
numactl --interleave=all
cat /sys/block/nvme0n1/queue/scheduler
## 选择
none
mq-deadline
noatime,nodiratime,logbufs=8,logbsize=256k
noatime,nodiratime,data=ordered
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
ethtool -L eth0 combined 16
适合:
- Nginx
- LVS
- Kafka
ethtool -K eth0 gro off gso off tso off
(数据库节点尤其重要)
{
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
},
"storage-driver": "overlay2"
}
--kube-reserved=cpu=500m,memory=1Gi
--system-reserved=cpu=500m,memory=1Gi
- 禁用 swap
- 关闭 irqbalance
- 禁用 THP
- 设置 OOMScoreAdjust
- NUMA 交错
- XFS + noatime
- systemd 限制 journald
- ip_forward = 1
- rp_filter = 0
- conntrack 调优
- irqbalance 开启
- kube-reserved
- 多队列网卡
- 增大 somaxconn
- TCP 缓冲
- arp_announce = 2
- 高 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 分 + 其它层。
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
| 场景 | governor |
|---|---|
| 数据库 / Kafka | performance |
| Web / Docker | performance |
| 省电 / 笔记本 | powersave |
cpupower frequency-set -g performance
数据库节点不用 performance = 浪费 CPU 的说法是错的
BIOS / Kernel 参数:
intel_idle.max_cstate=1
processor.max_cstate=1
作用:
- 减少 CPU 唤醒延迟
- 提升 P99 / P999 延迟稳定性
📌 MySQL / PostgreSQL / Kafka 非常推荐
| 场景 | 建议 |
|---|---|
| 通用服务器 | irqbalance 开 |
| 数据库 / Kafka | irqbalance 关 + 手动绑核 |
| 网卡转发 | 手动绑核 |
你已经配置了:
kernel.numa_balancing = 1
但还不够。
| 项 | 建议 |
|---|---|
| kernel.numa_balancing | 关闭 |
| numactl | 明确绑定 |
| BIOS | NUMA 开 |
numactl --cpunodebind=0 --membind=0 postgres
- 使用 cgroup 自动分配
- 不要关闭 numa_balancing
- 避免跨 NUMA 节点调度 Pod
你已有 sysctl,但OOM 90% 不是 sysctl 引起的。
## /etc/systemd/system.conf
DefaultMemoryAccounting=yes
DefaultTasksAccounting=yes
[Service]
MemoryMax=32G
OOMScoreAdjust=-900
[Service]
OOMScoreAdjust=-500
echo never > /sys/kernel/mm/transparent_hugepage/enabled
几乎所有数据库 / Kafka 都推荐
| 设备 | 推荐 |
|---|---|
| SSD / NVMe | none |
| HDD | mq-deadline |
echo none > /sys/block/nvme0n1/queue/scheduler
noatime,nodiratime,discard
## /etc/security/limits.conf
* soft nofile 1048576
* hard nofile 1048576
ethtool -L eth0 combined 16
echo ffffffff > /sys/class/net/eth0/queues/rx-0/rps_cpus
适合:
- LVS
- Nginx
- Kafka
ethtool -K eth0 gro on gso on tso on
{
"log-driver": "json-file",
"log-opts": { "max-size": "100m", "max-file": "3" },
"exec-opts": ["native.cgroupdriver=systemd"]
}
- 关闭 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 没有覆盖,但有价值的内容」
- 不重复、不堆参数、不混语言
- 最终结果是一份:可直接作为团队规范的“终版白名单”
目标: 稳定优先、可预测、可解释、可回滚 不追求极限 benchmark,只追求长期运行不出事故。
- RHEL / AlmaLinux / Rocky Linux
- Debian / Ubuntu(参数名一致的部分通用)
-
角色优先于参数 数据库、容器、网络节点不能用同一套参数
-
sysctl 不是万能 必须配合:
- limits
- systemd
- NUMA / IRQ
- 文件系统
-
能解释,才允许上线 任何参数必须回答两个问题:
- 解决什么问题
- 在什么场景下可能有副作用
以下内容 你已经整理得非常完整,作为所有服务器的「基础层」。
- kernel.*:进程、NUMA、IPC
- fs.*:文件句柄、inotify
- net.core / net.ipv4:TCP 栈
- net.netfilter:连接跟踪
- vm.*:内存管理
⚠️ 原则: 基础节点只启用“安全 + 稳定”项,高负载项按角色覆盖
## /etc/systemd/system.conf
DefaultLimitNOFILE=1048576
## /etc/security/limits.conf
* soft nofile 1048576
* hard nofile 1048576
* soft nproc 65535
* hard nproc 65535
[Service]
OOMScoreAdjust=-900
MemoryAccounting=true
说明:
- 防止 systemd 在内存压力下优先杀数据库
- 比 sysctl 防 OOM 更可靠
SystemMaxUse=500M
RuntimeMaxUse=200M
DefaultMemoryAccounting=no
| 节点角色 | irqbalance |
|---|---|
| MySQL / PostgreSQL | 禁用 |
| Redis | 禁用 |
| Kafka | 禁用 |
| 容器节点 | 启用 |
| Web / API | 启用 |
原因:
- 数据库追求 中断稳定性
- 容器节点追求 均衡
echo performance > /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
kernel.numa_balancing = 0
vm.zone_reclaim_mode = 0
启动方式:
numactl --interleave=all
vm.swappiness = 0
并在系统层面:
swapoff -a
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
vm.max_map_count = 262144
| 磁盘类型 | 调度器 |
|---|---|
| NVMe | none |
| SSD | mq-deadline |
| HDD | bfq |
noatime,nodiratime,logbufs=8,logbsize=256k
noatime,nodiratime,data=ordered
ethtool -L eth0 combined 16
ethtool -K eth0 gro off gso off tso off
{
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
}
}
--kube-reserved=cpu=500m,memory=1Gi
--system-reserved=cpu=500m,memory=1Gi
- 禁用 swap
- 禁用 irqbalance
- 禁用 THP
- OOMScoreAdjust
- NUMA 交错
- XFS + noatime
- journald 限制
- ip_forward = 1
- conntrack 调优
- irqbalance 启用
- kube-reserved
- overlay2 日志限制
- somaxconn
- TCP 缓冲
- 多队列网卡
- arp_announce = 2
- 高 nofile
- vm.max_map_count
- 禁用 swap
- OOM 保护
- NUMA 感知
系统优化不是“把参数调满”,而是提前告诉内核: 谁重要,谁可以让步,谁绝不能被杀。
如果你愿意,下一步我可以直接帮你做三件事之一(任选):
- 拆成 /etc/sysctl.d/ 按角色文件
- 生成 数据库 / 容器 / 网络 三套落地模板
- 转成 Ansible Role / Shell 一键初始化
你这套内容,已经是准运维教材级别了。