您的位置:首页 > 教程 > linux > Linux高并发踩过的坑及性能优化介绍

Linux高并发踩过的坑及性能优化介绍

2022-06-20 13:21:46 来源:易采站长站 作者:

Linux高并发踩过的坑及性能优化介绍

目录前言linux应用运行过程中出现Toomanyopenfiles问题分析和解决Linux高并发下time_wait过多的问题分析及解决Linux更多性能优化小结前言Linux操作系统是...VAT站长之家-易采站长站-Easck.Com

目录
前言
linux应用运行过程中出现Too many open files 问题分析和解决
Linux高并发下 time_wait 过多的问题分析及解决
Linux更多性能优化
小结

VAT站长之家-易采站长站-Easck.Com

前言

Linux操作系统是现在服务器的首选操作系统,在Linux的默认系统参数下,Linux针对高并发的支持性并不是很好。小编从事Linux下应用程序开发多年,关于Linux系统下的高并发,小编自己踩过的坑,及如何解决踩过的坑下面列上几条,供大家参考,避免再次掉坑。VAT站长之家-易采站长站-Easck.Com

VAT站长之家-易采站长站-Easck.Com

Linux应用运行过程中出现Too many open files 问题分析和解决

imgVAT站长之家-易采站长站-Easck.Com

出现这句提示的原因是程序打开的文件socket连接数量超过系统设定值。VAT站长之家-易采站长站-Easck.Com

查看每个用户最大允许打开的文件数量VAT站长之家-易采站长站-Easck.Com

ulimit -a

其中 open files (-n) 1024 表示每个用户最大允许打开的文件数量是1024VAT站长之家-易采站长站-Easck.Com

当前系统文件句柄的最大数目,只用于查看,不能设置修改VAT站长之家-易采站长站-Easck.Com

cat /proc/sys/fs/file-max

查看某个进程的打开文件限制数VAT站长之家-易采站长站-Easck.Com

cat /proc/10446(pid)/limits

设置open files 数值方法VAT站长之家-易采站长站-Easck.Com

ulimit -n 65535 

这种设置方法在重启后会还原为默认值。VAT站长之家-易采站长站-Easck.Com

永久设置方法:VAT站长之家-易采站长站-Easck.Com

vim /etc/security/limits.conf

在最后加入VAT站长之家-易采站长站-Easck.Com

* soft nofile 65535

* hard nofile 65535

生效需要重启系统VAT站长之家-易采站长站-Easck.Com

这样修改之后,问题得到有效解决。VAT站长之家-易采站长站-Easck.Com

VAT站长之家-易采站长站-Easck.Com

Linux高并发下 time_wait 过多的问题分析及解决

现象是高并发场景下,服务器运行应用卡顿。VAT站长之家-易采站长站-Easck.Com

排查方法:查看服务器配置:VAT站长之家-易采站长站-Easck.Com

netstat -ant|awk '/^tcp/ {++S[$NF]} END {for(a in S) print (a,S[a])}'

发现处于 time_wait 的数量太多,有几万条,应该是大量socket处于TIME_WAIT状态。如果客户端的并发量持续很高,此时部分客户端就会显示连接不上。VAT站长之家-易采站长站-Easck.Com
TCP连接状态描述:VAT站长之家-易采站长站-Easck.Com

CLOSED:无连接是活动的或正在进行
LISTEN:服务器在等待进入呼叫
SYN_RECV:一个连接请求已经到达,等待确认
SYN_SENT:应用已经开始,打开一个连接
ESTABLISHED:正常数据传输状态
FIN_WAIT1:应用说它已经完成
FIN_WAIT2:另一边已同意释放
ITMED_WAIT:等待所有分组死掉
CLOSING:两边同时尝试关闭
TIME_WAIT:另一边已初始化一个释放
LAST_ACK:等待所有分组死掉

TIME_WAIT过多危害VAT站长之家-易采站长站-Easck.Com

网络情况不好时,如果主动方无TIME_WAIT等待,关闭前个连接后,主动方与被动方又建立起新的TCP连接,这时被动方重传或延时过来的FIN包过来后会直接影响新的TCP连接;VAT站长之家-易采站长站-Easck.Com
同样网络情况不好并且无TIME_WAIT等待,关闭连接后无新连接,当接收到被动方重传或延迟的FIN包后,会给被动方回一个RST包,可能会影响被动方其它的服务连接。VAT站长之家-易采站长站-Easck.Com

针对如何解决TIME_WAIT 过多这一问题,解答如下:VAT站长之家-易采站长站-Easck.Com

