Linux C/C++网络编程实战-陈硕-笔记2-一个TCP的简单实验

实验环境

在这里插入图片描述

命令

dd命令

  • 用于读取、转换并输出数据。
  • 可从标准输入或文件中读取数据,根据指定的格式来转换数据,再输出到文件、设备或标准输出。
    参数:
    if=文件名:输入文件名,默认为标准输入。即指定源文件。
    bs=bytes:同时设置读入/输出的块大小为bytes个字节。
    count=blocks:仅拷贝blocks个块,块大小等于ibs指定的字节数。

nc命令

  • netcat的简写,有着网络界的瑞士军刀美誉。一款功能强大的网络工具
    参数:
    l 用于指定nc将处于侦听模式。该参数意味着nc被当作server,侦听并接受连接。

ls -l 出来的单位是B
ls - lh 出来的单位是KB
time命令 - “time a simple command or give resource usage”,即测量命令的执行时间,或者给出系统资源的使用情况

测试

下面我们使用 netcat 来测试一下在千兆网中 tcp 可以达到的吞吐量

在 atom 机器 发送到 e6400 机器:
  • e6400: 在5001端口监听,收数据。
  • atom:从 /dev/sero 读一千兆数据,发送到5001端口(注:/dev/zero文件代表一个永远输出 0的设备文件,使用它作输入可以得到全为空的文件。因此可用来创建新文件和以覆盖的方式清除旧文件)
  • 带宽 118MB/s
    在这里插入图片描述
本地测试:从 atmo 发送到 atom
  • 第一次测量:从 dev/zero 读取数据10G数据测带宽为 580MB/s
    在这里插入图片描述

  • 第二次测量:从本地读取数据1G左右数据文件,运行时间为 9.4s,测带宽为 115.720MB/s【1087774720(文件大小) / 9.4(运行时间) / 1000000】。因为该步测试从磁盘加载文件,测试结果内含磁盘读取时间消耗,作为网络带宽结果不准确,因此再进行第三次测量。
    在这里插入图片描述
    在这里插入图片描述

  • 第三次测量:从本地读取数据1G左右数据文件,测带宽为 1074.876MB/s。由于步骤2测试时,已经将文件数据加载进内存中了,该步测试可以认为是直接从内存中加载数据。
    在这里插入图片描述

在 atom 机器 发送到 e350 机器:
  • 可以看出为 118 MB/s,tcp 协议栈开销不大
    在这里插入图片描述

结果

  • 在 atom 和 {e6400,e350} 千兆网测试出的结果吞吐量是 118MB/s
  • 在 atom 这台机器上,如果用 dd 重定向到 nc ,用 nc 测,是 580 MB/s
  • 在 atom 这台机器上,改用文件重定向是 1074 MB/s
    在这里插入图片描述
  • 可以看到,2 与 3 的测试结果差异很大。原因是 2 在测试时使用 dd 命令也有一定的资源消耗
  • 下面我们测试 dd
    atom发送端:使用 dd + nc 测试
    atom接收端:使用 nc + pv 测试
    在这里插入图片描述
    可以看到此次测试结果约为 455MB/s , 弱于第 3 次测试的1074.876MB/s
  • 原因分析:该atom机器为双核,在本次测试中可视为启动了四个进程,他们之间会有一定的争用。而第 3 次测试中使用了 time + nc 两个进程,他们刚好充分的利用了CPU,因此测试结果较优。
  • 如果此时我们使用 top 命令可以看到他们占用CPU的情况
    在这里插入图片描述

原因

  • 当只有 nc -> tcp -> nc 为 118MB/s
  • 当 dd -> pipe -> nc -> tcp -> nc -> tcp 为 580 ≈ 118 * 3
  • 最后 1074Mb/s 是从缓存在内存中的文件开始读的
  • 在 atom 上使用 dd 命令工具测试的结果实际上并不只是 tcp 上的开销,在发送端,包含有从内核 /dev/zero 拷贝到用户态 dd , 由 dd 拷贝到内核管道中,通过管道拷贝到 nc 中, 通过 nc 将数据发送给 tcp ;在接收端, 从tcp 接收数据到 nc 中, 在由 nc 拷贝到 dev/null
  • 因此,我们看到 580MB/s 并不是真的测出的 tcp 的传输速率
  • 由此,我们发现影响网络传输速率的不只由网络环境决定,也与程自身所占资源利用率有关(比如CPU占用率等)
    在这里插入图片描述
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Linux多线程服务端编程是指在Linux操作系统上开发多线程的服务器程序。而muduo C网络库(陈硕)是一个专门用于开发高性能网络服务器的C++库。 muduo C网络库是在muduo网络库的基础上进行了移植和改造,使其支持使用C语言进行开发。它提供了一系列高效的网络编程组件和工具,以简化多线程网络服务器的开发过程。 muduo C网络库基于Reactor模式,并且在设计上遵循了高并发、低延迟、高性能的原则。它可以处理上千个并发连接,并且具有稳定性和可靠性。 通过muduo C网络库,开发人员能够方便地实现多线程网络服务器。它提供了事件处理循环、网络IO、定时器、线程池等基本组件,可以有效地管理和处理网络连接。此外,muduo C网络库还提供了高效的多线程同步和协调机制,以支持服务器的并发处理能力。 使用muduo C网络库,开发人员可以简化网络服务器的编程过程,同时提高服务器的性能和扩展性。相比于手动处理底层网络细节,使用muduo C可以更加专注于业务逻辑的实现,提升开发效率。 总结来说,Linux多线程服务端编程使用muduo C网络库可以轻松开发高性能的网络服务器。它提供了丰富的组件和工具,满足了开发人员高并发、低延迟、高性能的需求。无论是大型互联网应用还是分布式系统,muduo C网络库都是一个可靠的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值