1. 首页 > 快讯

高并发场景下服务器性能优化指南

老铁们,大家好,相信还有很多朋友对于高并发场景下服务器性能优化指南和的相关问题不太懂,没关系,今天就由我来为大家分享分享高并发场景下服务器性能优化指南以及的问题,文章篇幅可能偏长,希望可以帮助到大家,下面一起来看看吧!

[[375477]]

作者在高并发场景下亲自开发了一个简单、稳定、可扩展的延迟消息队列框架,具有精确的定时任务和延迟队列处理功能。开源半年多以来,已成功为十几家中小企业提供精准定时调度解决方案,并经受住了生产环境的考验。为了惠及更多童鞋,现给出开源框架地址:https://github.com/sunshinelyz/mykit-delay

写在前面最近有朋友在群里问:Linux系统中tcp_nodelay参数如何设置?也有朋友问我。今天我们就基于这个问题来谈谈高并发场景下如何优化服务器性能。

事实上,tcp_nodelay参数并不是在操作系统层面配置的。而是在TCP 套接字上添加tcp_nodelay 参数来关闭粘性算法,以便数据包能够立即投递。 tcp_nodelay 参数主要针对TCP 套接字。对于服务器硬件来说,如果我们希望它能够支持百万甚至千万并发,我们应该如何优化呢?

文章已收录于:

https://github.com/sunshinelyz/technology-binghe

https://gitee.com/binghe001/technology-binghe

操作系统这里我使用的操作系统是CentOS 8,我们可以输入以下命令来查看操作系统版本。

CentOS Linux release 8.0.1905 (Core) 针对高并发场景,我们主要对操作系统的网络性能进行优化。操作系统中有很多关于网络协议的参数。我们对服务器网络性能的优化主要集中在这些系统参数上。进行调整以提高应用程序的访问性能。

系统参数在CentOS操作系统中,我们可以通过以下命令查看所有系统参数。

/sbin/sysctl -a 的部分输出如下。

这里的参数太多了,大概有一千多个。在高并发场景下,我们不可能调优操作系统的所有参数。我们更关注与网络相关的参数。如果我们想要获取网络相关的参数,首先需要获取操作系统参数的类型。下面的命令可以获取操作系统参数的类型。

/sbin/sysctl-a|awk -F'.''{print$1}'|sort-k1|uniq 运行该命令输出的结果信息如下。

abicryptodebugdevfskernelnetsunrpcuserm

net类型是我们要关注的与网络相关的操作系统参数。我们可以得到网络类型下的子类型,如下所示。

/sbin/sysctl -a|grep'^net.'|awk -F'[.|]''{print$2}'|sort-k1|uniq 输出的结果信息如下。

bridgecoreipv4ipv6netfilternf_conntrack_maxunix

在Linux操作系统中,这些网络相关的参数可以在/etc/sysctl.conf文件中修改。如果/etc/sysctl.conf文件中不存在这些参数,我们可以自己在/etc/sysctl.conf文件中修改它们。将这些参数添加到.

在net type的子类型中,我们需要重点关注的子类型有:core和ipv4。

优化套接字缓冲区如果服务器的网络socket缓冲区太小,就会导致应用程序需要多次读写来处理数据,这会极大地影响我们程序的性能。如果网络socket缓冲区设置得足够大,我们程序的性能可以得到一定程度的提升。

我们可以在服务器的命令行中输入以下命令来获取服务器套接字缓冲区的信息。

/sbin/sysctl -a|grep'^net.'|grep'[r|w|_]mem[_|]' 输出的结果信息如下。

net.core.rmem_default=212992net.core.rmem_max=212992net.core.wmem_default=212992net.core.wmem_max=212992net.ipv4.tcp_mem=435455806287090net.ipv4.tcp_rmem=4096873806291456net .ipv4 .tcp_wmem=4096163844194304net.ipv4.udp_mem=87093116125174186net。 ipv4.udp_rmem_min=4096net.ipv4.udp_wmem_min=4096

其中,带有max、default、min关键字的分别代表:最大值、默认值、最小值; mem、rmem、wmem 关键字分别代表:总内存、接收缓冲内存、发送缓冲内存。

这里需要注意的是,rmem和wmem关键字的单位都是“字节”,而mem关键字的单位是“页”。 “页”是操作系统管理内存的最小单位。在Linux系统中,默认的页面大小是4KB。

如何优化频繁收发大文件如果我们需要在高并发场景下频繁发送和接收大文件,我们如何优化服务器的性能?

这里我们可以修改的系统参数如下。

net.core.rmem_defaultnet.core.rmem_maxnet.core.wmem_defaultnet.core.wmem_maxnet.ipv4.tcp_memnet.ipv4.tcp_rmemnet.ipv4.tcp_wmem 这里,我们假设系统最多可以为TCP分配2GB内存,并且最小值为256MB。压力值为1.5GB。按照一页4KB计算,tcp_mem的最小值、压力值、最大值分别为65536、393216、524288,单位为“页”。

如果平均文件数据包为512KB,每个socket读写缓冲区可以容纳最少2个数据包,默认4个数据包,最多10个数据包,那么我们可以计算出最小值、默认值和最大值tcp_rmem和tcp_wmem的分别是1048576、2097152和5242880,单位是“字节”。 rmem_default 和wmem_default 为2097152,而rmem_max 和wmem_max 为5242880。

