提高Linux系统性能加速网络应用程序

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情

在开发 socket应用程序时,首要任务通常是确保可靠性并满足一些特定的需求。利用本文中给出的 4 个提示,您就可以从头开始为实现最佳性能来设计并开发socket 程序。本文内容包括对于 Sockets API 的使用、两个可以提高性能的 socket 选项以及 GNU/Linux 优化。

为了能够开发性能卓越的应用程序,请遵循以下技巧:

最小化报文传输的延时。

最小化系统调用的负载。

为 Bandwidth Delay Product 调节 TCP 窗口。

动态优化 GNU/Linux TCP/IP 栈。

技巧 1. 最小化报文传输的延时

在 通过 TCP socket进行通信时,数据都拆分成了数据块,这样它们就可以封装到给定连接的 TCP payload(指 TCP 数据包中的有效负荷)中了。TCPpayload的大小取决于几个因素(例如最大报文长度和路径),但是这些因素在连接发起时都是已知的。为了达到最好的 性能,我们的目标是使用尽可能多的可用数据来填充每个报文。当没有足够的数据来填充 payload 时(也称为最大报文段长度(maximum segment size) 或 MSS),TCP就会采用 Nagle 算法自动将一些小的缓冲区连接到一个报文段中。这样可以通过最小化所发送的报文的数量来提高应用程序的效率,并减轻整体的网络拥塞问题。

尽 管 John Nagle的算法可以通过将这些数据连接成更大的报文来最小化所发送的报文的数量,但是有时您可能希望只发送一些较小的报文。一个简单的例子是 telnet程序,它让用户可以与远程系统进行交互,这通常都是通过一个 shell来进行的。如果用户被要求用发送报文之前输入的字符来填充某个报文段,那么这种方法就绝对不能满足我们的需要。

另外一个例子是 HTTP 协议。通常,客户机浏览器会产生一个小请求(一条 HTTP 请求消息),然后 Web 服务器就会返回一个更大的响应(Web 页面)。

解决方案

您应该考虑的第一件事情是 Nagle 算法满足一种需求。由于这种算法对数据进行合并,试图构成一个完整的 TCP 报文段,因此它会引入一些延时。但是这种算法可以最小化在线路上发送的报文的数量,因此可以最小化网络拥塞的问题。

但是在需要最小化传输延时的情况中,Sockets API 可以提供一种解决方案。要禁用 Nagle 算法,您可以设置 TCP_NODELAY socket 选项,如清单 1 所示。

int sock, flag, ret; /* Createnew stream socket */ sock = socket( AF_INET, SOCK_STREAM, 0 ); /*Disable the Nagle (TCP No Delay) algorithm */ flag = 1; ret =setsockopt( sock, IPPROTO_TCP, TCP_NODELAY, (char *)&flag,sizeof(flag) ); if (ret == -1) { printf("Couldn'tsetsockopt(TCP_NODELAY)/n"); exit(-1); }清单 1. 为 TCP socket 禁用 Nagle 算法

提示:使用 Samba 的实验表明,在从 Microsoft® Windows® 服务器上的 Samba 驱动器上读取数据时,禁用 Nagle 算法几乎可以加倍提高读性能。

技巧 2. 最小化系统调用的负载

任 何时候通过一个 socket来读写数据时,您都是在使用一个系统调用(system call)。这个调用(例如 read 或write)跨越了用户空间应用程序与内核的边界。另外,在进入内核之前,您的调用会通过 C库来进入内核中的一个通用函数(system_call())。从 system_call()中,这个调用会进入文件系统层,内核会在这儿确定正在处理的是哪种类型的设备。最后,调用会进入 socket 层,数据就是在这里进行读取或进行排队从而通过 socket 进行传输的(这涉及数据的副本)。

这个过程说明系统调用不仅仅是在应用程序和内核中进行操作的,而且还要经过应用程序和内核中的很多层次。这个过程耗费的资源很高,因此调用次数越多,通过这个调用链进行的工作所需要的时间就越长,应用程序的性能也就越低。

由于我们无法避免这些系统调用,因此惟一的选择是最小化使用这些调用的次数。幸运的是,我们可以对这个过程进行控制。

解决方案

