(5)Linux性能调优之网络子系统

1、前言

前面咱们谈了的内容以下:数据库

(1)Linux性能调优之Linux进程管理windows

(2)Linux性能调优之Linux内存体系缓存

(3)Linux性能调优之Linux文件系统性能优化

(4)Linux性能调优之磁盘I/O子系统bash

这一节咱们将谈下Linux的网络子系统服务器

2、概览

网络子系统是另外一个影响性能的重要子系统!网络操做相关的组件有不少,例如交换机、路 由器、网关、PC等等。尽管这些组件不受到Linux系统的控制,可是,他们对系统的总体性能 有很大影响。网络

如今,让咱们主要集中注意力看看Linux是如何处理网络操做的。socket

3、网络实现

TCP/IP协议和OSI模型有相似的层级结构。Linux内核的网络实现采用了类似的办法。下图展 示了Linux的TCP/IP栈的层级和TCP/IP通讯概览:tcp

和不少Unix操做系统同样,Linux为TCP/IP网络操做提供套接字(Socket)接口。套接字为用 户应用程序提供接口。下面咱们看看在网络数据传递过程当中,基本的数据处理顺序:post

  1. 当应用程序要把数据发送给其它主机,应用程序首先建立数据。
  2. 应用程序打开套接字,经过套接字接口写入数据。
  3. 套接字缓冲(socket buffer)是用来处理传输数据的。套接字缓冲中有数据的参考,数据 穿过该层,向下传递。
  4. 在每一层,都要作相应的修改,例如修改头部、添加修改包头、校验值、路由、分片等 等。当套接字缓冲向下层传递,数据自己不在层之间复制。由于在各层之间复制数据的 效率过低,内核只修改套接字缓冲中的参考而且向下层传递,避免没必要要的损耗。
  5. 最后,数据经过网卡进入网线。
  6. 以太帧(Ethernet frame)到达对方的网络接口。
  7. 若是MAC地址和网卡MAC地址匹配的话,分片就接收到网卡缓冲中。
  8. 网卡把数据包移动到套接字缓冲中,触发一次CPU的硬中断。
  9. 而后CPU处理这个数据包,把他一层层向上传递,直到抵达一个应用程序(例如进程的 TCP端口),好比Apache。

3.1 套接字缓冲(Socket buffer)

正如前文所说,内核使用缓冲来发送和接收数据。下图展现了网络缓存的配置项。能够 用/proc/sys/net下的文件调整。

/proc/sys/net/core/rmem_max
/proc/sys/net/core/rmem_default
/proc/sys/net/core/wmem_max
/proc/sys/net/core/wmem_default
/proc/sys/net/ipv4/tcp_mem
/proc/sys/net/ipv4/tcp_rmem
/proc/sys/net/ipv4/tcp_wmem
复制代码

下图展现了这些参数:

3.2 网络API(Network API,NAPI)

新的网络子系统API发生了一些变化。Linux网络栈的标准实现更关注可靠性和低延时,而不是低负载和高吞吐。这个特征虽然有利于建立防火墙,可是大多数企业应用,例如文件、打印和数据库都会比相同状况下的windows慢一些。

在一个典型的网络包处理中,以下图蓝色箭头所描绘的,网卡把数据包移动到操做系统内核 的网络缓冲,而且触发一个CPU的硬中断。

这只是是进程处理网络包的一个简单视图,可是显示出了这种方法的一个不足。每次当一个 MAC地址匹配的以太网帧到达接口,都会引发一次硬中断。不管如何,CPU必须停下正在处 理的进程,而后处理这个硬中断,引起一次上下文切换和刷新处理器缓存。你可能以为,若是只有不多的数据包,那这就不是什么大问题。可是,GB级别的以太网卡和现代的应用程序 一秒钟能产生数千个包,致使数量庞大的中断和上下文切换。

所以,Linux引入NAPI来对抗处理网络流量引起的相关开销。对于第一个包,NAPI就和传统 的实现同样,触发一次中断。可是第一个包以后的包,接口进入了polling模式。只要还有数据 包在网卡DMA 的环状缓冲(ring buffer)中,就不会引起新的中断,从而高效的减小了上下文 切换和相关的消耗。在最后的包被处理,环状缓存被清空以后,网卡又回到了中断模式。 NAPI的的另外一个好处是经过生成能被多处理器支持的软中断,加强了多处理器的扩展。NAPI 对大多数企业级种的多处理器操做系统都是巨大的改进,须要NAPI支持的驱动。还有极大的 调优空间等着咱们在后面探索。

