网易首页 > 网易号 > 正文 申请入驻

高并发场景下优化服务器的性能实战

0
分享至

tcp_nodelay参数并不是在操作系统级别进行配置的,而是在TCP套接字上添加tcp_nodelay参数来关闭粘包算法,以便使数据包能够立即投递出去。

作者个人研发的在高并发场景下,提供的简单、稳定、可扩展的延迟消息队列框架,具有精准的定时任务和延迟队列处理功能。自开源半年多以来,已成功为十几家中小型企业提供了精准定时调度方案,经受住了生产环境的考验。为使更多童鞋受益,现给出开源框架地址: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

运行命令输出的结果信息如下所示。

abi
crypto
debug
dev
fs
kernel
net
sunrpc
user
vm

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

/sbin/sysctl -a|grep "^net."|awk -F "[.| ]" '{print $2}'|sort -k1|uniq

输出的结果信息如下所示。

bridge
core
ipv4
ipv6
netfilter
nf_conntrack_max
unix

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

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

优化套接字缓冲区

如果服务器的网络套接字缓冲区太小,就会导致应用程序读写多次才能将数据处理完,这会大大影响我们程序的性能。如果网络套接字缓冲区设置的足够大,从一定程度上能够提升我们程序的性能。

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

/sbin/sysctl -a|grep "^net."|grep "[r|w|_]mem[_| ]"

输出的结果信息如下所示。

net.core.rmem_default = 212992
net.core.rmem_max = 212992
net.core.wmem_default = 212992
net.core.wmem_max = 212992
net.ipv4.tcp_mem = 43545 58062 87090
net.ipv4.tcp_rmem = 4096 87380 6291456
net.ipv4.tcp_wmem = 4096 16384 4194304
net.ipv4.udp_mem = 87093 116125 174186
net.ipv4.udp_rmem_min = 4096
net.ipv4.udp_wmem_min = 4096

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

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

如何优化频繁收发大文件

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

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

net.core.rmem_default
net.core.rmem_max
net.core.wmem_default
net.core.wmem_max
net.ipv4.tcp_mem
net.ipv4.tcp_rmem
net.ipv4.tcp_wmem

这里,我们做个假设,假设系统最大可以给TCP分配 2GB 内存,最小值为 256MB,压力值为 1.5GB。按照一页为 4KB 来计算, tcp_mem 的最小值、压力值、最大值分别是 65536、393216、524288,单位是“页” 。

假如平均每个文件数据包为 512KB,每个套接字读写缓冲区最小可以各容纳 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 = 2097152
net.core.rmem_max = 5242880
net.core.wmem_default = 2097152
net.core.wmem_max = 5242880
net.ipv4.tcp_mem = 65536 393216 524288
net.ipv4.tcp_rmem = 1048576 2097152 5242880
net.ipv4.tcp_wmem = 1048576 2097152 5242880

优化TCP连接

对计算机网络有一定了解的小伙伴都知道,TCP的连接需要经过“三次握手”和“四次挥手”的,还要经过慢启动、滑动窗口、粘包算法等支持可靠性传输的一系列技术支持。虽然,这些能够保证TCP协议的可靠性,但有时这会影响我们程序的性能。

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

(1)关闭粘包算法

如果用户对于请求的耗时很敏感,我们就需要在TCP套接字上添加tcp_nodelay参数来关闭粘包算法,以便数据包能够立刻发送出去。此时,我们也可以设置net.ipv4.tcp_syncookies的参数值为1。

(2)避免频繁的创建和回收连接资源

网络连接的创建和回收是非常消耗性能的,我们可以通过关闭空闲的连接、重复利用已经分配的连接资源来优化服务器的性能。重复利用已经分配的连接资源大家其实并不陌生,像:线程池、数据库连接池就是复用了线程和数据库连接。

我们可以通过如下参数来关闭服务器的空闲连接和复用已分配的连接资源。

net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time=1800

(3)避免重复发送数据包

TCP支持超时重传机制。如果发送方将数据包已经发送给接收方,但发送方并未收到反馈,此时,如果达到设置的时间间隔,就会触发TCP的超时重传机制。为了避免发送成功的数据包再次发送,我们需要将服务器的net.ipv4.tcp_sack参数设置为1。

(4)增大服务器文件描述符数量

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

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

本文地址:https://www.linuxprobe.com/concurrency-performance.html

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
“我等了你20年”:央视刚强与春妮的迟到爱情,看哭无数中年女人

“我等了你20年”:央视刚强与春妮的迟到爱情,看哭无数中年女人

飘飘然的娱乐汇
2026-06-14 19:45:08
解放军这三种兵“终身不退役”!第三种竟是“国宝级”存在!

解放军这三种兵“终身不退役”!第三种竟是“国宝级”存在!

无情有思ss
2026-08-18 05:57:39
俄军撤出第聂伯罗彼得罗夫斯克州!乌克兰:2028年前不会丢掉顿涅茨克

俄军撤出第聂伯罗彼得罗夫斯克州!乌克兰:2028年前不会丢掉顿涅茨克

鹰眼Defence
2026-08-16 14:35:07
他潜逃16年,靠赃款娶4个漂亮老婆生12个娃,被捕时身家有几个亿

