Linux网络优化

概念:
 

网络七层模型:
应用层,负责为应用程序提供统一的接口。

表示层,负责把数据转换成兼容接收系统的格式。

会话层,负责维护计算机之间的通信连接。

传输层,负责为数据加上传输表头,形成数据包。

网络层,负责数据的路由和转发。

数据链路层,负责 MAC 寻址、错误侦测和改错。

物理层,负责在物理网络中传输数据帧

网络四层模型:
应用层,负责向用户提供一组应用程序,比如 HTTP、FTP、DNS 等。

传输层,负责端到端的通信,比如 TCP、UDP 等。

网络层,负责网络包的封装、寻址和路由,比如 IP、ICMP 等。

网络接口层,负责网络包在物理网络中的传输,比如 MAC 寻址、错误侦测以及通过网卡传输网络帧等。
网络接口配置的最大传输单元(MTU),就规定了最大的 IP 包大小。在我们最常用的以太网中,MTU 默认值是 1500(这也是 Linux 的默认值)。一旦网络包超过 MTU 的大小,就会在网络层分片,以保证分片后的 IP 包不大于 MTU 值。显然,MTU 越大,需要的分包也就越少,自然,网络吞吐能力就越好。

===============================================================================================================================================


Linux网络收发流程:
接受过程


当一个网络帧到达网卡后,网卡会通过 DMA 方式,把这个网络包放到收包队列中;然后通过硬中断,告诉中断处理程序已经收到了网络包。

接着,网卡中断处理程序会为网络帧分配内核数据结构(sk_buff),并将其拷贝到 sk_buff 缓冲区中;然后再通过软中断,通知内核收到了新的网络帧。

接下来,内核协议栈从缓冲区中取出网络帧,并通过网络协议栈,从下到上逐层处理这个网络帧。比如,

在链路层检查报文的合法性,找出上层协议的类型(比如 IPv4 还是 IPv6),再去掉帧头、帧尾,然后交给网络层。

网络层取出 IP 头,判断网络包下一步的走向,比如是交给上层处理还是转发。当网络层确认这个包是要发送到本机后,就会取出上层协议的类型(比如 TCP 还是 UDP),去掉 IP 头,再交给传输层处理。

传输层取出 TCP 头或者 UDP 头后,根据 < 源 IP、源端口、目的 IP、目的端口 > 四元组作为标识,找出对应的 Socket,并把数据拷贝到 Socket 的接收缓存中。

最后,应用程序就可以使用 Socket 接口,读取到新接收到的数据了。

发送过程


首先,应用程序调用 Socket API(比如 sendmsg)发送网络包。

由于这是一个系统调用,所以会陷入到内核态的套接字层中。套接字层会把数据包放到 Socket 发送缓冲区中。

接下来,网络协议栈从 Socket 发送缓冲区中,取出数据包;再按照 TCP/IP 栈,从上到下逐层处理。比如,传输层和网络层,分别为其增加 TCP 头和 IP 头,执行路由查找确认下一跳的 IP,并按照 MTU 大小进行分片。

分片后的网络包,再送到网络接口层,进行物理地址寻址,以找到下一跳的 MAC 地址。然后添加帧头和帧尾,放到发包队列中。这一切完成后,会有软中断通知驱动程序:发包队列中有新的网络帧需要发送。

最后,驱动程序通过 DMA ,从发包队列中读出网络帧,并通过物理网卡把它发送出去。

===============================================================================================================================================


性能指标:
带宽,表示链路的最大传输速率,单位通常为 b/s (比特 / 秒)。

吞吐量,表示单位时间内成功传输的数据量,单位通常为 b/s(比特 / 秒)或者 B/s(字节 / 秒)。吞吐量受带宽限制,而吞吐量 / 带宽,也就是该网络的使用率。

延时,表示从网络请求发出后,一直到收到远端响应,所需要的时间延迟。在不同场景中,这一指标可能会有不同含义。比如,它可以表示,建立连接需要的时间(比如 TCP 握手延时),或一个数据包往返所需的时间(比如 RTT)。

PPS,是 Packet Per Second(包 / 秒)的缩写,表示以网络包为单位的传输速率。PPS 通常用来评估网络的转发能力,比如硬件交换机,通常可以达到线性转发(即 PPS 可以达到或者接近理论最大值)。而基于 Linux 服务器的转发,则容易受网络包大小的影响。

除了这些指标,网络的可用性(网络能否正常通信)、并发连接数(TCP 连接数量)、丢包率(丢包百分比)、重传率(重新传输的网络包比例)等也是常用的性能指标。

===============================================================================================================================================


小记:ifconfig 和 ip 分别属于软件包 net-tools 和 iproute2,iproute2 是 net-tools 的下一代。通常情况下它们会在发行版中默认安装。但如果你找不到 ifconfig 或者 ip 命令,可以安装这两个软件包。

ifconfig 和 ip 命令输出的指标基本相同


相关重要指标:

第一,网络接口的状态标志。ifconfig 输出中的 RUNNING ,或 ip 输出中的 LOWER_UP ,都表示物理网络是连通的,即网卡已经连接到了交换机或者路由器中。如果你看不到它们,通常表示网线被拔掉了。

