原 Nginx网络架构实战学习笔记(七):nginx性能优化小总结

文章目录

  • 优化思路:
  • 优化过程
  • Php-mysql的优化
    • Nginx+phjp+mysql+nginx

压力测试:
模拟 前0-10万是热数据,
10-20万是冷门数据

请求热数据 0-10,请求9次
请求准予数据 请求1次, -----100万次的请求.

优化思路:

nginx响应请求
1:建立socket连接
2: 打开文件,并沿socket返回.

排查问题,也要注意观察这两点,
主要从系统的dmesg ,和nginx的error.log来观察

优化过程

1:判断nginx的瓶颈

1.1: 首先把ab测试端的性能提高,使之能高并发的请求.
易出问题: too many open files
原因 : ab在压力测试时,打开的socket过多
解决: ulimit -n 30000 (重启失效)
观察结果: nginx 不需要特殊优化的情况下, 5000个连接,1秒内响应.
满足要求,但 wating状态的连接过多.

1.2: 解决waiting进程过多的问题.
解决办法: keepalive_timeout = 0;
即: 请求结果后,不保留tcp连接.
在高并发的情况下, keepalive会占据大量的socket连接.
结果: waiting状态的连接明显减少.

1.3: 解决服务端 too many open files
分析: nginx要响应,
1是要建立socket连接,
2 是要读本地文件
这两个者限制.

原 Nginx网络架构实战学习笔记(七):nginx性能优化小总结_第1张图片
由上图可看出,nginx的问题容易出在2点上:
1: nginx接受的tcp连接多,能否建立起来?
2: nginx响应过程,要打开许多文件 ,能否打开?

第1个问题: 在内核层面(见下)
第2个问题 (见下)

系统内核层面:
net.core.somaxconn = 4096 允许等待中的监听
net.ipv4.tcp_tw_recycle = 1 tcp连接快速回收
net.ipv4.tcp_tw_reuse = 1 tcp连接重用
net.ipv4.tcp_syncookies = 0 不抵御洪水攻击
ulimit -n 30000

Nginx层面:
解决: nginx.conf 下面: work_connection 加大
worker_connections 10240;
Worker_rlimit_nofiles 10000;
Keepalive_timeout 0;

Nginx---->php-fpm之间的优化
原 Nginx网络架构实战学习笔记(七):nginx性能优化小总结_第2张图片
如上图,在很多个nginx来访问fpm时, fpm的进程要是不够用, 会生成子进程.

生成子进程需要内核来调度,比较耗时,
如果网站并发比较大,
我们可以用静态方式一次性生成若干子进程,保持在内存中.

方法 – 修改php-fpm.conf
Pm = static 让fpm进程始终保持,不要动态生成
Pm.max_children= 32 始终保持的子进程数量

Php-mysql的优化

Linux机器下 ,php 通过IP连接其他mysql服务器时,容易出的问题
能ping能,但connect不到.
原 Nginx网络架构实战学习笔记(七):nginx性能优化小总结_第3张图片
一般是由:mysql服务器的防火墙影响的.

并发1万连接,响应时间过长.

优化思路: 同上的nginx
1: 内核层面,加大连接数,并加快tcp回收
2: mysql层面,增大连接数
3: php层面,用长连接,节省连接数
4: 用memcached缓存,减轻mysql负担

具体:
1.1 , PHP服务器增大 ulimint -n选项
1.2 mysql服务器内核配置
添加或修改如下选项
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_syncookies = 0

syscttl -p 使修改立即生效

2.1 修改mysql.cnf
Vi /etc/my.conf
service mysqld restart 重启mysql

3.1 PHP层面 ,用长连接
Mysql_connect —> mysql_pconnect
注: pconnect 在PHP以apache模块的形式存在时,无效果.

Nginx+phjp+mysql+nginx

在引入memcached后,性能提升不明显,甚至还略有下降

memcached使50%的请求变快了,但是一部分,反倒慢了.
原因在于–PHP->memcached也要建立tcp连接,代价挺高,
但缓存了数据之后,就省去了mysql的查询时间.

总结: memcached适合存复杂的sql,尤其是连接查询/模糊查询的sql结果

Memcached服务器的优化(集中在内核的ipv4设置上,不再重复)

转载于:https://www.cnblogs.com/LeesinDong/p/10835294.html

你可能感兴趣的:(原 Nginx网络架构实战学习笔记(七):nginx性能优化小总结)