返回顶部
首页 > 资讯 > 操作系统 >如何实现Linux服务器高并发调优
  • 796
分享到

如何实现Linux服务器高并发调优

2023-06-15 19:06:55 796人浏览 泡泡鱼
摘要

如何实现linux服务器高并发调优,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。众所周知在默认参数情况下Linux对高并发支持并不好,主要受限于单进程最大打开文件数限制、内

如何实现linux服务器高并发调优,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

众所周知在默认参数情况下Linux对高并发支持并不好,主要受限于单进程最大打开文件数限制、内核tcp参数方面和io事件分配机制等。下面就从几方面来调整使Linux系统能够支持高并发环境。

iptables相关

如非必须,关掉或卸载iptables防火墙,并阻止kernel加载iptables模块。这些模块会影响并发性能。

单进程最大打开文件数限制

一般的发行版,限制单进程最大可以打开1024个文件,这是远远不能满足高并发需求的,调整过程如下:在#号提示符下敲入:

# ulimit –n 65535

将root启动的单一进程的最大可以打开的文件数设置为65535个。如果系统回显类似于“Operationnotpermitted”之类的话,说明上述限制修改失败,实际上是因为在中指定的数值超过了Linux系统对该用户打开文件数的软限制或硬限制。因此,就需要修改Linux系统对用户的关于打开文件数的软限制和硬限制。

  •  第一步,修改limits.conf文件,并添加: 

# vim /etc/security/limits.conf  * soft nofile 65535  * hard nofile 65535

其中'*'号表示修改所有用户的限制;soft或hard指定要修改软限制还是硬限制;65536则指定了想要修改的新的限制值,即最大打开文件数(请注意软限制值要小于或等于硬限制)。修改完后保存文件。

  •  第二步,修改/etc/pam.d/login文件,在文件中添加如下行: 

# vim /etc/pam.d/login  sessionrequired /lib/security/pam_limits.so

这是告诉Linux在用户完成系统登录后,应该调用pam_limits.so模块来设置系统对该用户可使用的各种资源数量的最大限制(包括用户可打开的最大文件数限制),而pam_limits.so模块就会从/etc/security/limits.conf文件中读取配置来设置这些限制值。修改完后保存此文件。

  •  第三步,查看Linux系统级的最大打开文件数限制,使用如下命令: 

# cat/proc/sys/fs/file-max  32568

这表明这台Linux系统最多允许同时打开(即包含所有用户打开文件数总和)32568个文件,是Linux系统级硬限制,所有用户级的打开文件数限制都不应超过这个数值。

通常这个系统级硬限制是Linux系统在启动时根据系统硬件资源状况计算出来的最佳的最大同时打开文件数限制,如果没有特殊需要,不应该修改此限制,除非想为用户级打开文件数限制设置超过此限制的值。修改此硬限制的方法是修改/etc/sysctl.conf文件内fs.file-max= 131072 这是让Linux在启动完成后强行将系统级打开文件数硬限制设置为131072。修改完后保存此文件。

完成上述步骤后重启系统,一般情况下就可以将Linux系统对指定用户的单一进程允许同时打开的最大文件数限制设为指定的数值。

如果重启后用ulimit-n命令查看用户可打开文件数限制仍然低于上述步骤中设置的最大值,这可能是因为在用户登录脚本/etc/profile中使用ulimit-n命令已经将用户可同时打开的文件数做了限制。

由于通过ulimit-n修改系统对用户可同时打开文件的最大数限制时,新修改的值只能小于或等于上次ulimit-n设置的值,因此想用此命令增大这个限制值是不可能的。

所以,如果有上述问题存在,就只能去打开/etc/profile脚本文件,在文件中查找是否使用了ulimit-n限制了用户可同时打开的最大文件数量,如果找到,则删除这行命令,或者将其设置的值改为合适的值,然后保存文件,用户退出并重新登录系统即可。

通过上述步骤,就为支持高并发TCP连接处理的通讯处理程序解除关于打开文件数量方面的系统限制。