3.3 Netfilter

Linux已经把防火墙做为内核的一部分。这一功能由Netfilter模块提供。你可使用iptables命 令来管理和配置Netfilter。

通常来讲,Netfilter提供了以下的几个功能。

  • 数据包过滤:若是数据包匹配到一条规则,Netfilter将会接收、拒绝或者根据其它预约的 操做来处理这个数据包。
  • 地址翻译:若是数据包匹配到一条规则,Netfilter会根据地址翻译的需求修改这个数据 包。

匹配过滤器能够定义以下的属性。

  • 网络接口(Network Interface) IP地址,IP地址范围,子网(IP address,IP address range,subnet)
  • 协议(Protocol)
  • ICMP类型(ICMP Type)
  • 端口(Port)
  • TCP标志(TCP flag)
  • 状态(state)

下图展现了数据包如何在Netfilter链中传递,以及顺序中每个点定义的可用规则。

若是匹配到规则,Netfilter将会采起相应的操做,这个操做被叫作目标(target),下面是一 些可用的target。

  • ACCEPT:接受包,而且放行。
  • DROP:丢弃包
  • REJECT:丢弃包,而且回复一个消息,例如ICMP端口不可达、TCP重置源主机。
  • LOG:记录匹配的包
  • MASQUERADE, SNAT, DNAT, REDIRECT:地址翻译(NAT)

3.4 链接追踪(Connection tracking)

为了知足更多的防火墙功能,Netfilter使用链接追踪机制,跟踪全部网络流量的状态。经过 TCP链接状态和其它网络属性(IP地址,端口,协议,序列号,ack,ICMP类型,等), Netfilter把每个包分类到下面四个状态。

  • NEW:尝试创建新链接的包
  • ESTABLISHED:已创建链接的包
  • RELATED:和前面的包相关的包
  • INVALID:由于异常或者非法的不知状态的包

做为补充,Netfilter可使用其它模块,经过分析协议特定属性和操做进行更详细的链接跟 踪。例如,有FTP、NetBIOS、TFTP、IRC的链接跟踪模块。

4、TCP/IP

TCP/IP一直是默认的网络协议。Linux上的TCP/IP实现是十分契合TCP/IP标准的。为了更好 的性能优化,应该熟悉基本的TCP/IP网络。

4.1 链接创建

在应用数据传输以前,服务器和客户端就应该创建起链接,链接创建的过程叫作TCP/IP三次 握手。下图展现了基本的链接创建和中断过程。

  1. 客户端发送SYN包(带有SYN标志设置的包)到服务器,请求链接
  2. 服务器收到SYN请求包,回复一个SYN+ACK的包
  3. 而后客户端发送ACK包给服务器完成链接创建。

在回话期间,链接状态会发生改变。下图展现了TCP/IP链接状态图:

一旦创建起链接,应用数据就能够经过这个链接来传送,在全部的数据传输完成以后,链接关闭。下面是四次挥手的简单过程:

  1. 客户端发送FIN包给服务器,开始终止链接的过程。
  2. 服务器回复一个ACK的确认包回去,若是再没有数据要发送给客户端,服务器而后发送 一个FIN包给客户端。
  3. 客户端发送一个ACK包给服务器,完成链接终止。

4.2 流量控制(Traffic control)

TCP/IP有一种机制,确保即便在拥挤时段和网络传输质量恶劣的状况下,高效数据传输!这种机制就是TCP/IP滑动窗口(TCP/IP transfer window)

滑动窗口是Linux操做系统上TCP/IP实现的重要组成。基本上,TCP滑动窗口就是在发送数据 以前,一台机器和对方机器确认能发送和接收的最大数据量的机制。窗口大小放在TCP头的 滑动窗口字段中,由接受端传递给发送端。使用滑动窗口可使数据传递更加高效,由于发 送主机没必要等待每个数据包的确认。这使得网络更加有效利用,也提升了延迟确认效率。 在链接中,TCP窗口从很小开始,随着收到每个对端的确认而慢慢增加。下面是图示:

5、下一节是???

谈完Linux的网络子系统,理论知识梳理完了,下一节将会谈谈:理解Linux性能指标

相关文章
相关标签/搜索