在 将数据写入一个 socket时,尽量一次写入所有的数据,而不是执行多次写数据的操作。对于读操作来说,最好传入可以支持的最大缓冲区,因为如果没有足够多的数据,内核 也会试图填充整个缓冲区(另外还需要保持 TCP 的通告窗口为打开状态)。这样,您就可以最小化调用的次数,并可以实现更好的整体性能。

技巧 3. 为 Bandwidth Delay Product 调节 TCP 窗口

TCP 的性能取决于几个方面的因素。两个最重要的因素是链接带宽(linkbandwidth)(报文在网络上传输的速率)和 往返时间(round-trip time) 或RTT(发送报文与接收到另一端的响应之间的延时)。这两个值确定了称为 Bandwidth Delay Product(BDP)的内容。

给定链接带宽和 RTT 之后,您就可以计算出 BDP的值了,不过这代表什么意义呢?BDP 给出了一种简单的方法来计算理论上最优的 TCP socket缓冲区大小(其中保存了排队等待传输和等待应用程序接收的数据)。如果缓冲区太小,那么 TCP窗口就不能完全打开,这会对性能造成限制。如果缓冲区太大,那么宝贵的内存资源就会造成浪费。如果您设置的缓冲区大小正好合适,那么就可以完全利用 可用的带宽。下面我们来看一个例子:BDP = link_bandwidth * RTT如果应用程序是通过一个 100Mbps 的局域网进行通信,其RRT 为 50 ms,那么 BDP 就是:100MBps * 0.050 sec / 8 = 0.625MB = 625KB注意:此处除以8 是将位转换成通信使用的字节。

因此,我们可以将 TCP 窗口设置为 BDP 或 1.25MB。但是在 Linux 2.6 上默认的 TCP 窗口大小是 110KB,这会将连接的带宽限制为 2.2MBps,计算方法如下:

throughput = window_size / RTT

110KB / 0.050 = 2.2MBps

如果使用上面计算的窗口大小,我们得到的带宽就是 12.5MBps,计算方法如下:

625KB / 0.050 = 12.5MBps

差别的确很大,并且可以为 socket 提供更大的吞吐量。因此现在您就知道如何为您的 socket 计算最优的缓冲区大小了。但是又该如何来改变呢?

解决方案

Sockets API 提供了几个 socket 选项,其中两个可以用于修改 socket 的发送和接收缓冲区的大小。清单 2 展示了如何使用 SO_SNDBUF 和 SO_RCVBUF 选项来调整发送和接收缓冲区的大小。

注意:尽管 socket 缓冲区的大小确定了通告 TCP 窗口的大小,但是 TCP 还在通告窗口内维护了一个拥塞窗口。因此,由于这个拥塞窗口的存在,给定的 socket 可能永远都不会利用最大的通告窗口。

int ret, sock, sock_buf_size;sock = socket( AF_INET, SOCK_STREAM, 0 ); sock_buf_size = BDP; ret =setsockopt( sock, SOL_SOCKET, SO_SNDBUF, (char *)&sock_buf_size,sizeof(sock_buf_size) ); ret = setsockopt( sock, SOL_SOCKET, SO_RCVBUF,(char *)&sock_buf_size, sizeof(sock_buf_size) );

清单 2. 手动设置发送和接收 socket 缓冲区大小

在 Linux 2.6 内核中,发送缓冲区的大小是由调用用户来定义的,但是接收缓冲区会自动加倍。您可以进行 getsockopt 调用来验证每个缓冲区的大小。

就 window scaling 来说,TCP 最初可以支持最大为 64KB的窗口(使用 16 位的值来定义窗口的大小)。采用 window scaling(RFC 1323)扩展之后,您就可以使用 32位的值来表示窗口的大小了。GNU/Linux 中提供的 TCP/IP 栈可以支持这个选项(以及其他一些选项)。

提示:Linux 内核还包括了自动对这些 socket缓冲区进行优化的能力(请参阅下面 表 1 中的 tcp_rmem 和tcp_wmem),不过这些选项会对整个栈造成影响。如果您只需要为一个连接或一类连接调节窗口的大小,那么这种机制也许不能满足您的需要了。

技巧 4. 动态优化 GNU/Linux TCP/IP 栈

标准的 GNU/Linux 发行版试图对各种部署情况都进行优化。这意味着标准的发行版可能并没有对您的环境进行特殊的优化。

解决方案

GNU/Linux 提供了很多可调节的内核参数,您可以使用这些参数为您自己的用途对操作系统进行动态配置。下面我们来了解一下影响 socket 性能的一些更重要的选项。

