Nginx性能优化
总结:
- 性能优化概述
- 压⼒测试⼯具
- 影响性能指标
- 系统性能优化
- Nginx性能优化
性能优化概述
在做性能优化前, 我们需要对如下进⾏考虑
- 当前系统结构瓶颈
- 观察指标
- 压⼒测试
- 了解业务模式
- 接⼝业务类型
- 系统层次化结构
- 性能与安全
- 性能好安全弱
- 安全好性能低
SOA
SOA粗暴理解:把系统按照实际业务,拆分成刚刚好大小的、合适的、独立部署的模块,每个模块之间相互独立。
有一个数据库,一个JavaWeb的网站客户端,一个安卓app客户端,一个IOS客户端。
现在要从这个数据库中获取注册用户列表,如果不用SOA的设计思想,那么就会这样:
JavaWeb里面写一个查询方法从数据库里面查数据然后在网页显示,安卓app里面写一个查询方法查询后在app上显示,IOS同样如此。
这里就会出现查询方法重叠了,这样的坏处很明显了,三个地方都有相同的业务代码,要改三个地方都要改,而且要改的一模一样。当然问题不止这一个。
于是乎出现了这样的设计思想,比如用Java单独创建一个工程部署在一台服务器上,并且写一个方法执行上述查询操作,然后使其他人可以通过某种途径(可以是http链接,或者是基于socket的RPC调用)访问这个方法得到返回数据,返回的数据类型是通用的json或者xml数据,就是说把这个操作封装到一个工程中去,然后暴露访问的方式,形成“服务”。比如这里就是注册用户服务,而关于注册用户的所有相关增删改查操作这个服务都会提供方法。
这样一来,JavaWeb这边可以访问这个服务然后得到数据使用,安卓和IOS这里也可以通过这个服务得到数据。而且最重要的是,要修改关于注册用户的业务方法只要改这个服务就好了,很好的解耦。同理,其他业务比如商品、广告等业务都可以单独形成服务部署在单独服务器上。
还有就是一旦哪天突然有一堆人要注册,假设这堆人仅仅只是注册而不做其他事情,其他业务比如商品、广告服务等都不忙,唯独注册这个功能压力很大,而原有的一台部署了注册服务的服务器已经承受不了这么高的并发,这时候就可以单独集群部署这个注册服务,提供多几台服务器提供注册服务,而其他服务还不忙,那就维持原样。
服务治理
- 服务治理,就是当服务越来越多,调用方也越来越多的时候,它们之间的关系就变得非常混乱,需要对这些关系进行管理。
- 还是上面的例子,假如我有一个用户服务,一开始有调用方1和调用方2来使用这个服务,后来越来越多,将近上百个调用方,这个时候作为服务方,它只知道提供服务,却不知道具体为谁提供了服务。而对于开发者来说,知道这N多调用方和N多服务方之间的关系是非常重要的。
- 所以这个时候就需要能进行服务治理的框架,比如dubbo+zookeeper,比如SpringCloud,有了服务治理功能,我们就能清晰地看到服务被谁谁谁调用,谁谁谁调用了哪些服务,哪些服务是热点服务需要配置服务器集群,而对这个服务集群的负载均衡也是服务治理可以完成的重要功能之一。
- 实际上SOA只是一种架构设计模式,
- 而SOAP、REST、RPC就是根据这种设计模式构建出来的规范,
SOAP
通俗理解就是http+xml的形式
,REST
就是http+json
的形式,RPC
是基于socket
的形式。- CXF就是典型的SOAP/REST框架,dubbo就是典型的RPC框架,SpringCloud就是遵守REST规范的生态系统。
压⼒测试⼯具
安装压⼒测试⼯具 ab
1 | yum install httpd-tools -y |
-n
: 总的请求次数-c
: 并发请求数-k
: 是否开启⻓连接
1 | ab -n 200 -c 2 http://127.0.0.1/ |
返回 :
1 | ... |
影响性能指标
- ⽹络
- ⽹络的流量
- ⽹络是否丢包
- 这些会影响http的请求与调用
- 系统
- 硬件有没有磁盘损坏,磁盘速率
- 系统负载、内存、系统稳定性
- 服务
- 连接优化、请求优化
- 根据业务形态做对应的服务设置
- 程序
- 接⼝性能
- 处理速度
- 程序执⾏效率
- 数据库
系统性能优化
- ⽂件句柄, Linux⼀切皆⽂件,⽂件句柄可以理解为就是⼀个索引
- ⽂件句柄会随着我们进程的调用频繁增加
- 系统默认对⽂件句柄有限制,不能让⼀个进程无限的调用
- 需要限制每个进程和每个服务使用多大的⽂件句柄
- ⽂件句柄是必须要调整的优化参数
- 设置方式
- 系统全局性修改
- 用户局部性修改
- 进程局部性修改
修改root用户的文件描述符限制
1 | vim /etc/security/limits.conf |
1 | //针对root用户 |
- root用户
- soft : 当文件描述符数量超出最大限制的时候会
发出提醒
- hard : 当文件描述符数量超出最大限制的时候
直接中断旧的文件描述符
- nofile : ⽂件描述符的数量配置项
- 65535最⼤⼤⼩
修改全部用户的文件描述符限制
和root用户一样 , 修改/etc/security/limits.conf
文件
1 | vim /etc/security/limits.conf |
1 | //所有用户, 全局 |
修改Nginx进程的文件描述符限制
配置/etc/nginx/nginx.conf
的worker_rlimit_nofile
选项
1 | vim /etc/nginx/nginx.conf |
1 | user nginx |
Nginx性能优化
CPU 亲和, 减少进程之间不断频繁迁移, 减少性能损耗
查看当前 CPU 物理状态
1 | lscpu | grep "CPU(s)" |
- 2颗物理cpu,
- 每颗cpu12核⼼,
- 总共24核⼼
将 Nginx worker 进程绑到不同的核心上
方式一
配置/etc/nginx/nginx.conf
的worker_processes
选项和worker_cpu_affinity
选项
1 | # 启动多少worker进程, 官方建议和cpu核心⼀致, |
方式二
1 | worker_processes 2; |
方式三 , 最佳绑定
1 | worker_processes auto; |
这里如果nginx是docker的,可以由docker容器绑到固定cpu上
查看 nginx worker 进程绑定至对应 cpu
1 | ps -eo pid,args,psr|grep [n]ginx |
Nginx 通用优化配置文件
1 | # 为了防止入侵,user设置为普通用户 |