12 Nginx 性能优化与压测工具


性能 优化概述

  • 在做性能优化前, 我们需要对如下进行考虑
1
2
3
4
5
6
7
8
9
10
11
1.当前系统结构瓶颈
观察指标
压力测试 其实压力测试精准度 并不是很高

2.了解业务模式
接口业务类型
系统层次化结构 SOA 松耦合

3.性能与安全
性能好安全弱
安全好性能低

压力测试工具 ab

安装压力测试工具ab

1
[root@proxy code]# yum install httpd-tools -y
1
2
3
4
5
6
# 了解压测工具使用方式
[root@proxy code]# ab -n 200 -c 2 http://127.0.0.1/

# -n总的请求次数
# -c并发请求数
# -k是否开启长连接

压测宝

1
2
3
# 调取全国浏览 检测你的网站

http://www.yacebao.com/trial.shtml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
server {
listen 80;
server_name localhost;

set $ip 0;
if ($http_x_forward_for ~ 211.161.160.201){
set $ip 1;
}
if ($remote_addr ~ 211.161.160.201){
set $ip 1;
}
# 如果$ip值为0,则返回403, 否则允许访问
location /hello {
if ($ip = "0"){
return 403;
}
default_type application/json;
return 200 '{"status":"success"}';
}

tomcat 处理静态比nginx处理 弱很多

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# ab只能参考
[root@nginx-lua conf.d]# cat jsp.conf
server {
server_name localhost;
listen 80;
location / {
root /soft/code;
try_files $uri @java_page;
index index.jsp index.html;
}
location @java_page{
proxy_pass http://192.168.56.20:8080;
}
}

//分别给Nginx准备静态网站
[root@nginx-lua ~]# cat /soft/code/bgx.html
<h1> Ab Load </h1>
//给Tomcat准备静态网站文件
[root@tomcat-node1-20 ROOT]# cat /soft/tomcat-8080/webapps/ROOT/bgx.html
<h1> Ab Load </h1>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 使用ab工具进行压力测试
//进行压力测试
[root@Nginx conf.d]# ab -n2000 -c2 http://127.0.0.1/bgx.html
...
Server Software: nginx/1.12.2
Server Hostname: 127.0.0.1
Server Port: 80

Document Path: /bgx.html
Document Length: 19 bytes

Concurrency Level: 200
# 总花费总时长
Time taken for tests: 1.013 seconds
# 总请求数
Complete requests: 2000
# 请求失败数
Failed requests: 0
Write errors: 0
Total transferred: 510000 bytes
HTML transferred: 38000 bytes
# 每秒多少请求/s(总请求出/总共完成的时间)
Requests per second: 9333.23 [#/sec] (mean)
# 客户端访问服务端, 单个请求所需花费的时间
Time per request: 101.315 [ms] (mean)
# 服务端处理请求的时间
Time per request: 0.507 [ms] (mean, across all concurrent requests)
# 判断网络传输速率, 观察网络是否存在瓶颈
Transfer rate: 491.58 [Kbytes/sec] received
1
2
3
4
5
6
7
8
9
10
11
12
13
# 将nginx下的bgx文件移走, 再次压测会由tomcat进行处理

Concurrency Level: 200
Time taken for tests: 1.028 seconds
Complete requests: 2000
Failed requests: 0
Write errors: 0
Total transferred: 510000 bytes
HTML transferred: 38000 bytes
Requests per second: 1945.09 [#/sec] (mean)
Time per request: 102.823 [ms] (mean)
Time per request: 0.514 [ms] (mean, across all concurrent requests)
Transfer rate: 484.37 [Kbytes/sec] received

影响性能的指标

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
影响性能方便整体关注

1.网络
网络的流量 每秒带宽 : 1M带宽 / 8 : 流量峰值200M
网络是否丢包
这些会影响http的请求与调用
2.系统
硬件有没有磁盘损坏,磁盘速率
系统负载、内存、系统稳定性 -> zabbix
3.服务
连接优化、请求优化 -> Nginx
根据业务形态做对应的服务设置
4.程序
接口性能
处理速度
程序执行效率
5.数据库
慢查询
读写性能
数据缓存
每个架构服务与服务之间都或多或少有一些关联, 我们需要将整个架构进行分层, 找到对应系统或服务的短板, 然后进行优化

系统性能优化

1
2
3
4
5
6
7
8
9
10
文件句柄, Linux一切皆文件,文件句柄可以理解为就是一个索引
文件句柄会随着我们进程的调用频繁增加
系统默认对文件句柄有限制,不能让一个进程无限的调用
需要限制每个进程和每个服务使用多大的文件句柄
文件句柄是必须要调整的优化参数 系统层面必须优化

设置方式
系统全局性修改
用户局部性修改
进程局部性修改
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
vim /etc/security/limits.conf
# 针对root用户
root soft nofile 65535
root hard nofile 65535
# 所有用户, 全局
* soft nofile 25535
* hard nofile 25535

# 对于Nginx进程
worker_rlimit_nofile 45535;

# root用户
# soft提醒
# hard限制
# nofile文件数配置项
# 65535最大大小
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 虚拟机查看
[root@linux-node1 ~]# ulimit -n
1024

[root@linux-node1 ~]# vim /etc/security/limits.conf
root soft nofile 65535
root hard nofile 65535
* soft nofile 25535
* hard nofile 25535

[root@linux-node1 ~]# source /etc/security/limits.conf
# 重新连接
[root@linux-node1 ~]# ulimit -n
65535
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# 阿里云服务器

[root@proxy code]# cat /etc/security/limits.conf

# End of file
root soft nofile 65535
root hard nofile 65535
* soft nofile 65535
* hard nofile 65535

# 其中, nofile是文件句柄数量,线程句柄也属于它。nproc是进程数量。


[root@proxy code]# ps -aux |grep nginx
root 6389 0.0 0.1 64524 3444 ? Ss 10:39 0:00 nginx: master process /etc/nginx/sbin/nginx
nobody 19303 0.0 0.1 65168 3416 ? S 15:14 0:00 nginx: worker process
root 19392 0.0 0.0 112660 968 pts/0 R+ 16:28 0:00 grep --color=auto nginx
[root@proxy code]# cat /proc/6389/limits
Limit Soft Limit Hard Limit Units
Max cpu time unlimited unlimited seconds
Max file size unlimited unlimited bytes
Max data size unlimited unlimited bytes
Max stack size 8388608 unlimited bytes
Max core file size 0 unlimited bytes
Max resident set unlimited unlimited bytes
Max processes 7283 7283 processes
Max open files 65535 65535 files
Max locked memory 65536 65536 bytes
Max address space unlimited unlimited bytes
Max file locks unlimited unlimited locks
Max pending signals 7283 7283 signals
Max msgqueue size 819200 819200 bytes
Max nice priority 0 0
Max realtime priority 0 0
Max realtime timeout unlimited unlimited us

Nginx性能优化

cpu 亲和

1
CPU亲和, 减少进程之间不断频繁迁移, 减少性能损耗
1
2
3
4
5
6
7
8
1.查看当前CPU物理状态
[root@nginx ~]# lscpu |grep "CPU(s)"
CPU(s): 24
On-line CPU(s) list: 0-23
NUMA node0 CPU(s): 0,2,4,6,8,10,12,14,16,18,20,22
NUMA node1 CPU(s): 1,3,5,7,9,11,13,15,17,19,21,23

# 2颗物理cpu,每颗cpu12核心, 总共24核心
1
2
3
4
5
6
7
2. 将Nginx worker进程绑到不同的核心上
//启动多少worker进程, 官方建议和cpu核心一致, 第一种绑定组合方式
#worker_processes 24;

# 最佳方式绑定方式 1.9版本之后推出
worker_processes auto;
worker_cpu_affinity auto;
1
2
3
4
5
6
[root@linux-node1 ~]# ps -ef|grep nginx

[root@linux-node1 ~]# ps -eo pid,args,psr|grep [n]ginx
1436 nginx: master process /usr/ 0
1458 nginx: worker process 0
1459 nginx: worker process 1

通用Nginx配置模板文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# Nginx通用优化配置文件

[root@nginx ~]# cat nginx.conf
user nginx;
worker_processes auto;
worker_cpu_affinity auto;

error_log /var/log/nginx/error.log warn;
pid /run/nginx.pid;
#调整至1w以上,负荷较高建议2-3w以上
worker_rlimit_nofile 35535;

events {
use epoll;
# 限制每个进程能处理多少个连接请求,10240x16(worker_processes) # 每个work进程接收连接请求10240
worker_connections 10240;
}

http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
# 统一使用utf-8字符集
charset utf-8;

log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
# http层配置 每个server都会打印 , 每个server可以加上对应的打印
# 写日志会占用读写I/O
access_log /var/log/nginx/access.log main;

# Core module 文件的高效传输
sendfile on;
# 静态资源服务器建议打开
tcp_nopush on;
# 动态资源服务建议打开,需要打开keepalived
tcp_nodelay on;
keepalive_timeout 65;

# Gzip module
gzip on;
gzip_disable "MSIE [1-6]\."; # IE6浏览器版本不支压缩 关闭
gzip_http_version 1.1;

# Virtal Server
include /etc/nginx/conf.d/*.conf;
}
1
2
3
4
5
proxy-cache
浏览器缓存
server-hasp

有的优化 不能在全局,需要单独server进行

参考优化大全