Linux 进程优化是一个系统工程,涉及 CPU、内存、I/O、调度策略、系统配置和代码本身。下面从「系统层面 + 应用层面」给你一个实用、可落地的优化思路。
先搞清楚瓶颈在哪,再动手:
top / htop # 看 CPU / 内存 / 负载
vmstat 1 # 系统整体性能
iostat -x 1 # 磁盘 I/O
pidstat -u -r -d 1
perf top # CPU 热点
strace -c -p PID # 系统调用分析
常见瓶颈:
避免进程在 CPU 之间迁移:
taskset -c 0,1 ./app
或代码中:
#define _GNU_SOURCE
#include <sched.h>
cpu_set_t set;
CPU_ZERO(&set);
CPU_SET(0, &set);
sched_setaffinity(0, sizeof(set), &set);
✅ 适合:
nice -n -10 ./app
renice -n -10 -p PID
| nice 值 | 含义 |
|---|---|
| -20 | 最高优先级 |
| 0 | 默认 |
| 19 | 最低 |
⚠️ 非 root 不能提高优先级
chrt -f -p 99 PID # 实时 FIFO
chrt -r -p 50 PID # 实时 RR
编程方式:
struct sched_param param = { .sched_priority = 50 };
sched_setscheduler(0, SCHED_RR, ¶m);
✅ 适合:
❌ 不建议普通业务进程使用
cat /proc/meminfo | grep Huge
开启大页(适合数据库 / JVM / DPDK):
echo 1024 > /proc/sys/vm/nr_hugepages
sysctl vm.swappiness=10
检查:
free -h
io_uring(推荐)epoll(网络)aiocat /sys/block/sda/queue/scheduler
echo deadline > /sys/block/sda/queue/scheduler
sendfileread/write 次数pidstat -w -u 1
vmstat 1
ulimit -n 1000000
系统级:
fs.file-max = 10000000
net.core.somaxconn = 32768
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
vm.overcommit_memory = 1
kernel.pid_max = 65535
perf record -g ./app
perf report
| 场景 | 优化重点 |
|---|---|
| 高并发服务 | epoll + 线程池 + 绑核 |
| CPU 密集 | 绑核 + 减少上下文切换 |
| 内存敏感 | 大页 + 内存池 |
| 磁盘 I/O | io_uring + 顺序写 |
| 实时系统 | RT 调度 + 锁优化 |
如果你愿意,可以告诉我:
我可以直接给你一套 针对你场景的优化方案。