性能瓶颈分析—Nginx
nginx基本运行原理
- 用户连接master中开的端口,控制connect
- control连接worker
- 有多少worker就有多少线程
- worker连接其他服务器
nginx配置参数介绍
-
全局配置
- worker_processes:worker进程数。最优值取决于CPU核的数量、存储数据的硬盘数量及负载模式。
- worker_rlimit_nofile:worker进程的最大打开文件数限制。避免“too many open files”问题(同时要更改系统连接数,使用ulimit -n查看)
-
Evebts模块
- worker_connections:设置可由一个worker进程同时打开的最大链接数。如果设置了worker_rlimit_nofile,我们可以将这个值设的很高。最大客户数也由系统的可用socket连接数限制(~64K)。
- multi_accpet:允许多链接。
- use:使用哪种时间模型轮询。epoll最高效。
-
HTTP模块
参数名 值 含义 AIO on/off 利用系统缓存,内核2.6.22以后版本支持的参数 directio 521k AIO生效阈值 sendfile on/off 直接发送出去,不走系统缓存 tcp_nopush on/off 在一个数据包里发送所有头文件,而不是一个接一个的发送 tcp_nodelay on/off 不要缓存数据,而是一段一段的发送 access_log on/off 是否存储访问日志。off则表示不存储,提高性能,但无日志可分析 error_log crit/notice 只记录严重的错误 参数名 值 含义 keepalive_timeout 10s 链接超时时间 client_header_timeout
client_body_timeout10s 设置请求头和请求体(各自的)超时时间 reset_timeout_connection on/off 关闭不响应的客户端链接 send_timeout 10s 指定客户端的响应超时时间。这个设置不会用于整个转发器,而是在两次客户端读取操作之间。如果在这个时间段内,客户端没有读取任何数据,nginx就会关闭连接 limit_conn_zone $binary_remote_addr
zone=addr:5m:保存各种key(比如当前链接数)的共享内存 limit_conn addr 100 为给定的key设置最大连接数 参数名 值 含义 gzip on 采用gzip压缩的形式发送数据 gzip_disable "msie6" 为指定的客户端禁用gzip功能 gzip_static on 先查找是否有预先gzip处理过的资源 gzip_proxied any 压缩所有的请求 gzip_min_length 1000 小于1000字节的不压缩 gzip_comp_level 1-9 压缩等级 gzip_type text/plain
text/css
application/json设置需要压缩的数据格式 参数名 值 含义 open_file_cache max=100000
inactive=20s指定了缓存最大数目,一级缓存的时间 open_file_cache_valid 30s 指定检测正确信息的间隔时间 open_file_cache_min_uses 2 定义了open_file_cache中指令参数不活动时间期间最小的文件数 Linux存储栈中DirectIo
Nginx中的请求时间和响应时间
Nginx:统计PV、UV、独立IP
Nginx请求时间
安装goaccess日志分析工具
wget http://tar.goaccess.io/goaccess-1.1.tar.gz
yum install glib2 glib2-devel GeoIP-devel ncurses-devel
tar xvf goaccess-1.1.tar.gz -C /usr/local
cd /usr/local/
cd goaccess-1.1/
./configure --enable-geoip --enable-utf8 --with-openssl
###如果提示:
###error: ssl library missing
###解决办法:
###yum -y install openssl-devel
make && make install
goaccess配置时间日期和日志格式匹配Nginx
如果Nginx的日志格式是下面的例子,goaccess对应使用下列格式。不同的查看操作手册
nginx日志格式:
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" $upstream_addr $request_time';
access_log /var/log/nginx/nginx_access_test1.log main;
goaccess时间日期日志格式:
time-format %H:%M:%S
date-format %d/%b/%Y
log-format %h - %^ [%d:%t %^] "%r" %s %b "%R" "%u" - %^ - %^ %T
操作手册:
https://www.goaccess.cc/?mod=man
使用命令:统计Nginx日志文件里的数据
1. 获取PV数
cat /var/log/nginx/nginx_access_test1.log | wc -l
2. 获取IP数
cat /var/log/nginx/nginx_access_test1.log | awk '{print $1}' | sort -k1 | uniq -c | wc -l
3. 获取最耗时的请求时间、url、耗时,前10名, 可以修改后面的数字获取更多,不加则获取全部
cat /var/log/nginx/nginx_access_test1.log | awk '{print $4,$7,$NF}' | awk -F '"' '{print $1,$2,$3}' | sort -k3 -rn | head -10
4. 获取某一时刻的请求数量,可以把秒去掉得到分钟的数据,把分钟去掉得到小时的数据,以此类推
cat /var/log/nginx/nginx_access_test1.log | grep 2021:15:22:32 | wc -l
5. 获取每分钟的请求数量,输出成csv文件,然后用excel打开,可以生成柱状图
cat /var/log/nginx/nginx_access_test1.log | awk '{print substr($4,14,5)}' | uniq -c | awk '{print $2","$1}' > access.csv
6. 配置go-access来分析nginx日志
cat /var/log/nginx/nginx_access_test1.log | goaccess --time-format="%H:%M:%S" --date-format="%d/%b/%Y" --log-format="%h - %^ [%d:%t %^]; \"%r\" %s %b \"%R\" - %^\"%u\" - %^ %T" > index.html
- wc -l :统计行数
- awk '{print $1}':取分割出来的第一个字段
- sort -k1:按第一个字段正序排序
- uniq -c:相邻数据相同合并,即去重
- awk -F '"' '{print $1,$2,$3}':已“为分隔符分割,去第一、第二、第三字段
- sort -k3 -rn:-r逆序,-rn逆序数字排序
- head -10:取前10个
Linux的优化点
- 压缩参数gzip
- 缓存open_file_cache
- worker_processes
- keepalive_timeout