在 /proc 虚拟文件系统中存在一些可调节的内核参数。这个文件系统中的每个文件都表示一个或多个参数,它们可以通过 cat 工具进行读取,或使用 echo 命令进行修改。清单 3 展示了如何查询或启用一个可调节的参数(在这种情况中,可以在 TCP/IP 栈中启用 IP 转发)。

[root@camus]# cat/proc/sys/net/ipv4/ip_forward 0 [root@camus]# echo "1" >/poc/sys/net/ipv4/ip_forward [root@camus]# cat/proc/sys/net/ipv4/ip_forward 1 [root@camus]#

清单 3. 调优:在 TCP/IP 栈中启用 IP 转发

与 任何调优努力一样,最好的方法实际上就是不断进行实验。您的应用程序的行为、处理器的速度以及可用内存的多少都会影响到这些参数影响性能的方式。在某些情 况中,您认为有益的操作可能恰恰是有害的(反之亦然)。因此,我们需要逐一试验各个选项,然后检查每个选项的结果。换而言之,我们需要相信自己的经验,但 是对每次修改都要进行验证。

提示:下面介绍一个有关永久性配置的问题。注意,如 果您重新启动了 GNU/Linux系统,那么您所需要的任何可调节的内核参数都会恢复成默认值。为了将您所设置的值作为这些参数的默认值,可以使用 /etc/sysctl.conf在系统启动时将这些参数配置成您所设置的值。

GNU/Linux 工具

GNU/Linux 对我非常有吸引力,这是因为其中有很多工具可以使用。尽管其中大部分都是命令行工具,但是它们都非常有用,而且非常直观。GNU/Linux 提供了几个工具 —— 有些是 GNU/Linux 自己提供的,有些是开放源码软件 —— 用于调试网络应用程序,测量带宽/吞吐量,以及检查链接的使用情况。

ping 这是用于检查主机的可用性的最常用的工具,但是也可以用于识别带宽延时产品计算的 RTT。

traceroute 打印某个连接到网络主机所经过的包括一系列路由器和网关的路径(路由),从而确定每个 hop 之间的延时。

netstat 确定有关网络子系统、协议和连接的各种统计信息。

tcpdump 显示一个或多个连接的协议级的报文跟踪信息;其中还包括时间信息,您可以使用这些信息来研究不同协议服务的报文时间。

netlog 为应用程序提供一些有关网络性能方面的信息。

nettimer 为瓶颈链接带宽生成一个度量标准;可以用于协议的自动优化。

Ethereal 以一个易于使用的图形化界面提供了 tcpump(报文跟踪)的特性。

iperf 测量 TCP 和 UDP 的网络性能;测量最大带宽,并汇报延时和数据报的丢失情况。

结束语

尝 试使用本文中介绍的技巧和技术来提高 socket 应用程序的性能,包括通过禁用 Nagle 算法来减少传输延时,通过设置缓冲区的大小来提高 socket 带宽的利用,通过最小化系统调用的个数来降低系统调用的负载,以及使用可调节的内核参数来优化 Linux 的 TCP/IP 栈。

在进行优化时还需要考虑应用程序的特性。例如,您的应用程序是基于 LAN 的还是会通过Internet 进行通信?如果您的应用程序仅仅会在 LAN 内部进行操作,那么增大 socket缓冲区的大小可能不会带来太大的改进,不过启用巨帧却一定会极大地改进性能!

最后,还要使用 tcpdump 或 Ethereal 来检查优化之后的结果。在报文级看到的变化可以帮助展示使用这些技术进行优化之后所取得的成功效果。
Linux系统性能调优技巧分享 在数字化时代,Linux 系统以其开源、稳定、高效的特性,成为服务器、云计算、物联网等领域的核心支撑。然而,随着业务规模的扩大和负载的增加,系统性能问题逐渐凸显。掌握 Linux 系统性能调优技巧,不仅能提升系统运行效率,还能降低运维成本。下面从多个方面介绍实用的性能调优方法。 阅读详情

相关推荐

LS1046A CPU架构与DPAA2加速引擎实战解析

