目录
4.ss -s 发现socket统计信息中有大量的timewait连接.
jmeter并发数设置为50时,建立连接的只有5个.closed+timewait状态的连接有26个
发现有大量nf_conntrack:table full. dropping packet信息:连接跟踪表已满,开
7.查看nf_conntrack_max和nf_conntrack_count配置:
sysctl net.netfilter.nf_conntrack_max
sysctl net.netfilter.nf_conntrack_count
sysctl -w net.netfilter.nf_conntrack_max=1048576
/usr/local/nginx/sbin/nginx -s reload
吞吐量从个位数上升到了1500+,响应时间和错误率也降了下来.
TCP优化 | ||
TCP优化方法 | 内核选项 | 参考设置 |
增大处于time_wait状态的连接数量 | net.ipv4.tcp_max_tw_buckets | 1048576 |
缩短处于time_wait状态的超时时间 | net.ipv4.tcp_fin_timeout | 15 |
允许time_wait状态占用的端口还可以用到新的连接中 | net.ipv4.tcp_tw_reuse | 1 |
增大本地端口号的范围 | net.ipv4.ip_local_port_range | 10000 65535 |
增加系统和应用程序的最大文件描述符数 | fs.nr_open(系统),systemtap配置文件的Limit Nofile | 1048576 |
增加半连接的最大数量 | net.ipv4.tcp_max_syn_backlog | 16384 |
开启SYNcookies | net.ipv4.tcp_syncookies | 1 |
缩短发送keepalive探测包的间隔时间 | net.ipv4.tcp_keepalive_intvl | 30 |
减少keepalive探测失败后通知应用程序前的重试次数 | net.ipv4.tcp_keepalive_probes | 3 |
缩短最后一次数据包到keepalive探测包的间隔时间 | net.ipv4.tcp_keepalive_time | 600 |
性能测试时nginx应用访问吞吐量下降至很低时该如何定位问题并优化?
1.查看发压机性能,无异常.
2.top查看服务器系统负载
系统cpu,mem,I/O负载低
3.ping服务器网络连通性
发现无异常.
查看socket连接信息
4.ss -s 发现socket统计信息中有大量的timewait连接.
获取 socket 统计信息
-h, --help 帮助
-V, --version 显示版本号
-t, --tcp 显示 TCP 协议的 sockets
-u, --udp 显示 UDP 协议的 sockets
-x, --unix 显示 unix domain sockets,与 -f 选项相同
-n, --numeric 不解析服务的名称,如 "22" 端口不会显示成 "ssh"
-l, --listening 只显示处于监听状态的端口
-p, --processes 显示监听端口的进程(Ubuntu 上需要 sudo)
-a, --all 对 TCP 协议来说,既包含监听的端口,也包含建立的连接
-r, --resolve 把 IP 解释为域名,把端口号解释为协议名称
5.考虑优化连接数
jmeter并发数设置为50时,建立连接的只有5个.closed+timewait状态的连接有26个
6.dmesg | tail 查看系统日志
发现有大量nf_conntrack:table full. dropping packet信息:连接跟踪表已满,开
始丢包!
这种信息一般是2中内核选项导致:
1.连接跟踪数的最大限制:nf_conntrack_max
2.nf_conntrack_count
7.查看nf_conntrack_max和nf_conntrack_count配置:
sysctl net.netfilter.nf_conntrack_max
sysctl net.netfilter.nf_conntrack_count
8.增大nf_conntrack_max配置:
sysctl -w net.netfilter.nf_conntrack_max=1048576
9.重启nginx
/usr/local/nginx/sbin/nginx -s reload
10.调优后复测
吞吐量从个位数上升到了1500+,响应时间和错误率也降了下来.但是吞吐量一段时间后又开始下降.说明TPS不稳定.
应用程序服务端处理情况查看
查看应用日志:tail -f php-fpm.log
发现很多告警信息:pm.max_children:表示php进程的最大数量,此处提示最大值为5(进程数越多,同时处理的请求数也就越多,但不是无限制的多,每个进程都会消耗系统资源)
2.查看系统内存使用情况:free -m
内存充足
3.查看应用进程线程数
vim /etc/php-fpm.d/www.conf
修改后重启应用服务
4.调优后复测,发现该警告消除,但是吞吐量现象并未改变.
5.netstat -s | grep socket查看系统socket统计信息
socket overflowed:套接字队列溢出
socket dropped:套接字丢包
6.压测时对比套接字统计信息,发现有套接字丢包发生,且是因为套接字队列溢出导致.
7.根据linux网络栈层次,先查看套接字连接数量
nginx监听队列长度是现在是10,php监听队列长度现在是128.
1.查看nginx监听队列配置:cat /usr/local/nginx/conf/nginx.conf | grep backlog
2.查看应用的监听队列配置:cat /usr/local/php/etc/php-fpm.d/www.conf | grep backlog
3.nginx监听队列配置长度是10,应用的监听队列长度配置是511.此处说明nginx监听队列已满,导致socket溢出.
4.查看系统套接字监听队列长度上限:cat /proc/sys/net/core/somaxconn
得出系统和nginx监听队列长度都是10
5.修改nginx和php应用套接字监听队列长度:
vim /usr/local/nginx/conf/nginx.conf:10-->8192
vim /usr/local/php/etc/php-fpm.d/www.conf:511--->8192
6.修改系统套接字监听队列长度上限:sysctl -w net.core.somaxconn=65500
7.重启nginx和PHP服务/usr/local/nginx/sbin/nginx -s reload
8.回归压测验证调优是否有效
8.调优后未发现性能改善
1.ss -s查看系统套接字统计信息
发现timewait状态的连接数量更多 ,达到了9469
2.netstat -ae|grep "TIME_WAIT" |wc -l
发现很多timewait状态连接占用的端口都没有被回收,被继续占用,导致系统端口消耗过多.
3.修改系统机制,回收time_wait状态连接占用的端口
vim /etc/sysctl.conf
tcp_syncookies=1:当syn等待队列溢出时,启用cookies处理,可防范少量syn攻击.默认为0,表示关闭.
tcp_tw_reuse=1:开启重用,允许将time_wait状态的socket重新用于新的tcp连接.
tcp_tw_recycle=1:将tcp连接中的time_wait状态的socket快速回收.
tcp_max_tw_buckets:增大处于time_wait状态的连接数量
4.生效修改的配置:/sbin/sysctl -p
5.增大系统可用的随机端口:sysctl -w net.ipv4.ip_local_port_range="10000 65535"
6.恢复复测验证调优是否有效:有效.
总结:
经过优化,TPS能从最初的3增加到3000左右,性能问题的分析调优,应结合网络栈对应用和系统进行.
1.从连接数开始.
2.中间件(Nginx进程优化)
3.套接字优化
4.端口优化,比如优化time_wait的情况.