2. 测试环境搭建:硬件选型、网络拓扑、操作系统参数调优
好,咱们进入第二章。上一章我们聊了为什么要做压力测试,以及压测的核心指标。这一章,咱们得把「战场」给搭起来。
环境搭建这事儿,说简单也简单,不就是几台机器连上网嘛。但说复杂,它真能坑死人。我见过太多团队,压测结果一塌糊涂,最后发现不是系统不行,是环境没搭对。嗯,咱们今天就把这块掰开揉碎了讲。
2.1 硬件选型:别让硬件拖了后腿
硬件选型,说白了就是「配机器」。但怎么配,这里头有讲究。
CPU:核心数比主频更重要
交易系统是典型的并发密集型应用。你想想看,成千上万的订单同时涌进来,CPU 得能扛得住上下文切换。我个人习惯,压测机(发压端)用高频 CPU,比如 4.0GHz 以上,因为要模拟大量客户请求。而被测系统(交易核心),我更看重核心数。48核、64核,不嫌多。
内存:越大越好,但别浪费
内存这东西,多多益善。交易系统的核心数据(订单簿、持仓、资金)都在内存里。我建议至少 128GB 起步。但要注意,不是内存大就万事大吉。JVM 的堆内存设置、GC 策略,都得跟上。否则,内存再大,频繁 Full GC 也能让你系统卡死。
网卡:万兆是标配
交易系统对网络延迟极其敏感。千兆网卡?那是上个时代的东西了。现在至少万兆(10GbE),甚至 25GbE、40GbE。我建议用 Intel 或 Mellanox 的网卡,驱动成熟,性能稳定。另外,记得开启网卡的 RSS(Receive Side Scaling)和 RPS(Receive Packet Steering),让多个 CPU 核心分担网络中断处理。
磁盘:SSD 是底线
虽然交易数据主要在内存,但日志、持久化、历史数据查询,都离不开磁盘。别用机械盘,那是给自己找麻烦。NVMe SSD 是首选。我建议用 RAID 10,兼顾性能和冗余。
| 组件 | 推荐配置 | 说明 |
|---|---|---|
| CPU | 64核以上(被测系统) | 核心数优先,主频 2.5GHz+ |
| 内存 | 256GB+ | JVM 堆内存分配 128GB+ |
| 网卡 | 万兆(10GbE) | 支持 RSS/RPS,多队列 |
| 磁盘 | NVMe SSD,RAID 10 | 日志盘与数据盘分离 |
2.2 网络拓扑:延迟的源头
网络拓扑,说白了就是机器之间怎么连。很多团队忽略这个,结果压测数据里混入了网络延迟,根本没法分析。
物理拓扑:尽量扁平化
我建议用两层架构:核心交换机 + 接入交换机。压测机和被测系统都接到同一台接入交换机上,减少跳数。如果条件允许,直接用一台万兆交换机,把所有机器都连上去。跳数越少,延迟越低。
逻辑拓扑:隔离是关键
压测流量和业务流量必须隔离。我见过有人把压测环境搭在生产网络里,结果压测流量把生产网络打爆了。嗯,这是血的教训。建议用独立的 VLAN 或物理网络。
延迟测试:先测网络
在开始压测之前,先测一下网络延迟。用 ping 或者更专业的 sockperf。我要求压测机到被测系统的延迟不超过 0.1ms。如果超过,先排查网络问题,再谈压测。
# 测试网络延迟
sockperf pp --tcp -i 192.168.1.100 -p 8080 --time 10
2.3 操作系统参数调优:把内核调教好
操作系统是地基。地基不稳,上面盖的楼再漂亮也没用。Linux 内核默认参数是为通用场景优化的,交易系统这种高并发、低延迟的场景,必须调优。
文件描述符限制
交易系统要处理大量连接,文件描述符很容易耗尽。我建议把 ulimit -n 设置到 100 万以上。
# /etc/security/limits.conf
* soft nofile 1048576
* hard nofile 1048576
网络参数调优
这里有几个关键参数,我一个个说。
- net.core.somaxconn:监听队列长度。默认 128,太少了。我建议设成 65535。
- net.ipv4.tcp_tw_reuse:允许重用 TIME_WAIT 状态的 socket。交易系统短连接多,这个必须开。
- net.ipv4.tcp_fin_timeout:FIN_WAIT2 状态的超时时间。默认 60 秒,我建议改成 30 秒。
- net.core.rmem_max / wmem_max:接收/发送缓冲区最大值。建议设成 16MB。
# /etc/sysctl.conf
net.core.somaxconn = 65535
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
tcp_tw_reuse 后,发现连接复用导致数据错乱。后来排查发现是应用层没有正确处理连接复用。所以,调优参数要结合应用层代码一起看,别盲目改。
CPU 调优:隔离与亲和性
交易系统的核心线程,应该绑定到固定的 CPU 核心上,避免被其他进程干扰。这就是 CPU 亲和性(CPU Affinity)。
我建议用 taskset 或 cset 工具。比如,把交易核心进程绑定到 CPU 0-15 号核心上。
# 绑定进程到指定 CPU
taskset -c 0-15 java -jar trading-core.jar
另外,关闭 CPU 的节能模式(如 Intel 的 C-States、P-States),避免 CPU 频率动态变化导致延迟抖动。
# 关闭 CPU 节能(需要 root 权限)
cpupower frequency-set -g performance
内存调优:大页与透明大页
交易系统通常使用大页(HugePages)来减少 TLB Miss。我建议分配 2MB 或 1GB 的大页。
# 分配 1024 个 2MB 的大页
echo 1024 > /proc/sys/vm/nr_hugepages
但是,关闭透明大页(Transparent HugePages)。透明大页是内核自动管理的,容易导致内存碎片和延迟抖动。我踩过这个坑,压测时延迟突然飙升,查了半天发现是透明大页在后台做内存整理。
# 关闭透明大页
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
2.4 一张图看懂环境搭建
说了这么多,咱们用一张图来总结一下。这张图展示了压测环境的核心组件和它们之间的关系。
2.5 避坑指南:我踩过的那些坑
最后,分享几个我亲身经历过的坑,希望能帮你少走弯路。
- 坑一:压测机性能不足。 我曾经用一台 16 核的机器去压 64 核的被测系统。结果压测机自己先扛不住了,请求发不出去,压测结果惨不忍睹。后来换了 128 核的压测机,问题才解决。
- 坑二:网络延迟没提前测。 有一次压测,发现延迟忽高忽低。排查了半天,发现是交换机端口协商成了千兆。提前测一下网络延迟,这种问题早就能发现。
- 坑三:透明大页没关。 这个我前面提过。压测时延迟突然飙升,查了三天,最后发现是透明大页在后台做内存整理。关了之后,延迟立刻稳定了。
- 坑四:文件描述符没改。 压测到一半,系统报错 "Too many open files"。嗯,这种低级错误,我犯过一次就再也没犯过。
环境搭建,说白了就是「把基础打牢」。硬件、网络、操作系统,每一个环节都不能马虎。你想想看,如果地基是歪的,你后面做的所有调优,都可能是白费功夫。
好,这一章就到这里。下一章,咱们聊聊压测工具的选择和脚本编写。到时候见。