在嵌入式网络与通信设备开发中,多核处理器架构是提升系统性能的核心。其原理在于通过多个CPU核心并行处理任务,并借助缓存一致性协议确保数据同步。这种架构的技术价值在于显著提升了数据吞吐量和实时处理能力,尤其适用于网关、路由器和边缘计算等场景。其中,硬件加速引擎如DPAA2(数据路径加速架构)和CAAM(密码加速与保障模块)是关键,它们能将网络包处理、加解密等繁重任务从CPU卸载,实现接近线速的性能。本文以NXP LS1046A处理器为例,深入探讨其四核Cortex-A72架构、缓存层次、中断控制,以及如何与D

weixin_30561177的博客 419

Linux 网络加速和性能优化

1. IPA 2. GRO 3. GSO 4.智能选网 5.多链路聚合技术 6. 网络带宽预测 7.网络性能预测 8. 基于机器学习的网络优化模型 9. 构建用户态协议栈,极简协议 10. 高速数据网络通道方案 11. Linux 内核网络子系统的架构、实现以及原理 12. Linux 网络协议和高速网络设备驱动开发 13. 网络驱动、内存驱动、DMA、Power、PCIe、SR-IOV、VirtIO、GPU-Direct、RDMA/iWARP、NVme、容器 14. 网络协议的原

chanimei_11的博客 896

基于DPDK的用户态协议栈(1)DPKD简介及环境配置

DPDK(Data Plane Development Kit)是一个由Intel主导开发的,主要用于高性能数据包处理。绕过了Linux网络协议栈,直接在用户空间中对数据包处理过程,以减少数据包处理的延迟和提高吞吐量。Linux内核将DPDK应用程序看作是一个普通的用户态进程,包括它的编译、连接和加载方式和普通程序没有什么两样。DPDK程序启动后只能有一个主线程,然后创建一些子线程并绑定到指定CPU核心上运行。

jinbaotong的博客 1147

Linux 软路由性能测试及分析

本文介绍了 Linux 软路由的工作原理,并使用普通 PC 计算机作为硬件设备,在实际网络环境中测试和讨论了 Linux 软路由的性能。实验证明,在百兆以太网络环境中, Linux 软路由的数据报转发速度取决于网络卡的实际速度,并随着软路由系统的应用层服务的增加而降低。该结果为 Linux 软路由的应用和普及提供依据。0、引言随着开源软件的发展,越来越多的人开始了解、使用和研究 L

IBM技术期刊 2274

linux 局域网 提高网速,提高Linux系统网速的方法

ZDNetChina服务器站 12月2日操作系统技巧学校一个电子教室通过ADSL宽带“猫”上网,系统为RedHat 9.0,但在上网时有些网页打不开,而且网速不快。有同事告诉笔者,说这跟MTU值有关系,将它修改到适当的值即可。在Windows下可以通过修改注册表来修改MTU值,可在Linux下面又该如何做呢?通过查阅一些资料,笔者终于解决了这个问题,其实只需要一个简单的命令即可:# ifconfi...

weixin_29666725的博客 694

提高Linux系统性能加速网络应用程序

原贴:http://blog.chinaunix.net/u/23204/showart_185884.html 提高Linux系统性能加速网络应用程序    

最实用的Linux博客 1508

linux网络应用程序,提高Linux系统性能加速网络应用程序

在开发 socket 应用程序时, 首要任务通常是确保可靠性并满足一些特定的需求。利用本文中给出的 4 个提示,您就可以从头开始为实现最佳性能来设计并开发 socket 程序。本文内容包括对于 Sockets API 的使用、两个可以提高性能的 socket 选项以及 GNU/Linux 优化。为了能够开发性能卓越的应用程序,请遵循以下技巧:最小化报文传输的延时。最小化系统调用的负载。为 Band...

weixin_39984578的博客 107

提高Linux系统性能加速网络应用程序zt

最小化报文传输的延时。   最小化系统调用的负载。   为 Bandwidth Delay Product 调节 TCP 窗口。   动态优化 GNU/Linux TCP/IP 栈。   技巧 1. 最小化报文传输的延时   在通过 TCP socket 进行通信时,数据都拆分成了数据块,这样它们就可以封装到给定连接的 TCP payload(指 TCP 数据包中的有效负荷)中

as good as well 329

提高Linux系统性能加速网络应用程序(转)

提高Linux系统性能加速网络应用程序(转)[@more@]  在开发 socket 应用程序时,首要任务通常是确保可靠性并满足一些特定的需求。利用本文中给出的 4 个提示,您就可以从头开始为实现最佳性能来设计并开发 socke...

72