他潜逃16年,靠赃款娶4个漂亮老婆生12个娃,被捕时身家有几个亿

让心灵得以栖息
2026-08-19 09:56:50
北京公安823人拟录:三校垄断94%

北京公安823人拟录:三校垄断94%

朗威谈星座
2026-08-18 09:16:53
同一箱牛奶为何实体店卖60元,网上只卖35元呢?内行人说出了实话

同一箱牛奶为何实体店卖60元,网上只卖35元呢?内行人说出了实话

平说财经
2026-06-26 19:31:07
血战24小时!也门政府军强势翻盘,重创伊朗扶持胡塞武装

血战24小时!也门政府军强势翻盘,重创伊朗扶持胡塞武装

老马拉车莫少装
2026-08-16 21:35:29
蒋介石晚年反复痛悔:一生中最错误的决定,就是抗战结束后没有及时把主力部队撤出东北

蒋介石晚年反复痛悔:一生中最错误的决定,就是抗战结束后没有及时把主力部队撤出东北

磊子讲史
2026-07-20 15:48:31
封锁黑海给乌克兰造成很大压力!预测战争结局后,俄“功勋经济学家”被解雇

封锁黑海给乌克兰造成很大压力!预测战争结局后,俄“功勋经济学家”被解雇

鹰眼Defence
2026-08-17 15:23:20
层层深扒!屡次举报郭德纲的人终于露面,这个局远比想象的大

层层深扒!屡次举报郭德纲的人终于露面,这个局远比想象的大

一盅情怀
2026-08-16 11:01:22
行业第一款!华为阔直板手机9月发布:定价6000-7000元

行业第一款!华为阔直板手机9月发布:定价6000-7000元

快科技
2026-08-18 17:12:10
1987年,唐山杀警案,9年后才破案,原来凶手就在当年的专案组!

1987年,唐山杀警案,9年后才破案,原来凶手就在当年的专案组!

猫眼观史
2025-04-12 22:19:48
23场18球6助攻!27岁正值巅峰!国足归化他或有望冲击2030年世界杯

23场18球6助攻!27岁正值巅峰!国足归化他或有望冲击2030年世界杯

兵哥篮球故事
2026-08-18 19:11:57
是时候说出真相!打越南时损失或超乎想象,从牺牲的名将后代便知

是时候说出真相!打越南时损失或超乎想象,从牺牲的名将后代便知

飞哥谈史
2026-08-17 09:30:28
又抓住了一个巨贪,金额高达9.7亿,首富夫人郝斌跨境逃亡失败了

又抓住了一个巨贪,金额高达9.7亿,首富夫人郝斌跨境逃亡失败了

李橑在北漂
2026-08-14 17:30:07
男子阴茎癌晚期,夫妻生活一向干净,妻子:他就是改不了这个习惯

男子阴茎癌晚期,夫妻生活一向干净,妻子:他就是改不了这个习惯

健康之光
2026-06-08 17:03:57
俄乌开战之初,假如泽连斯基那时逃了

俄乌开战之初,假如泽连斯基那时逃了

民间胡扯老哥
2026-08-19 06:59:10
凌晨1点,72岁濮存昕用一根布绳,将自己和94岁母亲狠狠绑在一起

凌晨1点,72岁濮存昕用一根布绳,将自己和94岁母亲狠狠绑在一起

阿废冷眼观察所
2026-08-18 00:20:55
全网炸穿!最讽刺的塌房:她炫耀的豪门家世竟是百年卖国黑料

全网炸穿!最讽刺的塌房:她炫耀的豪门家世竟是百年卖国黑料

浪子的烟火人间
2026-08-19 07:02:48
局势已彻底失控!日本专家紧急发出警告:一旦爆发冲突,即便东京主动提出停火,中方也不会手软

局势已彻底失控!日本专家紧急发出警告:一旦爆发冲突,即便东京主动提出停火,中方也不会手软

谈史论今1
2026-08-18 23:47:35
2026-08-19 10:43:00
linux系统运维之家
linux系统运维之家
科技资讯
1392文章数 7550关注度
往期回顾 全部

科技要闻

宇树科技1100元开盘,较发行价上涨629%

头条要闻

牛弹琴:日本大使被叫去挨骂 25分钟脸色铁青

头条要闻

牛弹琴:日本大使被叫去挨骂 25分钟脸色铁青

体育要闻

在国际球探眼中,中国年轻球员是什么水平?

娱乐要闻

230万变3亿,章子怡活成自己的靠山

财经要闻

重要信号 部分存储芯片现货价格松动下行

汽车要闻

满配华为乾崑智能科技 奕境X9预售价29.98万-37.98万

态度原创

教育
家居
手机
游戏
艺术

教育要闻

“Cry Over Spilt Milk” 300年前英国人就想通了:牛奶洒了哭也没用,这句“覆水难收”后劲太大

家居要闻

2026建博会(广州) 公装联探展交流活动

手机要闻

三星Galaxy S26 FE手机宣传图曝光:7年安卓系统更新、4900mAh

《质量效应》精神续作愿望单突破50万 发布新概念艺术图

艺术要闻

谷歌改造芝加哥地标,新貌长这样!

无障碍浏览 进入关怀版