如何实现Linux服务器高并发调优

内核TCP参数方面

Linux系统下,TCP连接断开后,会以TIME_WaiT状态保留一定的时间,然后才会释放端口。当并发请求过多的时候,就会产生大量的TIME_WAIT状态的连接,无法及时断开的话,会占用大量的端口资源和服务器资源。这个时候我们可以优化TCP的内核参数,来及时将TIME_WAIT状态的端口清理掉。

下面介绍的方法只对拥有大量TIME_WAIT状态的连接导致系统资源消耗有效,如果不是这种情况下,效果可能不明显。可以使用netstat命令去查TIME_WAIT状态的连接状态,输入下面的组合命令,查看当前TCP连接的状态和对应的连接数量:

# netstat-n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}’  #这个命令会输出类似下面的结果:  LAST_ACK16  SYN_RECV348  ESTABLISHED70  FIN_WAIT1229  FIN_WAIT230  CLOSING33  TIME_WAIT18098

我们只用关心TIME_WAIT的个数,在这里可以看到,有18000多个TIME_WAIT,这样就占用了18000多个端口。要知道端口的数量只有65535个,占用一个少一个,会严重的影响到后继的新连接。这种情况下,我们就有必要调整下Linux的TCP内核参数,让系统更快的释放TIME_WAIT连接。

编辑配置文件:/etc/sysctl.conf,在这个文件中,加入下面的几行内容:

# vim /etc/sysctl.conf  net.ipv4.tcp_syncookies= 1  net.ipv4.tcp_tw_reuse= 1  net.ipv4.tcp_tw_recycle= 1  net.ipv4.tcp_fin_timeout= 30

输入下面的命令,让内核参数生效:

# sysctl-p

简单的说明上面的参数的含义:

net.ipv4.tcp_syncookies= 1  #表示开启SYNCookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;  net.ipv4.tcp_tw_reuse= 1  #表示开启重用。允许将TIME-WAITSockets重新用于新的TCP连接,默认为0,表示关闭;  net.ipv4.tcp_tw_recycle= 1  #表示开启TCP连接中TIME-WAITsockets的快速回收,默认为0,表示关闭;  net.ipv4.tcp_fin_timeout  #修改系統默认的TIMEOUT 时间。

在经过这样的调整之后,除了会进一步提升服务器的负载能力之外,还能够防御小流量程度的DoS、CC和SYN攻击。

此外,如果你的连接数本身就很多,我们可以再优化一下TCP的可使用端口范围,进一步提升服务器的并发能力。依然是往上面的参数文件中,加入下面这些配置:

net.ipv4.tcp_keepalive_time= 1200  net.ipv4.ip_local_port_range= 1024 65535  net.ipv4.tcp_max_syn_backlog= 8192  net.ipv4.tcp_max_tw_buckets= 5000

这几个参数,建议只在流量非常大的服务器上开启,会有显著的效果。一般的流量小的服务器上,没有必要去设置这几个参数。

net.ipv4.tcp_keepalive_time= 1200

表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为20分钟。

ip_local_port_range= 1024 65535

表示用于向外连接的端口范围。缺省情况下很小,改为1024到65535。

net.ipv4.tcp_max_syn_backlog= 8192

表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数。

net.ipv4.tcp_max_tw_buckets= 5000

表示系统同时保持TIME_WAIT的最大数量,如果超过这个数字,TIME_WAIT将立刻被清除并打印警告信息。默认为180000,改为5000。此项参数可以控制TIME_WAIT的最大数量,只要超出了。

内核其他TCP参数说明

net.ipv4.tcp_max_syn_backlog= 65535  #记录的那些尚未收到客户端确认信息的连接请求的最大值。对于有128M内存的系统而言,缺省值是1024,小内存的系统则是128。  net.core.netdev_max_backlog= 32768  #每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目。  net.core.somaxconn= 32768

