女主宣言

Web服务性能调优是一项系统工程,涵盖许多方面,其中某一环节做的好并不能够保证整体性能好;但是如果某个环节做的不好,那么整体性能必然不会好。

可以调优的配置有很多,绝大多数情况下我们不需要追求极致的性能,只需把短板补齐,使之能够满足我们需要就可以了。

PS:丰富的一线技术、多元化的表现形式,尽在“360云计算”,点关注哦!

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中的 ListenOverflowsListenDrops中增加统计计数

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 = 1024 65535

  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复用方法处理连接:selectpollkqueueepollrtsig/dev/polleventport。它们分别适用于不同的操作系统,其中 epoll是Linux系统上面效率最高的:    use epoll

KeepAlive

为了避免从Nginx到Web服务频繁的建立、断开连接,我们可以启用从HTTP 1.1开始支持的KeepAlive长连接特性,它可以大幅减少CPU和网络开销,在我们的实战中也是对性能提高最大的一环。keepalive必须和 proxy_http_versionproxy_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支持日志缓存,我们可以利用这个功能,降低写日志文件的频率,从而提高性能。可以将 bufferflush两个参数结合使用来控制缓存行为:

  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能够优化的地方非常多,本文只涉及到了其中很小的一些方面,但也足够满足我们的使用场景了。

360云计算

由360云平台团队打造的技术分享公众号,内容涉及数据库、大数据、微服务、容器、AIOps、IoT等众多技术领域,通过夯实的技术积累和丰富的一线实战经验,为你带来最有料的技术分享

浅谈Nginx性能调优相关推荐

  1. 服务器:浅谈 Nginx 性能调优,太实用了!

    Linux系统参数优化 下文中提到的一些配置,需要较新的Linux(2.6以上)内核才能够支持,笔者使用的CentOS 7.4,内核版本3.10,如果不满足需要的话,最好进行相应的升级,毕竟打补丁是件 ...

  2. linux ofstream open,浅谈linux性能调优之十一:内存分配管理

    linux下内存分配的管理主要通过内核参数来控制: 1.与容量相关的内存可调参数 以下参数位于 proc 文件系统的 /proc/sys/vm/ 目录中. overcommit_memory :规定决 ...

  3. 浅谈linux性能调优之六:IO调度算法的选择

    2019独角兽企业重金招聘Python工程师标准>>> 在网上找到这个资料,挺详细的 ! 一) I/O调度程序的总结 1) 当向设备写入数据块或是从设备读出数据块时,请求都被安置在一 ...

  4. linux分区格式化慢,浅谈linux性能调优之三:分区格式化之前的考虑

    在Linux中进行格式化必须考虑Block与inode,Block还好理解,它是磁盘可以记录的最小单位,是由数个扇区组成,所以大小通常为n*512Bytes,例如4K. 那么inode是什么呢 ? B ...

  5. Nginx性能调优,解决C10K问题

    公司的技术总监最近出了一道架构方面的问题让我们同组的开发人员设计,题目是这样的:有个签到功能,需要记录每个⽤户每年每⼀天的签到情况.假设⽤户量在千万,甚⾄亿级,该如何设计. 思考这个问题后,我给出的设 ...

  6. 【网站架构】Nginx负载均衡宕机怎么办?Nginx性能调优、集群、高可用方案

    ​ 大家好,欢迎来到停止重构的频道. 本期,我们讨论Nginx的性能调优. Nginx一般是作为网站系统的反向代理或负载均衡,但这里有一个问题,负载均衡可以绑定多个后端服务器. 一个后端服务器宕机后, ...

  7. Nginx 性能调优实战

    来自:Linux社区 1.Nginx运行工作进程数量 Nginx运行工作进程个数一般设置CPU的核心或者核心数x2.如果不了解cpu的核数,可以top命令之后按1看出来,也可以查看/proc/cpui ...

  8. 浅谈Oracle数据库调优(1)

    一.常见的调优问题 架构: 数据库的架构设计(单机还是rac/中间件还是MTS/容灾方案/备份策略/存储配置/等等) Session的管理(通常跟中间件或者业务处理方式有关) 开发 : 关系设计(通常 ...

  9. nginx代理转发_学了三年的性能调优,你还不懂Nginx?怎么跳槽涨薪

    前言 根据 Netcraft 公布的最新的(2019年10月)Web 服务器调查报告,Nginx 的市场份额达到了 32.69%,毫无争议地成为了最流行的 Web 服务器.这主要得益于 Nginx 在 ...

最新文章

  1. 6 redhat 查看rtc时间_Linux EasyStack-Redhat安装Docker
  2. jboss启动多个实例
  3. 中台之上(二):为什么业务架构存在20多年,技术人员还觉得它有点虚?
  4. java8根据某个id删选_Java 8可选
  5. bootstrap guide
  6. javascript判断是否手机设备+滑动事件
  7. u盘在磁盘管理可以显示 但是电脑中找不到_关于U盘你不知道的一些知识
  8. 2. with check option能起什么作用?_【科普】专家教路:面膜护肤到底有什么用?
  9. i++与++i的区别+汇编分析
  10. CAS学习笔记(三)—— SERVER登录后用户信息的返回
  11. 计算机大学毕业好考公务员,哪些大学的毕业生更容易考上公务员?
  12. Effective Java 学习笔记之二
  13. Mac M1 百度网盘客户端无法打开,网络连接不上
  14. 这个游戏的名字叫:哒哒哒哒哒哒
  15. 闲置手机不要换锅换盆,你会后悔的
  16. java简单的增删改查项目 ATM机
  17. odoo企业版与社区版区别(odoo14企业版)
  18. 从富士康普工转行产品经理,月薪翻了3倍
  19. OPENV接收和发送串口的数据
  20. 鸡肋的Redis事务

热门文章

  1. js检查数据类型的方法
  2. java高效获取大文件的行数
  3. user-agent java_user-agent
  4. Java学习前,需要掌握的一些基础知识
  5. mysql 单数据库设置编码,mysql数据库编码设置
  6. 包含几通道数据_温度采集,无处不测!「数据采集」
  7. java 高德地图数据库_【爬虫】Java关于高德地图爬取数据
  8. container view_高级UI晋升之常用View(三)中篇
  9. luci L大_智慧城市大讲堂 l 大咖说5G智慧大交通
  10. java八大基本类型介绍