浅谈Nginx性能调优
点击上方“开源Linux”,选择“设为星标”
回复“学习”获取独家整理的学习资料!
Linux系统参数优化
下文中提到的一些配置,需要较新的Linux(2.6以上)内核才能够支持,笔者使用的CentOS 7.4,内核版本3.10,如果不满足需要的话,最好进行相应的升级,毕竟打补丁是件费力不讨好的事情。对于系统层面的调优,通常我们修改文件描述符限制、缓冲区队列长度以及临时端口数量就可以了。
文件描述符限制
由于每个TCP连接都要占用一个文件描述符,一旦文件描述符耗尽,新的连接到来就会返回“Too many open files”这样的错误,为了提高性能,我们需要对其进行修改:1.系统层级的限制 编辑文件 /etc/sysctl.conf
,添加如下内容:
1. `fs.file-max =10000000`
2. `fs.nr_open =10000000`
2.用户层级的限制 编辑文件 /etc/security/limits.conf
,添加以下内容:
1. `* hard nofile 1000000`
2. `* soft nofile 1000000`
这里我们只要保证用户层级限制不大于系统层级限制就可以了,否则可能会出现无法通过SSH登录系统的问题。修改完毕执行如下命令:
1. `$ sysctl -p`
可以通过执行命令 ulimit -a
查看是否修改成功。
TCP连接队列长度
编辑文件 /etc/sysctl.conf
,添加如下内容:
1. `# The length of the syn quene`
2. `net.ipv4.tcp_max_syn_backlog =65535`
3. `# The length of the tcp accept queue`
4. `net.core.somaxconn =65535`
其中 tcp_max_syn_backlog
用于指定半连接SYN队列长度,当新连接到来时,系统会检测半连接SYN队列,如果队列已满,则无法处理该SYN请求,并在 /proc/net/netstat
中的 ListenOverflows
和 ListenDrops
中增加统计计数somaxconn
用于指定全连接ACCEPT队列长度,当该队列满了以后,客户端发送的ACK包将无法被正确处理,并返回错误"connection reset by peer"Nginx则会记录一条error日志"no live upstreams while connecting to upstreams"如果出现以上错误,我们需要考虑增大这两项的配置。
临时端口
由于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_processes
默认的Nginx只有一个master进程一个worker进程,我们需要对其进行修改,可以设置为指定的个数,也可以设置为auto
,即系统的CPU核数。更多的worker数量将导致进程间竞争cpu资源,从而带来不必要的上下文切换。因此这里我们将它设置为cpu的核数即可:worker_processes auto
worker_connections
每个worker可以处理的并发连接数,默认值512不是很够用,我们适当将它增大:worker_connections 4096
Nginx支持以下I/O复用方法处理连接:
select
、poll
、kqueue
、epoll
、rtsig
、/dev/poll
、eventport
。它们分别适用于不同的操作系统,其中epoll
是Linux系统上面效率最高的:use epoll
KeepAlive
为了避免从Nginx到Web服务频繁的建立、断开连接,我们可以启用从HTTP 1.1开始支持的KeepAlive长连接特性,它可以大幅减少CPU和网络开销,在我们的实战中也是对性能提高最大的一环。keepalive
必须和 proxy_http_version
与 proxy_set_header
结合使用, 参考配置如下:
1. `upstream BACKEND {`
2. ` keepalive 300;`
3. ` server 127.0.0.1:8081;`
4. `}`
5. `server {`
6. ` listen 8080;`
7. ` location /{`
8. ` proxy_pass http://BACKEND;`
9. ` proxy_http_version 1.1;`
10. ` proxy_set_header Connection"";`
11. `}`
12. `}`
其中 keepalive
既非timeout,也不是连接池数量,官方解释如下:
The connections parameter sets the maximum number of idle keepalive connections to upstream servers that are preserved in the cache of each worker process. When this number is exceeded, the least recently used connections are closed.
可以看出它的意思是“最大空闲长连接数量”,超出这个数量的空闲长连接将被回收,当请求数量稳定而平滑时,空闲长连接数量将会非常小(接近于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.log buffer=64k gzip flush=1m`
其中 buffer
制定了缓存大小,当缓冲区达到 buffer
所指定的大小时,Nginx就会将缓存起来的日志写到文件中;flush
指定了缓存超时时间,当 flush
指定的时间到达时,也会触发缓存日志写入文件操作。
文件描述符限制
上一节中已经对Linux系统的文件描述符限制进行了修改,Nginx配置中同样有相应的配置项:worker_rlimit_nofile
, 理论上这个值应该设置为 /etc/security/limits.conf
中的值除以 worker_processes
, 但实际中不可能每个进程均匀分配,所以这里只要设置成和 /etc/security/limits.conf
一样就可以了
1. `worker_rlimit_nofile 1000000;`
总结
以上就是笔者进行Nginx调优的一些经验,可以看出基本是围绕Nginx的Error日志展开的,之后又对一些比较大的性能瓶颈进行了一些改进。Nginx能够优化的地方非常多,本文只涉及到了其中很小的一些方面,但也足够满足我们的使用场景了。
链接:https://os.51cto.com/art/202011/633212.htm来自:运维派
- End -
关注「开源Linux」加星标,提升IT技能
浅谈Nginx性能调优的更多相关文章
- 浅谈Apache性能调优
做了很多WEB系统性能测试,都知道了解测试环境,服务器硬件配置,web服务器参数配置是我们开始测试前首先要做的事情. 针对并发数量来说,不同数量级的用户并发,需求的服务器和web服务参数肯定是不同的. ...
- Nginx性能调优
[调优]Nginx性能调优 一.Nginx优化配置 1.主配置文件优化:# vi /usr/local/nginx/conf/nginx.conf------------------------- ...
- Nginx 性能调优
原文地址:http://nginx.com/blog/tuning-nginx/ Tuning NGINX for Performance Nginx 性能调优 NGINX is well known ...
- nginx性能调优关键功能
1. expires缓存时间优化作用:通过在服务器上设置合理的expires缓存时间.适合缓存的类型:静态文件:html,图片,js,css,xml都是缓存对象.优点:能够让用户不必每次访问都要重新 ...
- Nginx性能调优之buffer参数设置
Nginx 的缓存功能有:proxy_cache / fastcgi_cache proxy_cache的作用是缓存后端服务器的内容,可能是任何内容,包括静态的和动态.fastcgi_cache的作用 ...
- 【调优】Nginx性能调优
一.Nginx优化配置 1.主配置文件优化:# vi /usr/local/nginx/conf/nginx.conf----------------------------------------- ...
- 浅谈Spark应用程序的性能调优
浅谈Spark应用程序的性能调优 :http://geek.csdn.net/news/detail/51819 下面列出的这些API会导致Shuffle操作,是数据倾斜可能发生的关键点所在 1. g ...
- Tomcat+Nginx+Lvs部署方案与性能调优
立项要求:用户登录并发数达到1000vuser.原项目设计没有Nginx和LVS,经过性能测试并发数最高到400,就报响应超时,且系统资源消耗严重.经过和架构师商议决定先加入Nginx解决负载均衡处理 ...
- nginx+keepalived+tomcat之tomcat性能调优
body{ font-family: Nyala; font-size: 10.5pt; line-height: 1.5;}html, body{ color: ; background-color ...
随机推荐
- 三、MyCat主要配置介绍
一.配置文件 1.server.xml Mycat的配置文件,设置账号.参数等2.schema.xml Mycat对应的物理数据库和数据库表的配置3.rule.xml Mycat分片(分库分表)规则 ...
- 学习Apache(四)
介绍 Apache HTTP 服务器被设计为一个功能强大,并且灵活的 web 服务器, 可以在很多平台与环境中工作.不同平台和不同的环境往往需要不同 的特性,或可能以不同的方式实现相同的特性最有效率. ...
- 我常用的插件之“Mybatis Log plugin”sql日志格式转化
前言 今天重新装了IDEA2020,顺带重装了一些插件,毕竟这些插件都是习惯一直在用,其中一款就是Mybatis Log plugin,按照往常的思路,在IDEA插件市场搜索安装,艹,眼睛一瞟,竟然收 ...
- scrapy 如何链接有密码的redis scrapy-redis 设置redis 密码 scrapy-redis如何为redis配置密码
# 使用scrapy_redis的调度器SCHEDULER = "scrapy_redis.scheduler.Scheduler"# 使用scrapy_redis的去重机制DUP ...
- 2_稳定性分析_极点_Stability
在复平面内 控制理论就是设计控制器D使输入输出之间的传递函数的极点落在复平面的左侧,在现代控制理论中研究状态矩阵的特征值判断稳定性
- 转载:介绍AD另外一种奇葩的多通道复用的方法
原文链接:http://www.eda365.com/forum.php?_dsign=74fe4957&mod=viewthread&page=1&tid=110710 在设 ...
- 开发一个自己的 CSS 框架(四)
这一节,我们来讲规矩,谈网格,做人可以不要脸,不讲规矩,不讲道理(特指傲娇兽),但底线还是要有的,如同网格一样,不能超出. jeet 这里我们别人封装好的模块,不过呢,我们也会详细介绍一下原理.首先我 ...
- 解决 css 浮动后 父元素高度失效问题
应用场景 子元素标签使用 浮动后,会出现浮在父元素上层,脱离了.导致父元素没办法根据子元素的高度而变化,提供以下解决方案. 解决代码 把 '.clearfix ' Class 样式添加到 父元素即可. ...
- Postman大势已去
作为一名前端,日常开发过程中除了写业务代码,前后端联调更是重要的一环.但这一环却往往是整个开发中最繁琐也最累人的一环.任谁都想早点下班,然而提升联调效率并不是个纯技术相关的问题,而是需要有良好工作流程 ...
- 6.Jenkins进阶之流水线pipeline语法入门学习(1)
目录一览: 0x00 前言简述 Pipeline 介绍 Pipeline 基础知识 Pipeline 扩展共享库 BlueOcean 介绍 0x01 Pipeline Syntax (0) Groov ...