例如WEB应用中listen函数的backlog默认会给我们内核参数的net.core.somaxconn限制到128,而Nginx定义的NGX_LISTEN_BACKLOG默认为511,所以有必要调整这个值。

  •  net.core.wmem_default= 8388608

  •  net.core.rmem_default= 8388608

  •  net.core.rmem_max= 16777216 #最大socket读buffer,可参考的优化值:873200

  •  net.core.wmem_max= 16777216 #最大socket写buffer,可参考的优化值:873200

net.ipv4.tcp_timestsmps= 0

时间戳可以避免序列号的卷绕。一个1Gbps的链路肯定会遇到以前用过的序列号。时间戳能够让内核接受这种“异常”的数据包。这里需要将其关掉。

net.ipv4.tcp_synack_retries= 2

为了打开对端的连接,内核需要发送一个SYN并附带一个回应前面一个SYN的ACK。也就是所谓三次握手中的第二次握手。这个设置决定了内核放弃连接之前发送SYN+ACK包的数量。

net.ipv4.tcp_syn_retries= 2

在内核放弃建立连接之前发送SYN包的数量。

#net.ipv4.tcp_tw_len= 1  net.ipv4.tcp_tw_reuse= 1

开启重用。允许将TIME-WAITsockets重新用于新的TCP连接。

net.ipv4.tcp_wmem= 8192 436600 873200

TCP写buffer,可参考的优化值:8192 436600 873200

net.ipv4.tcp_rmem = 32768 436600 873200

TCP读buffer,可参考的优化值:32768 436600 873200

net.ipv4.tcp_mem= 94500000 91500000 92700000

同样有3个值,意思是:

  •  net.ipv4.tcp_mem[0]:低于此值,TCP没有内存压力。

  •  net.ipv4.tcp_mem[1]:在此值下,进入内存压力阶段。

  •  net.ipv4.tcp_mem[2]:高于此值,TCP拒绝分配socket。上述内存单位是页,而不是字节。可参考的优化值是:7864321048576 1572864 

net.ipv4.tcp_max_orphans= 3276800
  •  系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上。

  •  如果超过这个数字,连接将即刻被复位并打印出警告信息。

  •  这个限制仅仅是为了防止简单的DoS攻击,不能过分依靠它或者人为地减小这个值,

  •  更应该增加这个值(如果增加了内存之后)。 

net.ipv4.tcp_fin_timeout= 30

如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。对端可以出错并永远不关闭连接,甚至意外当机。缺省值是60秒。2.2 内核的通常值是180秒,你可以按这个设置,但要记住的是,即使你的机器是一个轻载的WEB服务器,也有因为大量的死套接字而内存溢出的风险,FIN-WAIT-2的危险性比FIN-WAIT-1要小,因为它最多只能吃掉1.5K内存,但是它们的生存期长些。

同时还涉及到一个TCP 拥塞算法的问题,你可以用下面的命令查看本机提供的拥塞算法控制模块:

sysctlnet.ipv4.tcp_available_congestion_control

对于几种算法的分析,详情可以参考下:TCP拥塞控制算法的优缺点、适用环境、性能分析,比如高延时可以试用hybla,中等延时可以试用htcp算法等。

如果想设置TCP 拥塞算法为hybla

net.ipv4.tcp_congestion_control=hybla

额外的,对于内核版高于于3.7.1的,我们可以开启tcp_fastopen:

net.ipv4.tcp_fastopen= 3

IO事件分配机制

在Linux启用高并发TCP连接,必须确认应用程序是否使用了合适的网络I/O技术和I/O事件分派机制。可用的I/O技术有同步I/O,非阻塞式同步I/O,以及异步I/O。在高TCP并发的情形下,如果使用同步I/O,这会严重阻塞程序的运转,除非为每个TCP连接的I/O创建一个线程。但是,过多的线程又会因系统对线程的调度造成巨大开销。因此,在高TCP并发的情形下使用同步I/O是不可取的,这时可以考虑使用非阻塞式同步I/O或异步I/O。非阻塞式同步I/O的技术包括使用select(),poll(),epoll等机制。异步I/O的技术就是使用AIO。

