$npx -y skills add chaterm/terminal-skills --skill benchmarking性能基准测试
| 1 | # 性能基准测试 |
| 2 | |
| 3 | ## 概述 |
| 4 | 压力测试、基准测试工具使用技能。 |
| 5 | |
| 6 | ## sysbench |
| 7 | |
| 8 | ### 安装 |
| 9 | ```bash |
| 10 | # Debian/Ubuntu |
| 11 | apt install sysbench |
| 12 | |
| 13 | # CentOS/RHEL |
| 14 | yum install sysbench |
| 15 | ``` |
| 16 | |
| 17 | ### CPU 测试 |
| 18 | ```bash |
| 19 | # 单线程 |
| 20 | sysbench cpu run |
| 21 | |
| 22 | # 多线程 |
| 23 | sysbench cpu --threads=4 run |
| 24 | |
| 25 | # 指定时间 |
| 26 | sysbench cpu --threads=4 --time=60 run |
| 27 | ``` |
| 28 | |
| 29 | ### 内存测试 |
| 30 | ```bash |
| 31 | # 顺序读写 |
| 32 | sysbench memory run |
| 33 | |
| 34 | # 随机读写 |
| 35 | sysbench memory --memory-access-mode=rnd run |
| 36 | |
| 37 | # 指定大小 |
| 38 | sysbench memory --memory-block-size=1M --memory-total-size=10G run |
| 39 | ``` |
| 40 | |
| 41 | ### 磁盘 IO 测试 |
| 42 | ```bash |
| 43 | # 准备测试文件 |
| 44 | sysbench fileio --file-total-size=10G prepare |
| 45 | |
| 46 | # 随机读写 |
| 47 | sysbench fileio --file-total-size=10G --file-test-mode=rndrw run |
| 48 | |
| 49 | # 顺序读 |
| 50 | sysbench fileio --file-total-size=10G --file-test-mode=seqrd run |
| 51 | |
| 52 | # 清理 |
| 53 | sysbench fileio --file-total-size=10G cleanup |
| 54 | ``` |
| 55 | |
| 56 | ### MySQL 测试 |
| 57 | ```bash |
| 58 | # 准备数据 |
| 59 | sysbench oltp_read_write --mysql-host=localhost --mysql-user=root \ |
| 60 | --mysql-password=pass --mysql-db=test --tables=10 --table-size=100000 prepare |
| 61 | |
| 62 | # 运行测试 |
| 63 | sysbench oltp_read_write --mysql-host=localhost --mysql-user=root \ |
| 64 | --mysql-password=pass --mysql-db=test --tables=10 --table-size=100000 \ |
| 65 | --threads=16 --time=60 run |
| 66 | |
| 67 | # 清理 |
| 68 | sysbench oltp_read_write --mysql-host=localhost --mysql-user=root \ |
| 69 | --mysql-password=pass --mysql-db=test cleanup |
| 70 | ``` |
| 71 | |
| 72 | ## fio 磁盘测试 |
| 73 | |
| 74 | ### 基础测试 |
| 75 | ```bash |
| 76 | # 顺序读 |
| 77 | fio --name=seqread --rw=read --bs=1M --size=1G --numjobs=1 --runtime=60 |
| 78 | |
| 79 | # 顺序写 |
| 80 | fio --name=seqwrite --rw=write --bs=1M --size=1G --numjobs=1 --runtime=60 |
| 81 | |
| 82 | # 随机读 |
| 83 | fio --name=randread --rw=randread --bs=4k --size=1G --numjobs=4 --runtime=60 |
| 84 | |
| 85 | # 随机写 |
| 86 | fio --name=randwrite --rw=randwrite --bs=4k --size=1G --numjobs=4 --runtime=60 |
| 87 | |
| 88 | # 混合读写 |
| 89 | fio --name=randrw --rw=randrw --bs=4k --size=1G --numjobs=4 --rwmixread=70 --runtime=60 |
| 90 | ``` |
| 91 | |
| 92 | ### 配置文件 |
| 93 | ```ini |
| 94 | # test.fio |
| 95 | [global] |
| 96 | ioengine=libaio |
| 97 | direct=1 |
| 98 | runtime=60 |
| 99 | time_based |
| 100 | |
| 101 | [seqread] |
| 102 | rw=read |
| 103 | bs=1M |
| 104 | size=1G |
| 105 | |
| 106 | [randread] |
| 107 | rw=randread |
| 108 | bs=4k |
| 109 | size=1G |
| 110 | numjobs=4 |
| 111 | ``` |
| 112 | |
| 113 | ```bash |
| 114 | fio test.fio |
| 115 | ``` |
| 116 | |
| 117 | ## HTTP 压测 |
| 118 | |
| 119 | ### ab (Apache Bench) |
| 120 | ```bash |
| 121 | # 基础测试 |
| 122 | ab -n 1000 -c 100 http://localhost/ |
| 123 | |
| 124 | # 带 Keep-Alive |
| 125 | ab -n 1000 -c 100 -k http://localhost/ |
| 126 | |
| 127 | # POST 请求 |
| 128 | ab -n 1000 -c 100 -p data.json -T application/json http://localhost/api |
| 129 | ``` |
| 130 | |
| 131 | ### wrk |
| 132 | ```bash |
| 133 | # 基础测试 |
| 134 | wrk -t4 -c100 -d30s http://localhost/ |
| 135 | |
| 136 | # 带脚本 |
| 137 | wrk -t4 -c100 -d30s -s post.lua http://localhost/api |
| 138 | ``` |
| 139 | |
| 140 | ### hey |
| 141 | ```bash |
| 142 | # 基础测试 |
| 143 | hey -n 1000 -c 100 http://localhost/ |
| 144 | |
| 145 | # 指定时间 |
| 146 | hey -z 30s -c 100 http://localhost/ |
| 147 | |
| 148 | # POST 请求 |
| 149 | hey -n 1000 -c 100 -m POST -d '{"key":"value"}' http://localhost/api |
| 150 | ``` |
| 151 | |
| 152 | ## 网络测试 |
| 153 | |
| 154 | ### iperf3 |
| 155 | ```bash |
| 156 | # 服务端 |
| 157 | iperf3 -s |
| 158 | |
| 159 | # 客户端 |
| 160 | iperf3 -c server_ip |
| 161 | |
| 162 | # UDP 测试 |
| 163 | iperf3 -c server_ip -u -b 1G |
| 164 | |
| 165 | # 双向测试 |
| 166 | iperf3 -c server_ip -d |
| 167 | |
| 168 | # 多线程 |
| 169 | iperf3 -c server_ip -P 4 |
| 170 | ``` |
| 171 | |
| 172 | ### netperf |
| 173 | ```bash |
| 174 | # 服务端 |
| 175 | netserver |
| 176 | |
| 177 | # TCP 吞吐 |
| 178 | netperf -H server_ip |
| 179 | |
| 180 | # TCP 延迟 |
| 181 | netperf -H server_ip -t TCP_RR |
| 182 | ``` |
| 183 | |
| 184 | ## 常见场景 |
| 185 | |
| 186 | ### 场景 1:服务器基准测试 |
| 187 | ```bash |
| 188 | #!/bin/bash |
| 189 | echo "=== CPU 测试 ===" |
| 190 | sysbench cpu --threads=$(nproc) --time=30 run |
| 191 | |
| 192 | echo "=== 内存测试 ===" |
| 193 | sysbench memory --threads=$(nproc) --time=30 run |
| 194 | |
| 195 | echo "=== 磁盘测试 ===" |
| 196 | fio --name=test --rw=randrw --bs=4k --size=1G --runtime=30 --time_based |
| 197 | ``` |
| 198 | |
| 199 | ### 场景 2:数据库基准 |
| 200 | ```bash |
| 201 | #!/bin/bash |
| 202 | # MySQL OLTP 测试 |
| 203 | sysbench oltp_read_write \ |
| 204 | --mysql-host=localhost \ |
| 205 | --mysql-user=root \ |
| 206 | --mysql-password=pass \ |
| 207 | --mysql-db=sbtest \ |
| 208 | --tables=10 \ |
| 209 | --table-size=100000 \ |
| 210 | --threads=16 \ |
| 211 | --time=300 \ |
| 212 | --report-interval=10 \ |
| 213 | run |
| 214 | ``` |
| 215 | |
| 216 | ## 结果解读 |
| 217 | |
| 218 | | 指标 | 说明 | |
| 219 | |------|------| |
| 220 | | TPS | 每秒事务数 | |
| 221 | | QPS | 每秒查询数 | |
| 222 | | IOPS | 每秒 IO 操作数 | |
| 223 | | 延迟 | 响应时间 | |
| 224 | | 吞吐量 | 数据传输速率 | |
| 225 | |
| 226 | ## 故障排查 |
| 227 | |
| 228 | ```bash |
| 229 | # 检查系统负载 |
| 230 | uptime |
| 231 | vmstat 1 |
| 232 | |
| 233 | # 检查 IO |
| 234 | iostat -x 1 |
| 235 | |
| 236 | # 检查网络 |
| 237 | sar -n DEV 1 |
| 238 | ``` |