性能指标
- 带宽(Bandwidth):每秒收发的数据量,MB/s。(只关注数据量,不关注消息数)
- 吞吐量(Throughput):消息/s、查询/s(QPS)、事物数/s(TPS)
- 延迟(Latency):毫秒级延迟,百分位延迟
- 资源使用率(Utilization):资源的利用程度(比例),如磁盘使用率、CPU使用率、额外开销(例如在拷文件时,需要实时压缩和加密产生的开销)
- (Overhead)
测试数据应小于Overhead,如果测试结果大于Overhead,则考虑可能有数据压缩
如果远小于Overhead且CPU使用率很低,则考虑程序在网络带宽和CPU带宽是均不理想
如果远小于Overhead且CPU使用率很高,则考虑程序在计算上消耗很大(例如SSH在拷文件时,数据加密涉及CPU计算)
为什么选择 TTCP
- 使用了基本的sockets APIs:socket,listen, bind, accept,connect,read/recv,write/send,shutdown,close 等等
- 协议带有格式,不只是字节流,相较于echo具有tcp分包处理等
- ttcp 本身是由 tcp/ip 实现的程序,具有一些典型的行为。可以阅读其代码学习它的一些优秀实现
- 协议简单,可以由多种语言实现,针对测试结果对比个语言实现的runtime开销
- 无并发连接,client与server之间只有一个tcp socket
TTCP 使用的协议
- SessionMessage:告诉服务器发送 1024 条数据,每条数据的长度是 8192 字节
- PayloadMessage
【length】:8192,表示第二个成员的 data 的长度
【length本身占4个字节】:4 - Ack(=8192)
ttcp发送数据会有一个Ack应答(已经收到了 8192 个字节)
相对于netcat只发送不接收而言,理论上讲ttcp检测出的带宽要慢于netcat测出的结果(收到 ack 才会发送下一个数据),特别对于网络有延迟的情况而言,发送数据和Ack都会有延迟产生
代码实现
-
直线型的阻塞IO示例:
muduo/examples/ace/ttcp/ttcp_blocking.cc (C with sockets API)
recipes/tpc/ttcp.cc (C++ with a thin wrapper)
muduo-examples-in-go/examples/ace/ttcp/ttcp.go (Go) -
非阻塞IO库示例:
muduo/examples/ace/ttcp/ttcp.cc -
以上示例都不支持并发连接,前三个示例每个连接起一个线程来处理就可以支持并发,第四个在设计上收到最后一条消息就退出,将退出语句注释掉可以支持并发。