在 Linux 环境下 C++ 程序卡顿通常不是单一原因,而是 CPU、内存、I/O、系统调度、锁、库或架构设计 等多个方面共同作用的结果。下面我按常见原因 → 排查方法 → 解决思路系统说明。
top 中看到 CPU 100% 或 sys 占比高| 原因 | 说明 |
|---|---|
| 死循环 / 忙等 | while(true) 没 sleep |
| 大量计算 | O(n²) 或更高复杂度 |
| 频繁系统调用 | 如 sleep(0)、gettimeofday() |
| 上下文切换过多 | 线程太多 |
top
htop
perf top -p <pid>
perf 找热点函数free -h 看到 swap 使用| 原因 | 说明 |
|---|---|
| 内存泄漏 | 长期运行后变慢 |
| 频繁 new/delete | 堆碎片 |
| swap 抖动 | 内存不足 |
| vector 频繁扩容 | push_back 导致拷贝 |
valgrind --tool=memcheck ./app
heaptrack ./app
reserve()| 原因 | 说明 |
|---|---|
| 锁竞争 | mutex 被频繁争抢 |
| 死锁 | 两个线程互相等待 |
| 锁粒度太大 | 一个锁保护太多数据 |
| 条件变量误用 | 虚假唤醒 |
gdb attach <pid>
thread apply all bt
std::atomictop 中状态为 D| 原因 | 说明 |
|---|---|
| 同步磁盘读写 | 未用 buffer |
| 网络阻塞 | recv/send 阻塞 |
| 日志写磁盘 | 频繁 flush |
iostat -x 1
strace -p <pid>
epoll| 原因 | 说明 |
|---|---|
| nice 值太低 | 被调度少 |
| cgroup 限制 | 容器/云环境 |
| NUMA | 跨节点访问慢 |
chrt -p <pid>
numactl --hardware
| 原因 | 说明 |
|---|---|
| glibc malloc | 高并发下性能差 |
| 调试版本 | -O0 -g |
| 动态库加载 | dlopen 慢 |
| 旧内核 | epoll/调度问题 |
jemalloc / tcmalloc-O21. top / htop → CPU / 内存 / IO 状态
2. strace → 系统调用是否阻塞
3. perf top → 热点函数
4. gdb → 是否死锁
5. valgrind → 内存问题
❌ 频繁 new/delete
❌ 大锁保护小数据
❌ 同步日志写磁盘
❌ 阻塞 recv
❌ vector 无 reserve
❌ 忽略返回值
✅ 使用对象池
✅ 使用 atomic
✅ 使用 epoll / io_uring
✅ 使用 perf 分析
你可以直接贴出以下信息之一:
top / htop 截图perf top 输出我可以 精准判断是哪一种卡顿,并给出修改方案。