Linux C/C++网络编程实战-陈硕-笔记3-回顾基础的 Sockets API

性能指标

  • 带宽(Bandwidth):每秒收发的数据量,MB/s。(只关注数据量,不关注消息数)
  • 吞吐量(Throughput):消息/s、查询/s(QPS)、事物数/s(TPS)
  • 延迟(Latency):毫秒级延迟,百分位延迟
  • 资源使用率(Utilization):资源的利用程度(比例),如磁盘使用率、CPU使用率、额外开销(例如在拷文件时,需要实时压缩和加密产生的开销)
  • (Overhead)
    测试数据应小于Overhead,如果测试结果大于Overhead,则考虑可能有数据压缩
    如果远小于Overhead且CPU使用率很低,则考虑程序在网络带宽和CPU带宽是均不理想
    如果远小于Overhead且CPU使用率很高,则考虑程序在计算上消耗很大(例如SSH在拷文件时,数据加密涉及CPU计算)
    Linux C/C++网络编程实战-陈硕-笔记3-回顾基础的 Sockets API_第1张图片

为什么选择 TTCP

  • 使用了基本的sockets APIs:socket,listen, bind, accept,connect,read/recv,write/send,shutdown,close 等等
  • 协议带有格式,不只是字节流,相较于echo具有tcp分包处理等
  • ttcp 本身是由 tcp/ip 实现的程序,具有一些典型的行为。可以阅读其代码学习它的一些优秀实现
  • 协议简单,可以由多种语言实现,针对测试结果对比个语言实现的runtime开销
  • 无并发连接,client与server之间只有一个tcp socket
    Linux C/C++网络编程实战-陈硕-笔记3-回顾基础的 Sockets API_第2张图片

TTCP 使用的协议

  • SessionMessage:告诉服务器发送 1024 条数据,每条数据的长度是 8192 字节
  • PayloadMessage
    【length】:8192,表示第二个成员的 data 的长度
    【length本身占4个字节】:4
  • Ack(=8192)
    ttcp发送数据会有一个Ack应答(已经收到了 8192 个字节)
    相对于netcat只发送不接收而言,理论上讲ttcp检测出的带宽要慢于netcat测出的结果(收到 ack 才会发送下一个数据),特别对于网络有延迟的情况而言,发送数据和Ack都会有延迟产生
    Linux C/C++网络编程实战-陈硕-笔记3-回顾基础的 Sockets API_第3张图片

代码实现

  • 直线型的阻塞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

  • 以上示例都不支持并发连接,前三个示例每个连接起一个线程来处理就可以支持并发,第四个在设计上收到最后一条消息就退出,将退出语句注释掉可以支持并发。

你可能感兴趣的:(Linux,linux,网络,服务器)