ttcp测试网络吞吐量

devtools/2024/11/16 15:53:57/

计算机网络中的几个性能指标

带宽:用来表示网络的通信线路传送数据的能力,通常是指单位时间内从网络中的某一点通过另一点的最高数据率,即网络设备所支持的最高速度
吞吐量:表示单位时间内通过某个网络(或信道、接口)的数据量。

代码位置及分析

ttcp代码位置:muduo-master/examples/ace/ttcp

ttcp_blocking.cc就是简单的客户端服务端通信(阻塞IO),通信的过程中加入测试的逻辑

客户端主要函数

void transmit(const Options& opt)
{struct sockaddr_in addr = resolveOrDie(opt.host.c_str(), opt.port);printf("connecting to %s:%d\n", inet_ntoa(addr.sin_addr), opt.port);int sockfd = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);assert(sockfd >= 0);int ret = ::connect(sockfd, reinterpret_cast<struct sockaddr*>(&addr), sizeof(addr));if (ret){perror("connect");printf("Unable to connect %s\n", opt.host.c_str());::close(sockfd);return;}printf("connected\n");muduo::Timestamp start(muduo::Timestamp::now());	// 发送前记录时间struct SessionMessage sessionMessage = { 0, 0 };sessionMessage.number = htonl(opt.number);sessionMessage.length = htonl(opt.length);if (write_n(sockfd, &sessionMessage, sizeof(sessionMessage)) != sizeof(sessionMessage)){perror("write SessionMessage");exit(1);}const int total_len = static_cast<int>(sizeof(int32_t) + opt.length);PayloadMessage* payload = static_cast<PayloadMessage*>(::malloc(total_len));assert(payload);payload->length = htonl(opt.length);for (int i = 0; i < opt.length; ++i){payload->data[i] = "0123456789ABCDEF"[i % 16];}// 发送的数据总量double total_mb = 1.0 * opt.length * opt.number / 1024 / 1024;printf("%.3f MiB in total\n", total_mb);for (int i = 0; i < opt.number; ++i){int nw = write_n(sockfd, payload, total_len);assert(nw == total_len);int ack = 0;int nr = read_n(sockfd, &ack, sizeof(ack));assert(nr == sizeof(ack));ack = ntohl(ack);assert(ack == opt.length);}::free(payload);::close(sockfd);// 计算出时间差double elapsed = timeDifference(muduo::Timestamp::now(), start);	// 数据总量/时间,单位 mb\sprintf("%.3f seconds\n%.3f MiB/s\n", elapsed, total_mb / elapsed);
}

服务端的主要函数

void receive(const Options& opt)
{int sockfd = acceptOrDie(opt.port);struct SessionMessage sessionMessage = { 0, 0 };if (read_n(sockfd, &sessionMessage, sizeof(sessionMessage)) != sizeof(sessionMessage)){perror("read SessionMessage");exit(1);}sessionMessage.number = ntohl(sessionMessage.number);sessionMessage.length = ntohl(sessionMessage.length);printf("receive number = %d\nreceive length = %d\n",sessionMessage.number, sessionMessage.length);const int total_len = static_cast<int>(sizeof(int32_t) + sessionMessage.length);PayloadMessage* payload = static_cast<PayloadMessage*>(::malloc(total_len));assert(payload);for (int i = 0; i < sessionMessage.number; ++i){payload->length = 0;if (read_n(sockfd, &payload->length, sizeof(payload->length)) != sizeof(payload->length)){perror("read length");exit(1);}payload->length = ntohl(payload->length);assert(payload->length == sessionMessage.length);if (read_n(sockfd, payload->data, payload->length) != payload->length){perror("read payload data");exit(1);}int32_t ack = htonl(payload->length);if (write_n(sockfd, &ack, sizeof(ack)) != sizeof(ack)){perror("write ack");exit(1);}}::free(payload);::close(sockfd);
}

还有非阻塞IO版的,也就是ttcp.cc,大部份依照回调函数的方式实现