第二,MTU 的大小。MTU 默认大小是 1500,根据网络架构的不同(比如是否使用了 VXLAN 等叠加网络),你可能需要调大或者调小 MTU 的数值。

第三,网络接口的 IP 地址、子网以及 MAC 地址。这些都是保障网络功能正常工作所必需的,你需要确保配置正确。

第四,网络收发的字节数、包数、错误数以及丢包情况,特别是 TX 和 RX 部分的 errors、dropped、overruns、carrier 以及 collisions 等指标不为 0 时,通常表示出现了网络 I/O 问题。其中:

errors 表示发生错误的数据包数,比如校验错误、帧同步错误等;

dropped 表示丢弃的数据包数,即数据包已经收到了 Ring Buffer,但因为内存不足等原因丢包

overruns 表示超限数据包数,即网络 I/O 速度过快,导致 Ring Buffer 中的数据包来不及处理(队列满)而导致的丢包;

carrier 表示发生 carrirer 错误的数据包数,比如双工模式不匹配、物理电缆出现问题等;

collisions 表示碰撞数据包数。

===============================================================================================================================================
netstat ss命令各字段说明:


当套接字处于连接状态(Established)时,

Recv-Q 表示套接字缓冲还没有被应用程序取走的字节数(即接收队列长度)。

而 Send-Q 表示还没有被远端主机确认的字节数(即发送队列长度)。

当套接字处于监听状态(Listening)时,

Recv-Q 表示 syn backlog 的当前值。

而 Send-Q 表示最大的 syn backlog 值。

半连接:

就是还没有完成 TCP 三次握手的连接,连接只进行了一半,而服务器收到了客户端的 SYN 包后,就会把这个连接放到半连接队列中,然后再向客户端发送 SYN+ACK 包。

全连接:

则是指服务器收到了客户端的 ACK,完成了 TCP 三次握手,然后就会把这个连接挪到全连接队列中。这些全连接中的套接字,还需要再被 accept() 系统调用取走,这样,服务器就可以开始真正处理客户端的请求了。

netstat -s/ss -s #查看协议栈信息

===============================================================================================================================================
网络吞吐和pps
sar 增加-n参数就可以查看网络的统计信息,比如网络接口(DEV)、网络接口错误(EDEV)、TCP、UDP、ICMP等
sar -n DEV 1 #获取网络接口统计信息,每秒输出一组数据

sar -u  #统计CPU的使用情况,每间隔1秒钟统计一次总共统计三次:

#sar -u 1 3

sar -p 1 3 #报个每个CPU的使用状态:

#CPU 所有CPU的统计

#%user 用户态的CPU使用统计

#%nice 更改过优先级的进程的CPU使用统计

#%iowait CPU等待IO数据的百分比

#%steal 虚拟机的vCPU占用的物理CPU的百分比

#%idle 空闲的CPU百分比

 sar -q #查看平均负载:

#runq-sz  运行队列的长度(等待运行的进程数,每核的CP不能超过3个)

#plist-sz 进程列表中的进程(processes)和线程数(threads)的数量

#ldavg-1 最后1分钟的CPU平均负载,即将多核CPU过去一分钟的负载相加再除以核心数得出的平均值,5分钟和15分钟以此类推

#ldavg-5 最后5分钟的CPU平均负载

#ldavg-15 最后15分钟的CPU平均负载

sar -r  #查看内存使用情况

#kbmemfree  空闲的物理内存大小

#kbmemused  使用中的物理内存大小

#%memused 物理内存使用率

#kbbuffers 内核中作为缓冲区使用的物理内存大小,kbbuffers和kbcached:这两个值就是free命令中的buffer和cache. 

#kbcached 缓存的文件大小

#kbcommit  保证当前系统正常运行所需要的最小内存,即为了确保内存不溢出而需要的最少内存(物理内存+Swap分区)

#commit 这个值是kbcommit与内存总量(物理内存+swap分区)的一个百分比的值

 sar -W #查看系统swap分区的统计信息:

#pswpin/s  每秒从交换分区到系统的交换页面(swap page)数量

#pswpott/s 每秒从系统交换到swap的交换页面(swap page)的数量

sar -b #查看I/O和传递速率的统计信息

#tps  磁盘每秒钟的IO总数,等于iostat中的tps

#rtps 每秒钟从磁盘读取的IO总数

#wtps 每秒钟从写入到磁盘的IO总数

#bread/s 每秒钟从磁盘读取的块总数

#bwrtn/s 每秒钟此写入到磁盘的块总数

sar -d #磁盘使用详情统计

#DEV 磁盘设备的名称,如果不加-p,会显示dev253-0类似的设备名称,因此加上-p显示的名称更直接

#tps:每秒I/O的传输总数

#rd_sec/s 每秒读取的扇区的总数

#wr_sec/s 每秒写入的扇区的 总数

#avgrq-sz 平均每次次磁盘I/O操作的数据大小(扇区)

#avgqu-sz 磁盘请求队列的平均长度

#await 从请求磁盘操作到系统完成处理,每次请求的平均消耗时间,包括请求队列等待时间,单位是毫秒(1秒等于1000毫秒),等于寻道时间+队列时间+服务时间

#svctm I/O的服务处理时间,即不包括请求队列中的时间

#%util I/O请求占用的CPU百分比,值越高,说明I/O越慢

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值