操作模式


对于 netcat 程序,存在两种模式,即 服务端 和 客户端, 它们的区别在于连接建立的方式。 一旦连接建立,客户端/服务器 的行为都是一样的,使用两个并行的循环处理:

  • 从标准输入,写到 TCP Socket
  • 从 TCP Socket 读, 写到标准输出

主要有两种基本的并发模型:

  • 多线程配合阻塞IO
  • IO多路复用配合非阻塞

netcat 的实现


这里提供三种netcat的实现:

  • recipes/tpc/netcat.cc thread-per-connection
  • recipes/python/netcat.py IO-multiplexing
  • recipes/python/netcat-nonblock.py IO-multiplexing

以及,为了测试以上 netcat 程序,这里还提供了对应的负载生成器:

  • recipes/tpc/chargen.cc
  • recipes/python/chargen.py
  • muduo/examples/simple/chargen/*

对于 netcat 的实现这里提供了三个版本,多线程配合阻塞IO、IO多路复用配合阻塞IO、IO多路复用配合非阻塞IO。其中 IO多路复用配合非阻塞IO 实现的netcat使用不当会使整个程序阻塞。

测试

  • 右边窗口运行 chargen
  • 左上运行 utop,可以看到每个程序的 CPU 使用率
    左下运行 netcat

测试系统自带的 netcat 性能

  • 约为 1360MiB/s

测试自实现的 netcat 性能

  • 约为 3200MiB/s
  • 通过对比,我们可以发现自实现的 netcat 比系统实现的要快一些

分析cpu资源分配对整个测试结果的影响

分析 cpu 的使用率我们可以发现,在测试系统自带的 netcat 时,nc cpu 100%, 而chargen cpu 35%, 说明在测试结果11360 MiB/s 中, nc 程序是性能的瓶颈,拖慢了整个数据的传输速率。

而在测试自带的 nc 性能时,chargen cpu 100%,nc 接近 100%,测得性能为 3200 MiB/s 。

此时,如果我们再加上一个 pv 命令用于显示实时带宽,就会发现整体的测试结果会下降到 1130 MiB/s 左右。此时如果我们关注cpu的占用率,就会发现 pv 占用了一部分 cpu,导致 chargen 程序的cpu占用下降,从而拖慢了整个测试结果。

测试基于 python 实现的 netcat 性能

  • 约为 940 MiB/s

测试基于 python 实现的非阻塞IO的 netcat 性能

  • 约为 958 MiB/s

Linux C/C++网络编程实战-陈硕-笔记17-多个版本的Netcat概览相关推荐

  1. Linux C/C++网络编程实战-陈硕-笔记20-使用非阻塞IO

    基于IO复用(非阻塞IO)实现的 netcat 使用非阻塞IO可以有效避免上述情况的发生.但非阻塞IO在编程上要比阻塞IO更难,并且在程序的维护上比较痛苦.一般使用非阻塞IO编程时建议使用一些封装好的 ...

  2. Linux C/C++网络编程实战-陈硕-笔记15-如何正确使用 TCP

    netcat netcat 除了读取 socket 描述符,还要读取 stdin 和 stdout 并发模型 thread-per-connection IO 复用和非阻塞 IO 配合 如何安全的关闭 ...

  3. Linux C/C++网络编程实战-陈硕-笔记10-网络时间同步

    网络时间同步(NTP)原理 Device A发送一个NTP报文给Device B,该报文带有它离开Device A时的时间戳,该时间戳为10:00:00am(T1). 当此NTP报文到达Device ...

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

    性能指标 带宽(Bandwidth):每秒收发的数据量,MB/s.(只关注数据量,不关注消息数) 吞吐量(Throughput):消息/s.查询/s(QPS).事物数/s(TPS) 延迟(Latenc ...

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

    实验环境 命令 dd命令: 用于读取.转换并输出数据. 可从标准输入或文件中读取数据,根据指定的格式来转换数据,再输出到文件.设备或标准输出. 参数: if=文件名:输入文件名,默认为标准输入.即指定 ...

  6. Linux C/C++网络编程实战-陈硕-笔记11-Roundtrip代码分析

    代码 UDP, two threads recipes/tpc/roundtrip_udp.cc UDP with muduo, single thread muduo/examples/roundt ...

  7. Linux C/C++网络编程实战-陈硕-笔记7-TCP自连接

    TCP 自连接 tcp连接两段使用了同一端口进行连接,而tcp并没有报错并且连接成功.即localhost:x --> localhost:x 只存在于 tcp 本地通信,而且客户端先于服务端启 ...

  8. 网络编程实践陈硕笔记零

    1.理查德森的unix网络编程有两样不足:一消息格式处理,特别是非阻塞IO上处理TCP分包问题:二是并发模型稍显陈旧,传统高并发采用事件驱动加非阻塞IO方式. 2.程序员面对的网络术语 Etherne ...

  9. 【网络编程实践--陈硕】学习笔记 | 汇总目录

    本文参考<网络编程实践>–陈硕(Muduo作者)视频课程所写.基于课程内容所做归纳和整理. <网络编程实战>配套页面:http://chenshuo.com/pnp Blog ...

最新文章

  1. Centos7 上安装 redis5.0.5
  2. 『参考』使用.net CF自带库判断设备的连接状态
  3. hdu 3635(并查集+路径压缩变形)
  4. C++扬帆远航——3(打印图形)
  5. ITK:单相Chan和Vese密集域水平集分割
  6. php sql好处,关于php:使用Doctrine与SQL相比,使用DQL有什么好处?
  7. 作者:王玲玲(1978-),女,中国科学院上海天文台高级工程师
  8. 腾讯将被“重锤”?腾讯股价应声下跌逾5%!造谣原博主销号跑路
  9. (四)使用Jenkins工作流链接MLOps管道
  10. Dubbo使用multicast广播注册中心暴露服务地址时启动报错empty notify
  11. 21复变函数的积分(七)
  12. laravel 5 : Class 'input' not found
  13. 苹果cms海螺大橙子首途v7模板源码
  14. Java桌面应用程序
  15. 【美团 技术篇】美团推荐算法实践
  16. Unity跟随鼠标顺时针或逆时针旋转之美
  17. 小新700linux网卡驱动,小新Air14网卡驱动2024.0.2.101/12.0.0.725版下载,适用于Win10-64-驱动精灵...
  18. quickAction
  19. 前端PC端微信扫码登录
  20. ESP8266+DHT11温湿度传感器+小爱同学语音智能LED灯(状态可视化)

热门文章

  1. Timer的schedule和scheduleAtFixedRate区别
  2. 台积电三星2022年将量产3nm芯片:iPhone会是首发吗?
  3. 【SAM模型超级进化】MobileSAM轻量化的分割一切大模型出现,模型缩小60倍,速度提高40倍,效果不减
  4. java语言主要特点_Java语言的主要特点
  5. python构建知识图谱_一种构建知识图谱的方法及系统与流程
  6. Gson 实体转Json字符串 --- 报declares multiple JSON fields named XXX解决方法
  7. android开发apk在qq发送无法正常安装的问题
  8. 【原创】电脑为什么会慢?C盘空间越来越小?怎么清理?请看本文
  9. C++ 多线程: WaitForSingleObject(m_hEvent,INFINITE) ;
  10. java计算机毕业设计美容中心在线后台管理系统源码+系统+mysql数据库+lw文档