编辑内核文件/etc/sysctl.conf,加入以下内容:VAT站长之家-易采站长站-Easck.Com

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

然后执行 /sbin/sysctl -p 让参数生效.VAT站长之家-易采站长站-Easck.Com

简单来说,就是打开系统的TIMEWAIT重用和快速回收。VAT站长之家-易采站长站-Easck.Com

VAT站长之家-易采站长站-Easck.Com

Linux更多性能优化

如果您的系统的连接数本身就很多,如果以上配置调优后性能还不理想,可以再优化一下TCP的可使用端口范围,进一步提升服务器的并发能力。依然是/etc/sysctl.conf文件中,加入下面这些配置:VAT站长之家-易采站长站-Easck.Com

vi /etc/sysctl.conf
#表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为20分钟。
net.ipv4.tcp_keepalive_time = 1200 
#表示用于向外连接的端口范围。缺省情况下很小:32768到61000,改为1024到65000。
net.ipv4.ip_local_port_range = 1024 65000 
#表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数。
net.ipv4.tcp_max_syn_backlog = 8192 
#表示系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息。默认为180000,改为5000。对于Apache、Nginx等服务器,上几行的参数可以很好地减少TIME_WAIT套接字数量,但是对于 Squid,效果却不大。此项参数可以控制TIME_WAIT套接字的最大数量,避免Squid服务器被大量的TIME_WAIT套接字拖死。
net.ipv4.tcp_max_tw_buckets = 5000 

Linux内核更多参数优化说明VAT站长之家-易采站长站-Easck.Com

vim /etc/sysctl.confVAT站长之家-易采站长站-Easck.Com

1、net.ipv4.tcp_max_syn_backlog = 65536VAT站长之家-易采站长站-Easck.Com

记录的那些尚未收到客户端确认信息的连接请求的最大值。对于超过128M内存的系统而言,缺省值是1024,低于128M小内存的系统则是128。VAT站长之家-易采站长站-Easck.Com

SYN Flood攻击利用TCP协议散布握手的缺陷,伪造虚假源IP地址发送大量TCP-SYN半打开连接到目标系统,最终导致目标系统Socket队列资源耗尽而无法接受新的连接。为了应付这种攻击,现代Unix系统中普遍采用多连接队列处理的方式来缓冲(而不是解决)这种攻击,是用一个基本队列处理正常的完全连接应用(Connect()和Accept() ),是用另一个队列单独存放半打开连接。VAT站长之家-易采站长站-Easck.Com

这种双队列处理方式和其他一些系统内核措施(例如Syn-Cookies/Caches)联合应用时,能够比较有效的缓解小规模的SYN Flood攻击(事实证明<1000p/s)加大SYN队列长度可以容纳更多等待连接的网络连接数,一般遭受SYN Flood攻击的网站,都存在大量SYN_RECV状态,所以调大tcp_max_syn_backlog值能增加抵抗syn攻击的能力。VAT站长之家-易采站长站-Easck.Com

2、net.core.netdev_max_backlog = 32768VAT站长之家-易采站长站-Easck.Com

每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目。VAT站长之家-易采站长站-Easck.Com

3、net.core.somaxconn = 32768VAT站长之家-易采站长站-Easck.Com

调整系统同时发起并发TCP连接数,可能需要提高连接储备值,以应对大量突发入局连接请求的情况。如果同时接收到大量连接请求,使用较大的值会提高受支持的暂挂连接的数量,从而可减少连接失败的数量。大的侦听队列对防止DDoS攻击也会有所帮助。挂起请求的最大数量默认是128。VAT站长之家-易采站长站-Easck.Com

查看实时内核实时丢包命令:

netstat-su

位置:/proc/sys/VAT站长之家-易采站长站-Easck.Com

4、net.core.wmem_default = 8388608VAT站长之家-易采站长站-Easck.Com

该参数指定了发送套接字缓冲区大小的缺省值(以字节为单位)VAT站长之家-易采站长站-Easck.Com

5、net.core.rmem_default = 8388608VAT站长之家-易采站长站-Easck.Com

该参数指定了接收套接字缓冲区大小的缺省值(以字节为单位)VAT站长之家-易采站长站-Easck.Com

6、net.core.rmem_max = 16777216VAT站长之家-易采站长站-Easck.Com

该参数指定了接收套接字缓冲区大小的最大值(以字节为单位)VAT站长之家-易采站长站-Easck.Com

7、net.core.wmem_max = 16777216VAT站长之家-易采站长站-Easck.Com

该参数指定了发送套接字缓冲区大小的最大值(以字节为单位)VAT站长之家-易采站长站-Easck.Com

