7.1 网络I/O介绍

Linux和其他主流操作系统中的网络流量被抽象为一系列的硬件和软件层次。

链路层,也就是最低的一层,包含网络硬件,如以太网设备。在传送网络流量时,这一层并不区分流量类型,而仅仅以尽可能快的速度发送和接收数据(帧)。

链路层上面是网络层。这一层使用IP协议和ICMP协议在机器间寻址并路由数据包。IP/ICMP尽其最大努力尝试在机器之间传递数据包,但是它们不能保证数据包是否能真正达到其目的地。

网络层上面是传输层,它定义了TCP和UDP。TCP是可靠的协议,它保证消息通过网络送达,如果消息无法送达它就会产生一个错误。而UDP则一个不可靠的协议,它无法保证信息能够送达(为了更高的速率)。TCP和UDP增加了“服务”的概念。UDP和TCP接收的编号“端口”的消息。按照惯例,每个类型的网络服务都会被分配不懂的编号,也就是不同的端口。比如HTTP是80端口,SSH是22端口,FTP是23.通常服务会区分端口的类型,但是为了避免端口被混用,通常著名端口的TCP端口和UDP端口都设置为一样。比如大家都说ssh是22端口,虽然使用的是TCP协议,但是通常SSH也会占用22端口的UDP服务,所以说著名端口很多时候都不针对协议的。在Linux系统中,文件/etc/services定义了全部的端口以及它们提供的服务类型。

最上层是应用层。这一层包含了各种的应用程序。

Linux内核实现或控制的是最低三层(链路层、网络层、传输层)。内核可以提供每层的性能统计信息,包括数据流经过每一层的带宽使用情况信息和错误计数信息。

7.1.1 链路层的网络流量

链路层,通常是以太网,以帧序列的形式将信息发送到网络上。即便是其上层次的信息片段大小比帧大很多,链路层也会把它们分割为帧,再发送到网络上。数据帧的最大尺寸叫做最大传输单位(MTU)。你可以用网络配置工具,如ip或者ifconfig来设置MTU、对以太网而言,最大大小一般为1500字节,虽然有些硬件支持巨型帧高达9000字节。MTU的大小对网络效率有直接的影响。由于每个帧都有一个小容量的头部,所以MTU越大,传输的效率也就越高,但是数据组被损坏或丢弃的几率就越高。对于清洁的网络链路来说,大尺寸的MTU带来更好的性能,但是嘈杂的链路来说更小的MTU会有更好的性能。因为,当单个帧损坏时,它要重传的数据更少。

在物理层,帧流经物理网络,Linux内核可以收集大量有关帧数量和类型不同的统计信息。

l  发送/接收——如果一个帧成功地流入或流出机器,那么它就会被计为一个已发送或已接收的帧。

l  错误——有错误的帧(可能是网络电缆坏了,或者双工不匹配)

l  丢弃——被丢弃的帧(很可能是因为内存或缓冲区容量小)

l  溢出——由于内核或网卡有过多的帧,因此被网络丢弃的帧。通常这种情况不应该发生。

l  帧——由于物理问题导致被丢弃的帧。其原因可能是循环冗余校验(CRC)错误或者其他低级别的问题。

l  多播——这些帧不直接寻址到当前系统,而是同时广播到一组节点。

l  压缩——一些底层接口,如点对点协议(PPP)设备在把帧发送到网络上之前,会对其进行压缩。该值表示的就是被压缩帧的数量。

7.1.2 协议层网络流量

对TCP/UDP流量而言,Linux使用套接字/端口来抽象两台机器的连接。当与远程机器连接时,本地应用程序用一个网络套接字来打开远程机器的一个端口。如HTTP的80端口,web服务器会监听80端口上的连接,当发生连接时,web服务器就为web页面的传输设置该连接。

7.2网络性能工具

7.2.1 mii-tool(媒体无关接口工具)

mii-tool是以太网专用硬件工具,主要用来设以太网设备,但它也可以提供当前相关的设置信息。这个信息,诸如链接速度和双工设置,对于追踪性能不佳的设备的成因是非常有用的。

第一行的信息告诉我们网络设备正在使用100baseTx-FD全双工连接。

7.2.2 ethtool

对比mii-tool,ethtool 的功能更加强大,包含更多的配置选项和设备统计信息。

下图显示了eth0的配置信息,显示该设备支持多种不同速度和链接的设置,当前连接的是一个全双工,1000Mbps的链路。

7.2.3 ifconfig(接口配置)

ifconfig的主要工作就是在Linux机器上安装和配置网络接口。它还提供了系统中所有的网络设备的基本性能统计信息。

ifconifg的性能统计信息

RX packets

设备已接收的数据包数

TX packets

设备已发送的数据包数

errors

发送或者接收时的错误数

dropped

发送或者接收时丢弃的数据包数

overruns

网络设备没有足够的缓冲区来发送或者接收一个数据包的次数

frame

底层以太网帧错误的数量

carrier

由于链路介质故障(如电缆故障)而丢弃的数据包数量

在下图中可以看到eth0一共接收了3.2G的数据,发送了10.6G的数据。该数据是自系统启动开始计算的,可以用watch观察数据的变化。

7.2.4 ip

ip命令是用来取代老旧的ifconfig的,ip不仅可以让你对Linux联网的各个不同方面进行配置,还可以显示每个网络设备的性能统计信息。

和ifconfig类似,ip提供的是自系统启动以来的数据的汇总。

7.2.5 sar

sar除了能提供链路层的网络性能数据之外,还能提供一些关于传输层打开的套接字数量的基本信息。

