Skip to content

Latest commit

 

History

History
188 lines (137 loc) · 6.24 KB

File metadata and controls

188 lines (137 loc) · 6.24 KB

[TOC]

  1. 安装 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

或使用 dnf (Fedora/newer CentOS)

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

CentOS/RHEL

sudo yum install httpd-tools

Fedora

sudo dnf install httpd-tools 3. 安装 hey hey 是用 Go 语言编写的现代压测工具,是 ab 的替代品。你需要先安装 Go,然后用 go install 安装。

方法一:使用 Go (推荐,总能获取最新版)

bash

1. 首先安装 Go (如果尚未安装)

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

2. 将 Go 二进制文件路径添加到 PATH

echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc source ~/.bashrc

3. 安装 hey

go install github.com/rakyll/hey@latest

安装后,可执行文件会在 $HOME/go/bin/hey

可以将其移动到全局路径

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、延迟

... 任何你关心的指标

这套方案搭建稍复杂,但它是进行长期性能监控和分析的黄金标准。

第三部分:内存泄漏专项检查 压力测试可以暴露内存泄漏(表现为内存在压测期间持续增长,压测结束后也不下降),但要定位泄漏的根源,需要更专业的工具。

  1. 语言内置工具 Go: 使用 pprof。在服务中导入 net/http/pprof 包,它会自动注册一系列调试端点。然后可以用 go tool pprof 工具连接分析。

bash

抓取30秒的堆内存profile

go tool pprof http://localhost:8080/debug/pprof/heap?seconds=30

在pprof交互界面中使用 toplist <function_name> 等命令查看细节

Java: 使用 jmap 和 jstack。

bash

生成堆转储(Heap Dump)

jmap -dump:live,format=b,file=heapdump.hprof

然后用 Eclipse MAT 或 JVisualVM 分析 heapdump.hprof 文件。

Python: 使用 objgraph, meliae, tracemalloc 等库。

  1. 通用系统工具:Valgrind Valgrind 是一个强大的内存调试和分析工具,特别适用于 C/C++ 程序,但对其他语言(如Python的解释器)也有效。

bash

安装

sudo apt install valgrind

使用 Massif 工具分析内存使用

valgrind --tool=massif ./your-server-app

使用 Memcheck 工具检测内存泄漏

valgrind --leak-check=full --show-leak-kinds=all ./your-server-app 运行后会生成一个 massif.out. 文件,可以用 ms_print 工具查看分析结果。