注:这些值是如何计算的,后面会详细解释~~

这里还需要注意的是,缓冲区超过65535,需要将net.ipv4.tcp_window_scaling参数设置为1。

经过上述分析,我们最终的系统调优参数如下。

net.core.rmem_default=2097152net.core.rmem_max=5242880net.core.wmem_default=2097152net.core.wmem_max=5242880net.ipv4.tcp_mem=65536393216524288net.ipv4.tcp_rmem=1048576209 71525 242880net.ipv4.tcp_wmem=104857620971525242880优化TCP连接对计算机是网络一定熟悉的朋友都知道,一条TCP连接需要经过“三次握手”和“四次挥手”,以及慢启动等一系列支持可靠传输的技术支持、滑动窗口和粘包算法。这些虽然可以保证TCP协议的可靠性,但是有时候这会影响我们程序的性能。

那么,高并发场景下如何优化TCP连接呢?

(1)关闭粘包算法如果用户对耗时请求敏感,我们需要在TCP套接字中添加tcp_nodelay参数来关闭粘性算法,以便数据包能够立即发送。这时我们还可以将net.ipv4.tcp_syncookies的参数值设置为1。

(2)避免频繁的创建和回收连接资源网络连接的创建和回收会消耗大量性能。我们可以通过关闭空闲连接并重用分配的连接资源来优化服务器性能。每个人都熟悉重用分配的连接资源。例如,线程池和数据库连接池复用线程和数据库连接。

我们可以使用以下参数来关闭服务器的空闲连接并重用分配的连接资源。

net.ipv4.tcp_tw_reuse=1net.ipv4.tcp_tw_recycle=1net.ipv4.tcp_fin_timeout=30net.ipv4.tcp_keepalive_time=1800(3)避免重复发送数据包TCP支持超时重传机制。如果发送方已经将数据包发送给接收方,但发送方还没有收到反馈,此时如果达到设定的时间间隔,就会触发TCP的超时重传机制。为了避免成功发送的数据包再次发送,我们需要将服务器的net.ipv4.tcp_sack参数设置为1。

(4)增大服务器文件描述符数量在Linux操作系统中,网络连接也占用一个文件描述符。连接越多,占用的文件描述符就越多。如果文件描述符设置的比较小的话,也会影响我们服务器的性能。这时候我们就需要增加服务器文件描述符的数量。

例如:fs.file-max=10240000,表示服务器最多可以打开10240000个文件。

如果你还想了解更多这方面的信息,记得收藏关注本站。

用户评论

男神大妈

看到这篇文章还挺有用的,我现在项目一直都有延迟的问题...

    有18位网友表示赞同!

我一个人

高并发确实挺考验服务器的,以前碰过几次这个问题。

    有18位网友表示赞同!

话扎心

.NET Core 的并发性能优化我也很想了解,可以学到很多东西。

    有15位网友表示赞同!

打个酱油卖个萌

希望能介绍一些比较实用的方法,例如缓存策略啊什么的。

    有20位网友表示赞同!

一别经年

感觉现在网络应用越来越快了,背后是性能优化的积累吧。

    有8位网友表示赞同!

糖果控

学习一下高并发场景下的优化技巧,准备迎接项目发展高峰期!

    有17位网友表示赞同!

青瓷清茶倾城歌

关注这个方向的学习好久了,终于找到了相关的内容。

    有5位网友表示赞同!

减肥伤身#

服务器性能问题太大了,如果能解决好一点,网站体验就会更好。

    有14位网友表示赞同!

冷落了♂自己·

最近在调试高并发程序的时候遇到很多困难,希望能找到解决方法

    有5位网友表示赞同!

予之欢颜

分享一下自己的经验,一起交流学习!

    有14位网友表示赞同!

无寒

优化服务器的性能确实是一门技术活,要精通太多东西啊!

    有19位网友表示赞同!

無極卍盜

文章能详细介绍.NET Core的一些并发机制吗?我很想了解。

    有20位网友表示赞同!

从此我爱的人都像你

做web开发的时候高并发场景总是让我头疼,希望能学到一些干货知识.

    有13位网友表示赞同!

tina

期待能够看到一些具体的代码案例,以便更好地理解。

    有9位网友表示赞同!

七级床震

网络应用的高并发性能优化是一个很重要的技术方向!

    有12位网友表示赞同!

绝版女子

对于.NET Core的并发性能优化,有哪些工具可以帮助我们进行分析和监控?

    有20位网友表示赞同!

浮殇年华

文章里提到的策略有没有什么适合小规模项目的实践方案呢?

    有17位网友表示赞同!

为爱放弃

我很想知道高并发场景下如何进行数据库优化!

    有5位网友表示赞同!

淡抹烟熏妆丶

希望这个文章能详细讲解一些常用的负载均衡方法!

    有20位网友表示赞同!

金橙橙。-

学习到这些知识,可以提升我的解决问题的能力!

    有20位网友表示赞同!

裸睡の鱼

这篇文章对于我想要了解.NET Core的性能优化非常有帮助!

    有13位网友表示赞同!

本文采摘于网络,不代表本站立场,转载联系作者并注明出处:https://www.iotsj.com//kuaixun/6896.html

联系我们

在线咨询:点击这里给我发消息

微信号:666666