测试

环境:两条桥联的虚拟机(Centos)

阻塞io

[wang@localhost bin]$./ttcp_blocking -t ip -l 1024000
port = 5001
buffer length = 1024000
number of buffers = 8192
8000.000 MiB in total
40.412 seconds
197.960 MiB/s

非阻塞io

[wang@localhost bin]$ ./ttcp_muduo -t ip -l 1024000
port = 5001
buffer length = 1024000
number of buffers = 8192
INFO  payload bytes 8388608000 - ttcp.cc:69
8000.000 MiB transferred
198.619 MiB/s

两种方式吞吐量差不多


http://www.ppmy.cn/devtools/18548.html

相关文章

未解决的问题:如何快速判断一个很大的数是否为质数

一、概要 质数是指因数只有1和自己的自然数 按照正常的遍历算法&#xff0c;当数字较大时&#xff0c;程序的运行时间达到了秒级&#xff0c;比如测试用到的最后两个数据 这只是int&#xff0c;如果是long或long long&#xff0c;那时间将会更长 所以问题来了&#xff1a;…

【动态规划】Leetcode 70. 爬楼梯【简单】

爬楼梯 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 示例 1&#xff1a; 输入&#xff1a;n 2 输出&#xff1a;2 解释&#xff1a;有两种方法可以爬到楼顶。 1 阶 1 阶2 阶 解题思路 …

Python和C++数学物理计算分形热力学静电学和波动方程

&#x1f3af;要点 &#x1f3af;数学逻辑和代码计算或可视化&#xff1a;&#x1f58a;向下递归确定球面贝塞尔函数 | &#x1f58a;蒙特卡罗法模拟随机游走和放射性粒子衰减 | &#x1f58a;梯形规则积分算法 | &#x1f58a;高斯求积算法 | &#x1f58a;冯诺依曼拒绝&…

【基础篇】Git 基础命令与核心概念

✅作者简介&#xff1a;大家好&#xff0c;我是小杨 &#x1f4c3;个人主页&#xff1a;「小杨」的csdn博客 &#x1f433;希望大家多多支持&#x1f970;一起进步呀&#xff01; 一&#xff0c;Git 初识 1.1&#xff0c;问题引入 不知道你工作或学习时&#xff0c;有没有遇到…

opencv-基本操作

本篇文章&#xff0c;我们将聊一聊利用opencv进行的一些基本操作&#xff0c;以便后续我们利用opencv进行更加复杂的处理。 1、图像的读取、显示与保存 opencv中利用cv2.imread读取RGB图像&#xff0c;利用cv2.imshow() 进行图像的显示。 # 注意: cv2.imread读取RGB图像时, 返回…

深入解析YOLOv2

深入解析YOLOv2 引言 目标检测是计算机视觉中的一个核心问题&#xff0c;它旨在识别图像中所有感兴趣的目标&#xff0c;并给出它们的类别和位置。近年来&#xff0c;随着深度学习技术的发展&#xff0c;目标检测领域取得了巨大的进步。YOLO&#xff08;You Only Look Once&a…

光伏无人机:巡检无人机解决巡检难题

随着科技的飞速发展&#xff0c;无人机技术已经广泛应用于各个领域&#xff0c;其中光伏无人机在解决光伏电站巡检难题方面发挥了重要作用。光伏无人机以其高效、精准、安全的特点&#xff0c;为光伏电站的巡检工作带来了革命性的变革。 光伏电站通常位于广阔的户外场地&#x…

以更多架构核心专利,推进 SDS 产业创新创造

今天是第 24 个世界知识产权日&#xff0c;今年世界知识产权日活动的主题是&#xff1a;“知识产权和可持续发展目标&#xff1a;立足创新创造&#xff0c;构建共同未来。” 这也正是 XSKY 在软件定义存储领域的目标之一。以“数据常青”为使命的 XSKY&#xff0c;始终立足于软…