Linux 网络基础与性能优化
2022-07-17 09:07:36
收集接口层,控制收集包正在物理收集中的传输,比方 MAC 寻址、差池侦测以及通过网卡传输收集帧等
运用层:运用措施移用 Socket API 发送收集包,把数据包放到 Socket 发送缓冲区中
收集同意栈从 Socket 发送缓冲区中,取出数据包;再遵守 TCP/IP 栈,从上到下逐层执掌
数据链途层:分片后的收集包,再送到数据链途层,举行物理地方寻址,以找到下一跳的 MAC 地方,而且增添帧头和帧尾,放到发包队伍中
当一个收集帧来到网卡后,网卡会通过 DMA 体例,把这个收集包放到收包队伍中;然后通过硬中缀,告诉中缀执掌措施仍然收到了收集包
网卡中缀执掌措施会为收集帧分派内核数据布局(sk_buff),并将其拷贝到 sk_buff 缓冲区中;然后再通过软中缀,通告内核收到了新的收集帧
数据链途层:正在数据链途层搜检报文的合法性,寻找上层同意的类型,去掉帧头、帧尾,然后交给上一层收集层
收集层:收集层取出 IP 头,剖断收集包下一步的走向,比方是交给上层执掌仍旧转发。当收集层确认这个包是要发送到本机后,就会取出上层同意的类型(比方 TCP 仍旧 UDP),去掉 IP 头,再交给传输层执掌
传输层:传输层取出 TCP 头或者 UDP 头后,遵照 源 IP、源端口、宗旨 IP、宗旨端口 四元组行动标识,寻找对应的 Socket,并把数据拷贝到 Socket 的采纳缓存中。
含糊量:示意单元时刻内凯旋传输的数据量,单元一般为 b/s(比特 / 秒)或者 B/s(字节 / 秒)
延时:示意从收集苦求发出后,平素到收到远端反映,所须要的时刻延迟。正在区别场景中,这一目标能够会有区别寓意。比方,它可能示意,作战接连须要的时刻(比方 TCP 握手延时),或一个数据包往返所需的时刻(比方 RTT)
PPS:Packet Per Second(包 / 秒),示意以收集包为单元的传输速度。PPS 一般用来评估收集的转发本事基于 Linux 任事器的转发,则容易受收集包巨细的影响。
netstat:用于显示与 IP、TCP、UDP 和 ICMP 同意相干的统计数据,重点是显示套接字形态
sar -n DEV:显示收集讯息,用 sar 阐述收集更众的是用于流量和包量的检测和极度觉察
参数:-a 显示全体套接字 -n 不解析 DNS 名字 (解析 DNS 会对照慢) -t 过滤出 TCP 相干的收集套接字 -p 显示历程 / 措施名 -s 显示出同意栈中相干的极少统计讯息
tips:现正在常用 ss 取代,ss 的速率更疾极少 -t 示意只显示 TCP 套接字 -n 示意显示数字地方和端 -p 示意显示历程讯息
用于显示或设备收集修立(收集接口卡)讯息 (现用 ip 相干号召取代,包罗 ip link ip address 等)
可能看到收集接口的形态记号、MTU 巨细、IP、子网、MAC 地方以及收集包收发的统计讯息
# tips: ip号召显示的LOWER_UP示意物理收集是联通的,ifconfig显示的是RUNNING,若是没有显示能够即是物理题目
用于显示和操作 IP 途由外,通过对象地方 ip 和子网掩码可能阐述启航包途途 (现常用 ip route 取代) (增补:ip rule show 显示途由战略外,调理途由战略外可能配置途由转发战略)
sar 是一个卓绝的普通机能看守器械,它可能输出 Linux 所完工的简直全体职责的数据。sar 号召正在 sysetat rpm 中供应。sar 可能显示 CPU、运转队伍、磁盘 I/O、分页(调换区)、内存、CPU 中缀、收集等机能数据
用 sar 阐述收集更众的是用于流量和包量的检测和极度觉察。要越发细致阐述细节仍旧 tcpdump+wireshark 简单。
ping 措施是测试另一个主机是否可达的常用措施,常用来测试长途主机的连通性和延时。ping 措施的道理即是发送一个 ICMP 报文给主机,等候返回的 ICMP 回显应答。
极少选项,包罗 -s 配置包的巨细,-c 配置 ping 的次数,-t 示意平素 ping 直至本人终止,-R 查看途由选项
iperf 是常用的收集机能测试器械,用来测试 TCP 和 UDP 的含糊量,以客户端和任事器通讯的体例,测试一段时刻内的均匀含糊量。
要紧是 TCP 的头部选项局限和 socket 接连时的选项局限,遵照庞杂的收集境遇举行拔取会大大提拔 socket 的机能。
SO_LINGER :指定函数 close 对面向接连的同意怎么操作,内核缺省 close 操作是当即返回,若是罕有据残留正在套接口缓冲区中则编制将试着将这些数据发送给对方。
配置 l_onoff 为 0,则紧闭 linger,close 直接返回,未发送数据将由内核完工传输
配置 l_onoff 为非 0,l_linger 为 0,则掀开 linger,则当即紧闭该接连,通过发送 RST 分组 (而不是用平常的 FINACKFINACK 四个分组) 来紧闭该接连。若是发送缓冲区中若是有未发送完的数据,则丢掉。主动紧闭一方的 TCP 形态则跳过 TIMEWAIT,直接进入 CLOSED
配置 l_onoff 为非 0,l_linger 为非 0,将接连的紧闭配置一个超时。若是 socket 发送缓冲区中仍残留数据,历程进入睡眠,内核进入依时形态去尽量去发送这些数据。正在超时之前,若是所罕有据都发送完且被对方确认,内核用平常的 FINACKFINACK 四个分组来紧闭该接连,close 凯旋返回。若是超时之时,数据仍旧未能凯旋发送及被确认,用上面的体例来紧闭此接连。close 返回 EWOULDBLOCK
四次挥手断开接连主动紧闭方会进入 TIME_WAIT 形态,TIME_WAIT 形态分外众的话会导致编制负载较大 (TIME_WAIT 自身不占用资源,可是执掌 TIME_WAIT 须要浪费资源),故可能通过配置掀开 linger 则直接发送 RST 分组,这种情景不会爆发 TIME_WAIT。
(TIPS:TIME_WAIT 形态太众,编制会举行接受和应用,以是,接受时是等候的时刻最长的,故若是 TIME_WAIT 形态太众的话,就须要维持一个分外大的数据布局用来找等候时刻最长的,会攻陷肯定的编制盘算推算资源)
看待 TIME_WAIT 过众也可能直接配置编制的最大 TIME_WAIT 数,将该数字调小极少。(会导致极少不太牢靠的断开,只是看待削减任事器压力来说仍旧对照不错的体例,只是会令客户端断开接连更慢极少,客户端一般是一个主机,坚持接连较少,一个较长的断开影响不大)
一般一个端口开释后会等候两分钟 (TIME_WAIT 时刻) 之后能力再被应用,SO_REUSEADDR 是让端口开释后当即就可能被再次应用。
SO_REUSEADDR 用于对 TCP 套接字处于 TIME_WAIT 形态下的 socket,才可能反复绑定应用。server 措施老是该当正在移用 bind 之前配置 SO_REUSEADDR 套接字选项。正在 TCP 接连中,主动紧闭方会进入 TIME_WAIT 形态,以是这个功用也即是主动方收到被动方发送的 FIN 后,发送 ACK 后就可能断开接连,不再去向理该 ACK 丧失等情景。
也即是说,这个套接字选项向内核转达了该音书:若是这个端口被占用可是 TCP 形态位于 TIME_WAIT ,则可能重用端口。而若是端口忙,而 TCP 形态位于其他形态,那么重用端口时仿照获得一个差池讯息,指明 地方仍然应用中。若是思要让任事措施放手后就可能当即重用,而且应用的端口仍旧这个端口,那么配置 SO_REUSEADDR 选项将分外有需要。总体来说,看待须要坚持大宗 TCP 接连的任事器可能配置这个选项,由于能够会存正在大宗的 TIME_WAIT 形态 (更加是 HTTP 任事一般是任事器充任主动断开一方),配置该选项就很有需要,真相最倒霉的情景下根本是客户端的断开慢极少,影响也不辱骂常大 (客户机一般不须要大宗的 TCP 接连须要)
Nagle 算法针对的是须要延续发送众个小数据包的情景下,发送的有用数据相较于头部太小,以是发送的效果过低,乃至能够导致收集阻碍。Nagle 算法可能削减收集中小的数据包的数目,从而消重收集的堵塞水准。最常睹的 Nagle 算法的例子即是 Telnet 措施,用户正在驾御台的每次击键都市发送一个数据包,这个包一般蕴涵 41 个字节,然而只要一个字节是有用负载,其余 40 个字节都是报头,若是每次击键都发送一个报文,那就会变成了宏壮的开销。为了减小这种开销,Nagle 算法法则,当 TCP 发送了一个小的 segment(小于 MSS),它必需比及采纳到对方的 ACK 之后,能力一连发送另一个小的 segment,以是发送方将第一个小包发出去后,将后面来到的少量字符数据都缓存起来而欠妥即发送,直到收到上一个数据包的 ACK 或者 此刻字符属于紧迫数据 或者 缓存的字符数据仍然来到肯定的长度。Nagle 算法并非灵丹灵药,它会增进 TCP 发送数据的延迟。正在极少恳求低延迟的运用措施中(比如即时通信运用),Nagle 算法的法则是不易被经受的,以是须要配置 TCP_NODELAY 或者 TCP_CHORK 紧闭 Nagle 算法。
TIPS: TCP 的延迟 ACK 与 Nagle 算法有殊途同归之妙,延迟 ACK:当 TCP 采纳到数据时,并不会当即发送 ACK 给对方,相反,它会等候运用层爆发数据,然后将 ACK 和数据一齐发送,而且发送的 ACK 序号为将能够会是更大的 ACK 序号(正在 Linux 的最众等候 40 毫秒)(ACK 序号示意该序号之前的报文仍然收到,故等候时间能够又收到了局限报文,最终只须要发送一个最大的 ACK 序号即可示意之前的都收到了)
TCP_NODELAY 不应用 Nagle 算法,不会将小包举行拼接成大包再举行发送,而是直接将小包发送出去
TCP_CORK 实用于须要传送大宗数据时,可能提升 TCP 的发行效果。配置 TCP_CORK 后将每次尽量发送最大的数据量,当然也有一个阻碍时刻,当阻碍时刻到的时辰数据会自愿传送
当配置该选项后,任事器收到 connect 完工 3 次握手后,任事器仍旧是 SYN_RECV,而不是 ESTABLISHED 形态,操作编制不会采纳数据,直至收到一个数据才会举行 ESTABLISHED 形态。以是若是客户平素没有发送数据,则任事器会重传 SYN/ACK 报文,会有重传次数和超时值的节制。
SO_KEEPALIVE 保留接连检测对方主机是否溃逃,避免(任事器)恒久阻碍于 TCP 接连的输入。
配置该选项后,若是 2 小时内正在此套接口的任一倾向都没罕有据调换,TCP 就自愿给对方 发一个保留存活探测分节 (keepalive probe)。这是一个对方必需反映的 TCP 分节. 它会导致以下三种情景:
对方已溃逃且已从头启动:以 RST 反映。套接口的待执掌差池被置为 ECONNRESET,套接 口自身则被紧闭。
对方无任何反映:源自 berkeley 的 TCP 发送此外 8 个探测分节,相隔 75 秒一个,试图获得一个反映。正在发出第一个探测分节 11 分钟 15 秒后若仍无反映就放弃。套接口的待执掌差池被置为 ETIMEOUT,套接口自身则被紧闭。如 ICMP 差池是 “host unreachable(主机不行达)”,注释对方主机并没有溃逃,可是不行达,这种情景下待执掌差池被置为 EHOSTUNREACH。
tcp_keepalive_probes,TCP 发送保活探测音书以确定接连是否已断开的次数。默认值为 9
tcp_keepalive_time,正在 TCP 保活掀开的情景下,最终一次数据调换到 TCP 发送第一个保活探测音书的时刻,即容许的接续空闲时刻。默认值为 7200s(2h)。
调大缓存外面上是会提拔 Socket 传输速度的,可是,并不是老是如此。缓存是一个只要正在发送方和采纳方的机能分歧对照大时缓存会爆发影响。还要增补的是,看待 TCP 接连而言,真正的传输进程是依赖于发送方和采纳方两方的窗口巨细的,以是单枯燥大发送方缓存并不会对全部爆发昭彰影响。
正在大延时收集上的带宽应用率低,要紧理由是延时变大之后,发送方发的数据不行实时来到采纳方。导致发送缓存满之后,不行再接续发送数据。采纳方则由于 TCP 公告窗口受到采纳方赢余缓存巨细的影响。采纳缓存小的话,则会公告对方发送窗口变小。进而影响发送方不行以大窗口发送数据。以是,这里的调优思绪该当是,发送方调大 tcp_wmem,采纳方调大 tcp_rmem。
若是收集的境遇对照差,即丢包率对照高,那么会觉察哪怕调高发送和采纳两边的缓存巨细,也无法提拔全部的传输速度,要紧理由是因为丢包对照高,以是收集对照堵塞,会频仍激励慢启动,使得真正的窗口瓶颈并不正在于缓存的巨细,乃至平素难以来到一个较大的值。这种情景下,可能研商采用区别的堵塞驾御算法,bbr 算法对丢包不敏锐,以是正在这种情景下若是采用 bbr 堵塞驾御算法将使得通盘收集机能较高。若是收集的丢包很少延时很大,那么调理堵塞驾御算法也不会由昭彰提拔,此时要紧瓶颈即是缓存。
(正在第二次握手完工后任事器仍然将该接连放入了半接连队伍,当第三次握手凯旋后放入了全接连队伍,当 accept 历程被移用后,该接连被调走由内核管束)
通过伪制 IP 向任事器发送 SYN 包, 塞满任事器的未完工队伍, 任事器发送 SYN+ACK 包 没恢复, 再三 SYN+ACK 包, 使任事器不行用. 启用 syncookies 是单纯有用的抵御步伐. 仅未完工队伍满后才生效.
SYN 洪水攻击导致被攻击任事器保留大宗 SYN_RECV 形态的 “半接连”,而且会重试默认 5 次回应第二个握手包,塞满 TCP 等候接连队伍,资源耗尽(CPU 满负荷或内存亏损),让平常的交易苦求接连不进来
异步 I/O 本事。异步 IO 容许运用措施同时创议良众 I/O 操作,而无须等候这些操作完工,比及 I/O 完工后,编制会用变乱通告的体例,告诉运用措施结果
主历程 + 众个 worker 子历程。个中,主历程控制管束收集接连,而子历程控制现实的交易执掌
监听到类似端口的众历程模子,即负载平衡战略。全体历程都市监听类似接口,而且开启 SO_REUSEPORT 选项,由内核控制,把苦求负载平衡到这些监听历程中去
正在每秒苦求次数较众时而且接连一般是延续时,应用长接连庖代短接连,可能明显消重 TCP 作战接连的本钱
应用内存等体例,来缓存不常转化的数据,可能消重收集 I/O 次数,同时加疾运用措施的反映速率
应用 Protocol Buffer 等序列化的体例,压缩收集 I/O 的数据量,可能提升运用措施的含糊
应用 DNS 缓存、预取、HTTPDNS 等体例,削减 DNS 解析的延迟,也可能提拔收集 I/O 的全部速率
主页君平时还会正在个体微信分享Linux相干器械、资源和精选本事作品,不按期分享极少存心思的举动、岗亭内推以及怎么用本事做业余项目