[TOC]
- 安装 wrk wrk 是一个现代的高性能 HTTP 压测工具,使用了多线程和事件驱动(如 epoll)模型,能很好地利用多核CPU。
Ubuntu/Debian:
bash sudo apt update sudo apt install wrk CentOS/RHEL/Fedora: 需要先安装编译工具,然后从源码编译。
bash
sudo yum groupinstall 'Development Tools' sudo yum install openssl-devel sudo yum install git
sudo dnf groupinstall 'Development Tools' sudo dnf install openssl-devel git
git clone https://github.com/wg/wrk.git cd wrk make
sudo cp wrk /usr/local/bin/ 2. 安装 ab (Apache Benchmark) ab 是 Apache HTTP 服务器项目的一部分,通常随 apache2-utils 或 httpd-tools 包提供。
Ubuntu/Debian:
bash sudo apt update sudo apt install apache2-utils CentOS/RHEL/Fedora:
bash
sudo yum install httpd-tools
sudo dnf install httpd-tools 3. 安装 hey hey 是用 Go 语言编写的现代压测工具,是 ab 的替代品。你需要先安装 Go,然后用 go install 安装。
方法一:使用 Go (推荐,总能获取最新版)
bash
从 https://go.dev/dl/ 获取最新版本链接,例如: wget https://go.dev/dl/go1.21.4.linux-amd64.tar.gz sudo tar -C /usr/local -xzf go1.21.4.linux-amd64.tar.gz
echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc source ~/.bashrc
go install github.com/rakyll/hey@latest
可以将其移动到全局路径
sudo cp $HOME/go/bin/hey /usr/local/bin/方法二:直接下载预编译二进制文件(更简单) 去 hey 的 GitHub Release 页面 下载对应的 Linux 二进制文件,然后赋予执行权限即可。
wget https://github.com/rakyll/hey/releases/download/v0.1.4/hey_linux_amd64
chmod +x hey_linux_amd64
sudo mv hey_linux_amd64 /usr/local/bin/hey第二部分:更优的综合测试方案(显示内存、CPU等) 你提到的工具(wrk, ab, hey)主要专注于生成负载和报告 吞吐量 (QPS)、延迟 (Latency) 等网络指标。它们本身不监控被测试服务进程的系统资源(如内存、CPU)。
标准且强大的方法是:将压测工具和系统监控工具结合使用。
方案 1:使用 top / htop + 压测工具(简单直观) 最简单的方法是在另一个终端窗口运行 top 或 htop,专注于你的服务进程。
在第一个终端启动你的服务,并记录其 PID(进程ID)。
./your-server-app &
echo $! # 这会输出上一个后台进程的PID,记下它
# 或者用 ps 查找
ps aux | grep your-server-app
在第二个终端运行 top 并指定 PID,实时观察该进程的 CPU 和内存使用情况。
bash
top -p <YOUR_SERVER_PID>
或者使用更美观的 htop(需要安装:sudo apt install htop):
bash
htop -p <YOUR_SERVER_PID>
在第三个终端运行压测命令,例如:
bash
wrk -t12 -c400 -d30s http://localhost:8080/
观察:在压测期间,第二个终端里的 top/htop 会实时显示你的服务进程的 CPU 和内存占用率。
方案 2:使用 vmstat / pidstat(更专业的系统级监控)
这些工具可以提供更精细的系统资源数据。
vmstat: 监控整个系统的进程、内存、分页、块IO、陷阱(中断)和CPU活动。
bash
# 每1秒刷新一次,共刷新100次
vmstat 1 100
重点关注 us(用户CPU时间)、sy(系统CPU时间)、id(空闲CPU时间)、free(空闲内存)、swpd(虚拟内存使用)。
pidstat (来自 sysstat 包): 专门用于监控单个进程,非常强大!
bash
# 安装 sysstat
sudo apt install sysstat
# 监控特定进程的CPU(每1秒一次,共30次)
pidstat -p <YOUR_SERVER_PID> 1 30
# 监控特定进程的内存(每1秒一次,共30次)
pidstat -p <YOUR_SERVER_PID> -r 1 30
# 综合监控(CPU、内存、磁盘等)
pidstat -p <YOUR_SERVER_PID> -urd -h 1 30
在压测期间运行上述 pidstat 命令,可以得到一份完整的进程资源使用报告。方案 3:使用 Prometheus + Grafana(现代化、可视化、持久化) 这是生产环境的标准方案,功能最强大,可以实时可视化并保存历史数据。
在你的服务中集成 Prometheus 客户端库(Go、Java、Python等语言都有),暴露一个 /metrics 端点。
下载并运行 Prometheus,配置它去抓取你的服务。
下载并运行 Grafana,连接 Prometheus 数据源,然后制作精美的仪表盘(Dashboard)。
压测时,打开 Grafana 仪表盘,你可以实时看到:
CPU 使用率
内存使用量(Heap、Stack、RSS)
垃圾回收(GC)频率和耗时(对Go/Java非常重要)
Goroutine/Thread 数量
QPS、延迟
... 任何你关心的指标
这套方案搭建稍复杂,但它是进行长期性能监控和分析的黄金标准。
第三部分:内存泄漏专项检查 压力测试可以暴露内存泄漏(表现为内存在压测期间持续增长,压测结束后也不下降),但要定位泄漏的根源,需要更专业的工具。
- 语言内置工具 Go: 使用 pprof。在服务中导入 net/http/pprof 包,它会自动注册一系列调试端点。然后可以用 go tool pprof 工具连接分析。
bash
go tool pprof http://localhost:8080/debug/pprof/heap?seconds=30
Java: 使用 jmap 和 jstack。
bash
jmap -dump:live,format=b,file=heapdump.hprof
Python: 使用 objgraph, meliae, tracemalloc 等库。
- 通用系统工具:Valgrind Valgrind 是一个强大的内存调试和分析工具,特别适用于 C/C++ 程序,但对其他语言(如Python的解释器)也有效。
bash
sudo apt install valgrind
valgrind --tool=massif ./your-server-app
valgrind --leak-check=full --show-leak-kinds=all ./your-server-app 运行后会生成一个 massif.out. 文件,可以用 ms_print 工具查看分析结果。