Linux系统参数优化下面提到的一些配置需要较新的Linux(2.6或更高版本)内核才能支持。笔者使用CentOS7.4,内核版本3.10。如果不能满足需求,最好相应升级,毕竟打补丁是吃力不讨好的事。对于系统级调优,我们通常会修改文件描述符限制、缓冲区队列长度和临时端口数。文件描述符限制因为每个TCP连接都占用一个文件描述符,一旦文件描述符用完,新的连接就会返回“Toomanyopenfiles”等错误。为了提高性能,我们需要对其进行修改修改:1.限制在系统级别编辑文件/etc/sysctl.conf,添加以下内容:1.`fs.file-max=10000000`2.`fs.nr_open=10000000`2。在用户级别限制编辑文件/etc/security/limits.conf,添加如下内容:1.`*hardnofile1000000`2.`*softnofile1000000`这里我们只需要保证用户级别限制不大于系统级别限制即可,否则可能会出现SSH登录系统失败的问题。修改后执行如下命令:1.`$sysctl-p`执行命令ulimit-a可以查看是否修改成功。编辑文件/etc/sysctl.conf并添加以下内容:1.`#thelengthofthesynqueue`2.`net.ipv4.tcp_max_syn_backlog=65535`3。`#tcp接受队列的长度`4.`net.core.somaxconn=65535`其中tcp_max_syn_backlog用于指定半连接SYN队列的长度。当有新的连接到来时,系统会检测半连接的SYN队列。如果队列已满,则无法处理SYN请求,增加/proc/net/netstat中ListenOverflows和ListenDrops中的统计计数somaxconn,指定满连接ACCEPT队列长度。当队列满时,客户端发送的ACK包将无法正确处理,返回错误“connection”resetbypeer”Nginx会记录错误日志“noliveupstreamswhileconnectingtoupstreams”如果出现上述错误出现这种情况,我们需要考虑增加这两项的配置临时端口由于使用Nginx作为代理,每个上游web服务的TCP连接都会占用一个临时端口,所以我们需要修改ip_local_port_range参数来修改/etc/sysctl.conf文件,添加如下内容:1.`net.ipv4.ip_local_port_range=102465535`2.`net.ipv4.ip_local_reserved_ports=8080,8081,9000-9010`其中参数ip_local_reserved_ports用于指定Nginx参数优化Nginx参数优化主要围绕nginx.conf配置文件展开,下面不再详述。工作进程Nginx的一个特点是它采用了多进程非阻塞I/O模型,所以我们一定要利用好这个:worker_processesNginx默认只有一个master进程和一个worker进程。我们需要对其进行修改,可以设置指定的个数,也可以设置为auto,即系统的CPU核数。较多数量的worker将导致进程之间对CPU资源的竞争,从而导致不必要的上下文切换。所以这里我们可以设置为CPU核心数:worker_processesautoworker_connections每个worker可以处理的并发连接数,默认值512不够用,我们适当增加:worker_connections4096Nginx支持以下I/O多路复用方式处理连接:select、poll、kqueue、epoll、rtsig、/dev/poll、eventport。它们适用于不同的操作系统,其中epoll在linux系统上效率最高:使用epollKeepAlive为了避免Nginx对web服务频繁的建立和断开连接,我们可以开启自HTTP1.1开始支持的KeepAlive长连接特性,它可以大大降低CPU和网络开销,也是我们实战中对性能提升最大的部分。Keepalive必须与proxy_http_version和proxy_set_header一起使用。参考配置如下:1.`upstreamBACKEND{`2.`保活300;`3。`服务器127.0.0.1:8081;`4.`}`5。`服务器{`6.`听8080;`7。`位置/{`8。`proxy_passhttp://BACKEND;`9.`proxy_http_version1.1;`10。`proxy_set_header连接"";`11.`}`12。`}`其中keepalive既不是超时时间也不是连接池的数量。官方解释如下:connections参数设置每个worker进程的缓存中保存到上游服务器的最大空闲keepalive连接数。当超过这个数字时,最近最少使用的连接将被关闭。可见其意思是“最大空闲长连接数”。超过这个数量的空闲长连接将被回收。当请求数稳定顺畅时,空闲长连接数会很少(接近于0),但现实中请求数不可能一直顺畅稳定。当请求数波动时,空闲长连接数也随之波动:当空闲长连接数大于配置值时,会导致那部分长连接被回收;当长连接不够时,会重新建立一个新的长连接。所以,如果这个值太小,会造成连接池频繁的回收、分配、回收。为避免出现这种情况,可根据实际情况适当调整该值。在我们的实际情况下,目标QPS为6000,web服务响应时间为200ms左右,所以需要1200个左右的长连接,keepalive值是长连接数的10%~30%的值就够了。这里我们取300,如果不想计算,直接设置为1000也是可行的。在Access-Log缓存中记录日志的I/O开销相对较高。幸运的是,Nginx支持日志缓存。我们可以利用这个功能来减少写入日志文件的频率,从而提高性能。buffer和flush参数可以结合使用来控制缓存行为:1.`access_log/var/logs/nginx-access.logbuffer=64kgzipflush=1m`其中buffer指定缓存大小,当缓冲区达到buffersize指定大小后,Nginx会将缓存的日志写入文件;flush指定缓存超时时间,当flush指定的时间到来时,也会触发将缓存日志写入文件的操作。文件描述符限制上一节修改了Linux系统的文件描述符限制。Nginx配置中也有对应的配置项:worker_rlimit_nofile。理论上这个值应该设置为/etc/security/limits.conf的值除以worker_processes的值,但实际上不可能平均分配每个进程,所以这里只需要设置为与/etc/security/limits相同即可etc/security/limits.conf1.`worker_rlimit_nofile1000000;共享Nginx性能调整。以上就是良序教程网为各位小伙伴们分享的Linux相关知识。