sar显示所有网络设备收发的统计信息

sar显示套接字的数量

7.2.6 netstat

netstat是一个基本的网络性能工具,它几乎出现在所有的Linux设备上。可以用它抽象的信息包括:当前正在使用的网络套接字的数量和类型,以及有关流入和流出当前系统的UDP和TCP数据包数量的特定接口统计数据。它还能将一个套接字回溯到其特定进程或PID,这在试图确定哪个应用程序要对网络流量负责时是很有用的。

每秒都更新一次活跃的tcp连接

显示系统自启动以来UDP流量的统计信息:

Linux性能优化 第七章 性能工具:网络的更多相关文章

  1. Linux性能优化 第五章 性能工具:特定进程内存

    5.1 Linux内存子系统 在诊断内存性能问题的时候,也许有必要观察应用程序在内存子系统的不同层次上是怎样执行的.在顶层,操作系统决定如何利用交换内存和物理内存.它决定应用程序的哪一块地址空间将被放 ...

  2. Linux性能优化 第六章 性能工具:磁盘I/O

    6.1 磁盘I/O介绍 一般来说,Linux磁盘的每个分区要么包含一个文件系统,要么包含一个交换分区.这些分区被挂载到Linux根文件系统,该系统由/etc/fstab指定.这些被挂载的文件系统包含了 ...

  3. Linux性能优化 第三章 性能工具:系统内存

    3.1内存性能统计信息 3.1.1 内存子系统和性能 和CPU相比,内存的读写速度都大大落后于CPU.为了弥补这个差距,通常CPU会采用高速缓存的机制(高cache). 3.1.2 内存子系统(虚拟存 ...

  4. Linux性能优化 第四章 性能工具:特定进程CPU

    4.1进程性能统计信息 4.1.1. 内核时间VS用户时间 一个应用程序所耗时间最基本的划分是内核时间与用户时间.内核时间是消耗在Linux内核上的时间,而用户时间则是消耗在应用程序或库代码上的时间. ...

  5. Android性能优化之UI渲染性能优化

    版权声明:本文出自汪磊的博客,未经作者允许禁止转载. 本篇博客主要记录一些工作中常用的UI渲染性能优化及调试方法,理解这些方法对于我们编写高质量代码也是有一些帮助的,主要内容包括介绍CPU,GPU的职 ...

  6. EF性能优化-有人说EF性能低,我想说:EF确实不如ADO.NET

    十年河东,十年河西,莫欺少年穷. EF就如同那个少年,ADO.NET则是一位壮年.毕竟ADO.NET出生在EF之前,而EF所走的路属于应用ADO.NET. 也就是说:你所写的LINQ查询,最后还是要转 ...

  7. Linux内核分析——第七章 链接

    第七章——链接 1.链接是将各种代码和数据部分收集起来并组合成为一个单一文件的过程,这个文件可被加载到存储器并执行. 2.链接可以执行于编译时,加载时,运行时. 7.1编译器驱动程序 1.大多数编译系 ...

  8. Java性能优化,操作系统内核性能调优,JYM优化,Tomcat调优

    文章目录 Java性能优化 尽量在合适的场合使用单例 尽量避免随意使用静态变量 尽量避免过多过常地创建Java对象 尽量使用final修饰符 尽量使用局部变量 尽量处理好包装类型和基本类型两者的使用场 ...

  9. 第七章 DevOps工具链

    DevOps工具生态圈 协同开发工具 敏捷开发 可视化 加强团队沟通协作 数据分析 协同开发 持续集成工具 Jenkins 自动化编译 自动化测试 自动化部署 丰富的插件库 版本管理工具 Git 简介 ...

随机推荐

  1. hive查询操作

  2. centos7编译安装php7.2

    去官网下载php7.2安装包,选择一个结点下载:http://php.net/downloads.php 下载:wget -ivh http://cn.php.net/distributions/ph ...

  3. 五、springboot(二)配置数据源oracle

    1.添加依赖 <!-- jpa --> <dependency> <groupId>org.springframework.boot</groupId> ...

  4. tornado输入-get_query_argument()等 笔记

    最外面的代码结构 import tornado.web import tornado.ioloop import tornado.options import tornado.httpserver f ...

  5. Linux下Python与C++混合编程

    最近在做一个CUDA的项目,记录下学习心得. 系统 Linux --generic #-Ubuntu x86_64 GNU/Linux C++调用Python Python模块代码: #!/usr/b ...

  6. Spring Cloud(Dalston.SR5)--Feign 声明式REST客户端

    Spring Cloud 对 Feign 进行了封装,集成了 Ribbon 并结合 Eureka 可以实现客户端的负载均衡,Spring Cloud 实现的 Feign 客户端类名为 LoadBala ...

  7. 把指定的字符串翻译成 pig latin。

    freecodecamp上的算法题: 把指定的字符串翻译成 pig latin. Pig Latin 把一个英文单词的第一个辅音或辅音丛(consonant cluster)移到词尾,然后加上后缀 & ...

  8. GTID的相关特性

    配置MySQL GTID 主从复制 基于mysqldump搭建gtid主从 二.GTID如何跳过事务冲突 1 2 3 4 5 6 7 8 9 10 11 很多无法预料的情形导致mysql主从发生事务冲 ...

  9. C# .NET 2.0 判断当前程序进程是否为64位运行时 (x64)

    public static bool Is64BitProcess() { ; }

  10. C/C++中字符串和数字互转小结

    一. 数字 转 char*型 1.sprintf函数(适合C和C++) 示例: char str[50]; int num = 345; sprintf(str,"%d",num) ...