从I/O事件分派机制来看,使用select()是不合适的,因为它所支持的并发连接数有限(通常在1024个以内)。如果考虑性能,poll()也是不合适的,尽管它可以支持的较高的TCP并发数,但是由于其采用“轮询”机制,当并发数较高时,其运行效率相当低,并可能存在I/O事件分派不均,导致部分TCP连接上的I/O出现“饥饿”现象。而如果使用epoll或AIO,则没有上述问题(早期Linux内核的AIO技术实现是通过在内核中为每个I/O请求创建一个线程来实现的,这种实现机制在高并发TCP连接的情形下使用其实也有严重的性能问题。但在最新的Linux内核中,AIO的实现已经得到改进)。

综上所述,在开发支持高并发TCP连接的Linux应用程序时,应尽量使用epoll或AIO技术来实现并发的TCP连接上的I/O控制,这将为提升程序对高并发TCP连接的支持提供有效的I/O保证。

经过这样的优化配置之后,服务器的TCP并发处理能力会显著提高。以上配置仅供参考,用于生产环境请根据自己的实际情况调整观察再调整。

关于如何实现Linux服务器高并发调优问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注编程网操作系统频道了解更多相关知识。

--结束END--

本文标题: 如何实现Linux服务器高并发调优

本文链接: https://www.lsjlt.com/news/281394.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何实现Linux服务器高并发调优
    如何实现Linux服务器高并发调优,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。众所周知在默认参数情况下Linux对高并发支持并不好,主要受限于单进程最大打开文件数限制、内...
    99+
    2023-06-15
  • 怎么实现Linux服务器高并发调优
    本篇文章为大家展示了怎么实现Linux服务器高并发调优,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。众所周知在默认参数情况下Linux对高并发支持并不好,主要受限于单进程最大打开文件数限制、内核TC...
    99+
    2023-06-28
  • Linux服务器怎么进行高并发调优
    这篇文章跟大家分析一下“Linux服务器怎么进行高并发调优”。内容详细易懂,对“Linux服务器怎么进行高并发调优”感兴趣的朋友可以跟着小编的思路慢慢深入来阅读一下,希望阅读后能够对大家有所帮助。下面跟着小编一起深入学习“Linux服务器怎...
    99+
    2023-06-28
  • 如何进行高并发场景下的Linux系统调优
    本篇文章为大家展示了如何进行高并发场景下的Linux系统调优,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Linux系统在默认的参数下对高并发支持不好,主要瓶颈在于单进程最大打开文件数限制、内核TC...
    99+
    2023-06-28
  • golang如何实现高并发
    Golang通过Goroutine和Channel来实现高并发。 Goroutine是Golang中轻量级的线程,可以同时执行多个G...
    99+
    2023-10-23
    golang
  • php如何实现高并发
    这篇文章将为大家详细讲解有关php如何实现高并发,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。PHP 高并发实现 绪论 在现代网络环境中,高并发处理已成为 PHP 应用程序面临的关键挑战。优化 PHP 应...
    99+
    2024-04-02
    协程 异步I/O 消息队列 缓存 数据库优化
  • redis如何实现高并发
    redis通过以下机制实现高并发:单线程事件循环、i/o多路复用、无锁数据结构、惰性删除、管道化、客户端连接池以及可扩展到集群模式。 Redis如何实现高并发? Redis作为一种流行...
    99+
    2024-06-12
    redis 并发访问
  • Golang如何在高并发场景中实现任务调度和并行处理?
    在 go 语言中,任务调度可以使用 sync/cond 和 sync/waitgroup,而并行处理则通过 goroutine 实现。sync/cond 提供条件变量,用于等待条件满足再...
    99+
    2024-05-11
    golang 并发处理
  • Golang并发调度器:Go WaitGroup的优化实现
    在Golang中,可以使用`sync.WaitGroup`来实现并发调度器。`WaitGroup`提供了一种简单的方式来等待一组并发...
    99+
    2023-10-08
    Golang
  • Tomcat高并发之如何理解道与性能调优
    这篇文章主要介绍“Tomcat高并发之如何理解道与性能调优”,在日常操作中,相信很多人在Tomcat高并发之如何理解道与性能调优问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Tomcat高并发之如何理解道与性...
    99+
    2023-06-16
  • 【Linux】C++项目实战-高并发服务器详析
    目录 多进程实现并发服务器多线程实现并发服务器BIO模型NIO模型I/O多路复用(I/O多路转接)select主旨思想图解原理函数解析代码举例select的缺点 poll函数...
    99+
    2023-09-14
    服务器 linux c++
  • 高并发网络编程:使用Go WaitGroup实现并发服务器
    以下是使用Go的WaitGroup实现高并发服务器的示例代码:```gopackage mainimport ("fmt""net"...
    99+
    2023-10-08
    Golang
  • 高并发nginx服务器的linux内核优化配置讲解
    由于默认的linux内核参数考虑的是最通用场景,这明显不符合用于支持高并发访问的Web服务器的定义,所以需要修改Linux内核参数,是的Nginx可以拥有更高的性能; 在优化内核时,可以做的事情很多,不过,我们通常会根据...
    99+
    2022-06-04
    nginx服务器的linux内核优化配置 高并发nginx服务器的linux内核优化配置讲解
  • 如何提高服务器高并发处理能力
    提高服务器高并发处理能力的方法包括: 使用负载均衡:通过负载均衡器将流量分发到多台服务器上,分担服务器的负载,提高并发处理能力。...
    99+
    2024-04-24
    服务器
  • ASP 中如何实现高并发访问?
    在当今互联网时代,高并发访问已经成为了许多网站必须要面对的一个问题。ASP 网站也不例外。在面对大量的用户访问时,ASP 网站如何保证高并发访问的稳定性和可靠性呢?本文将介绍一些 ASP 中实现高并发访问的方法。 使用缓存机制 在 A...
    99+
    2023-11-07
    并发 bash 存储
  • ASP中如何实现高并发处理?
    ASP中如何实现高并发处理? 随着互联网的发展,越来越多的网站需要处理大量的并发访问请求。对于ASP(Active Server Pages)开发者来说,如何实现高并发处理是一个非常重要的问题。本文将介绍ASP中如何实现高并发处理,并提供一...
    99+
    2023-11-13
    并发 对象 打包
  • 《PHP容器并发编程实践:如何实现高效的多线程并发?》
    PHP容器并发编程实践:如何实现高效的多线程并发? 在如今的互联网时代,高并发已经成为了一个家喻户晓的话题。而对于PHP开发者来说,如何实现高效的多线程并发则成为了一个必须掌握的技能。本文将介绍PHP容器并发编程的实践方法,帮助开发者实现高...
    99+
    2023-10-02
    并发 教程 容器
  • 如何在Linux服务器上使用Java实现高效的并发编程和日志管理?
    在当今互联网时代,高效的并发编程和日志管理对于服务器的稳定性和性能至关重要。而在Linux服务器上,Java语言的并发编程和日志管理是非常值得推荐的。本文将向大家介绍如何在Linux服务器上使用Java实现高效的并发编程和日志管理。 一、并...
    99+
    2023-10-28
    并发 linux 日志
  • Go语言与Apache服务器:如何实现高效并发日志记录?
    在现代计算机系统中,日志记录是非常重要的一项任务。无论是操作系统、服务器、应用程序,还是任何其他软件系统,都需要记录各种事件以便于调试、监控和分析。在高负载的环境下,日志记录可能会成为瓶颈,影响整个系统的性能。因此,如何实现高效并发的日志...
    99+
    2023-07-02
    日志 apache 并发
  • PHP如何优化以提高高并发能力?
    用于生产环境中的PHP需要对其进行优化,让PHP自身发挥更好的性能,除了写好PHP代码,还要配置好php-fpm以及php.ini调优。本文从内存、OPcache、上传、会话以及安全等方面讲解php.ini的配置调优。PHP相对其他的编译性...
    99+
    2022-08-22
    php
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作