8、net.ipv4.tcp_timestamps = 0VAT站长之家-易采站长站-Easck.Com

Timestamps可以防范那些伪造的sequence号码。一条1G的宽带线路或许会重遇到带out-of-line数值的旧sequence号码(假如它是由于上次产生的)。时间戳能够让内核接受这种“异常”的数据包。这里需要将其关掉,以提高性能。VAT站长之家-易采站长站-Easck.Com

9、net.ipv4.tcp_synack_retries = 2VAT站长之家-易采站长站-Easck.Com

对于远端的连接请求SYN,内核会发送SYN+ACK数据报,以确认收到上一个SYN连接请求包。这是所谓的三次握手(threeway handshake)机制的第二个步骤。这里决定内核在放弃连接之前所送出的SYN+ACK数目。不应该大于255,默认值是5,对应于180秒左右时间。(可以根据tcp_syn_retries来决定这个值)VAT站长之家-易采站长站-Easck.Com

10、net.ipv4.tcp_syn_retries = 2VAT站长之家-易采站长站-Easck.Com

对于一个新建连接,内核要发送多少个SYN连接请求才决定放弃。不应该大于255,默认值是5,对应于180秒左右时间。(对于大负载而物理通信良好的网络而言,这个值偏高,可修改为2.这个值仅仅是针对对外的连接,对进来的连接,是由tcp_retries1 决定的)VAT站长之家-易采站长站-Easck.Com

#net.ipv4.tcp_tw_len = 1VAT站长之家-易采站长站-Easck.Com

11、net.ipv4.tcp_tw_reuse = 1VAT站长之家-易采站长站-Easck.Com

表示开启重用,允许将TIME-WAIT Sockets重新用于新的TCP连接,默认为0,表示关闭。这个对快速重启动某些服务,而启动后提示端口已经被使用的情形非常有帮助。VAT站长之家-易采站长站-Easck.Com

12、net.ipv4.tcp_mem = 94500000 915000000 927000000VAT站长之家-易采站长站-Easck.Com

tcp_mem有3个INTEGER变量:low, pressure, highVAT站长之家-易采站长站-Easck.Com