急速狂飚:提高Linux系统网速的方法(转)

急速狂飚:提高Linux系统网速的方法(转)[@more@]  学校一个电子教室通过ADSL宽带“猫”上网,系统为RedHat 9.0,但在上网时有些网页打不开,而且网速不快。有同事告诉笔者,说这跟MTU值有关系,将它修改到适当...

175

30张图解彻底搞懂Linux网络收发包原理:从内核到应用的完整流程解析

GitHub 加速计划 / co / coder-kung-fu 项目专注于开发内功修炼,其中对 Linux 网络收发包原理的深度解析是提升系统性能的核心基础。本文将通过通俗易懂的方式,带您揭开 Linux 内核处理网络数据包的神秘面纱,掌握从数据进入网卡到应用程序接收的全过程。 ## 📚 为什么需要理解 Linux 网络收发包原理? 在现代服务器架构中,网络性能往往是系统瓶颈的关键所在。无

gitblog_00263的博客 380

OpenOnload与AMD Solarflare NICs完美配合:硬件加速网络性能的秘密武器

在现代数据中心和高性能计算环境中,网络性能往往是决定系统整体效率的关键因素。OpenOnload作为一款高性能用户态网络栈,与AMD Solarflare网卡(NICs)的完美配合,为用户带来了硬件加速网络的极致体验。本文将深入探讨这一组合如何成为提升网络性能的秘密武器,帮助新手和普通用户快速了解其核心优势和应用方法。 ## 什么是OpenOnload? OpenOnload是一个开源的高性能

gitblog_00910的博客 420

Linux系统调优与开发环境搭建:从内核到IDE的全链路优化

本文详细介绍了Linux系统从内核调优到开发环境搭建的全链路优化方案。针对嵌入式开发和飞控系统等场景,提供了内核参数调整、USB设备权限配置、GRUB美化、VSCode深度定制及STM32开发环境配置等实用技巧,帮助开发者构建高效稳定的专业级工作站。

d6e7f8的博客 1010

IncusOS性能优化:提升容器运行效率的10个实用技巧

IncusOS作为一款专为运行Incus容器设计的Immutable Linux操作系统,其性能优化对于提升容器运行效率至关重要。本文将分享10个实用技巧,帮助你充分发挥IncusOS的潜力,让容器应用运行更快速、更稳定。 ## 1. 优化ZFS存储池配置 ZFS是IncusOS默认的存储系统,合理配置存储池可以显著提升容器IO性能。建议根据实际需求选择合适的ZFS RAID类型,如使用`zf

gitblog_00277的博客 1074

DPAA QMan缓存管理与负载均衡配置实战:从硬件原理到Linux驱动调优

在嵌入式高性能网络处理器设计中,数据平面加速架构(DPAA)是提升网络包处理性能的关键。其核心组件队列管理器(QMan)通过硬件队列和缓存机制,高效调度数据包在CPU核心与加速单元间的流转。理解QMan内部有限的硬件资源(如2K条目的FQD缓存)是性能优化的基础,缓存命中率直接决定了数据包入队/出队的延迟和系统吞吐量。基于此原理,工程师需要根据应用场景(如防火墙、负载均衡器或视频流处理)在三种负载均衡策略间做出选择:静态分发保证流内顺序,动态负载均衡(顺序保持)提升核心利用率,而动态负载均衡(顺序恢复)则通

civtsbiqr522632413的博客 323

LS1043A DPAA1架构解析与USB/HDLC/看门狗嵌入式网络开发实战

在嵌入式系统与网络设备开发中,硬件加速架构和多核处理器协同工作是提升性能的关键技术。其核心原理是通过专用硬件单元(如队列管理器、缓冲区管理器)处理数据包分类、调度与内存管理,将CPU从繁重的网络协议处理中解放出来,专注于应用逻辑。这种硬件卸载技术能显著提升吞吐量、降低延迟,并简化多核编程的复杂性,对于保证流顺序和实现负载均衡至关重要。该技术广泛应用于路由器、交换机、防火墙、工业网关及边缘计算等对网络性能与可靠性要求极高的场景。本文以NXP LS1043A处理器及其集成的DPAA1(数据路径加速架构)为例,深

ozzzzzz的专栏 166
上一篇: js中call,apply,setCapture,releaseCapture的使用
下一篇: js事件监听
wully_happy
博客等级 码龄20年 10粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值