low:当TCP使用了低于该值的内存页面数时,TCP没有内存压力,TCP不会考虑释放内存。(理想情况下,这个值应与指定给tcp_wmem的第2个值相匹配。这第2个值表明,最大页面大小乘以最大并发请求数除以页大小 (131072*300/4096)VAT站长之家-易采站长站-Easck.Com

pressure:当TCP使用了超过该值的内存页面数量时,TCP试图稳定其内存使用,进入pressure模式,当内存消耗低于low值时则退出pressure状态。(理想情况下这个值应该是TCP可以使用的总缓冲区大小的最大值(204800*300/4096)VAT站长之家-易采站长站-Easck.Com

high:允许所有TCP Sockets用于排队缓冲数据报的页面量。如果超过这个值,TCP连接将被拒绝,这就是为什么不要令其过于保守(512000*300/4096)的原因了。在这种情况下,提供的价值很大,它能处理很多连接,是所预期的2.5倍;或者使现有连接能够传输2.5倍的数据。VAT站长之家-易采站长站-Easck.Com

一般情况下这些值是在系统启动时根据系统内存数量计算得到的。VAT站长之家-易采站长站-Easck.Com

13、net.ipv4.tcp_max_orphans = 3276800VAT站长之家-易采站长站-Easck.Com

系统所能处理不属于任何进程的TCP sockets最大数量。假如超过这个数量﹐那么不属于任何进程的连接会被立即reset,并同时显示警告信息。之所以要设定这个限制﹐纯粹为了抵御那些简单的DoS攻击﹐千万不要依赖这个或是人为的降低这个限制VAT站长之家-易采站长站-Easck.Com

14、net.ipv4.tcp_fin_timeout = 30VAT站长之家-易采站长站-Easck.Com

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

15、net.ipv4.ip_conntrack_max = 10000VAT站长之家-易采站长站-Easck.Com

设置系统对最大跟踪的TCP连接数的限制(CentOS 5.6无此参数)VAT站长之家-易采站长站-Easck.Com

同时还涉及到一个TCP 拥塞算法的问题,你可以用下面的命令查看本机提供的拥塞算法控制模块:VAT站长之家-易采站长站-Easck.Com

sysctlnet.ipv4.tcp_available_congestion_control

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

如果想设置TCP 拥塞算法为hyblaVAT站长之家-易采站长站-Easck.Com

#设置TCP 拥塞算法
net.ipv4.tcp_congestion_control=hybla

对于内核版高于于3.7.1的,我们可以开启tcp_fastopen:VAT站长之家-易采站长站-Easck.Com

#开启tcp_fastopen
net.ipv4.tcp_fastopen= 3

Iptables相关VAT站长之家-易采站长站-Easck.Com

如非必须,关掉或卸载iptables防火墙,并阻止kernel加载iptables模块。这些模块会影响并发性能。VAT站长之家-易采站长站-Easck.Com

IO事件分配机制VAT站长之家-易采站长站-Easck.Com

在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。VAT站长之家-易采站长站-Easck.Com

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

VAT站长之家-易采站长站-Easck.Com

小结

综上所述,在开发支持高并发TCP连接的Linux应用程序时,应尽量使用epoll或AIO技术来实现并发的TCP连接上的I/O控制,这将为提升程序对高并发TCP连接的支持提供www.cppcns.com有效的I/O保证。VAT站长之家-易采站长站-Easck.Com

经过以上描述的优化配置之后,服务器的TCP并发处理能力会显著提高。上文所述配置仅供参考,用于生产环境请根据自己开发系统所部署的实际情况调整观察再调整。VAT站长之家-易采站长站-Easck.Com

到此这篇关于Linux高并发踩过的坑及性能优化介绍的文章就介绍到这了,更多相关Linux高并发及性能优化内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

如有侵权,请联系QQ:279390809 电话:15144810328

相关文章

  • Linux下用GHOST来做系统备份

    Linux下用GHOST来做系统备份

    在Windows系统下备份我们可以用GHOST工具软件完成,Linux系统不能完全依赖于GHOST工具,一则是GHOST本身是有版权的软件,二是GHOST只支持ext2、ext3文件系统的Linux分区,不支持reiserfs、xfs等
    2019-10-25
  • 给 FreeBSD 12.1 安装 GNOME3 图形界面

    给 FreeBSD 12.1 安装 GNOME3 图形界面

    FreeBSD是一个完全开放的、安全的系统,可以Do it yourself的系统。但是个人还是不喜欢呆板的命令行界面,所有就给 FreeBSD 12.1 安装 GNOME3 图形界面。 开始操作,启动FreeBSD 12.1,以root身份
    2019-10-27
  • Ubuntu Studio一个不错的操作系统

    Ubuntu Studio一个不错的操作系统

    Ubuntu Studio 是一个基于 Ubuntu 而面向音频、视频及图形爱好者的操作系统。本次推出的 Ubuntu Studio 为 7.04 版,目前仅支持 Intel i386 兼容的处理器。 Ubuntu Studio 从大量的开源多媒体创作程序
    2019-10-25
  • 最受欢迎的10款Linux免费游戏

    最受欢迎的10款Linux免费游戏

    图为在Linux下运行的免费游戏America's Army 如果你认为 Linux下没有什么好游戏的话,那就错了!我们来看看Linux下最受欢迎的10款游戏吧,而且这些游戏都是完全免费的! # skyreal update(06-12
    2019-10-25
  • compiz fusion特效使用心得(附3D桌面图)

    compiz fusion特效使用心得(附3D桌面图)

    3D桌面图 LINUX发行版就是好,当大多数人还在沉迷于那些什么风格图标鸟玻璃效果甚至孜孜不倦津津乐道的时候,Linux的高手们已经悄悄为我们开启了一个桌面系统3D的时代。 当我第一次
    2019-10-25
  • Ubuntu 下aMule 的安装配置

    Ubuntu 下aMule 的安装配置

    aMule 是一个类似于 eMule 的多平台 P2P 客户端程序。以下将简略叙述 aMule 在 Ubuntu 中的安装及配置 [High ID] 与 [KAD] 的过程。 安装: sudo apt-get install amule sudo apt-get install amule-utils 如果需要
    2019-10-25
  • JMeter jp@gc - stepping thread group插件

    JMeter jp@gc - stepping thread group插件

    这是一个出单接口压力测试的小例子,了解一下压力测试最最基础的基础。出单接口是用来保险出单的,不需要在UI界面下一步下一步的出单,接口一调数据入库完事~~~。再啰嗦一句接
    2019-10-27
  • Ubuntu 下使用K3B软件刻录光盘(图)

    Ubuntu 下使用K3B软件刻录光盘(图)

    不知大家会不会在Ubuntu下刻录光盘呢?k3b是KDE环境下的一个CD/DVD刻录软件,有非常容易使用的界面,功能比较齐全。用起来感觉就象是win下的Nero一样简单自然,比ubuntu里原来的刻录CD方式
    2019-10-25