nginx压力测试_linux内核调优_ngixn调优

10 篇文章 0 订阅

测试方法

通过使用httpd-tools包中的命令工具 ab 命令 -c 指定并发数 -n 指定请求数 然后通过脚本 连续服务器的nginx进行压力测试

CentOS or RedHat

yum install -y httpd-tools

ab 使用时的注意点

测试机注意调优

ulimit -n 65535
echo 65535 > /proc/sys/net/core/somaxconn

脚本内容

#!/bin/bash
if [ $# -ne 4 ]
	then
	echo "$0 ab -c -n  http://baidu.com/index.html"
	exit 1
fi
_concurrency=$1
_requests=$2
_url=$4
_add=$3
#_path=`mktemp -d `
#mkdir -p $_path
echo  "ab ${_concurrency} ${_requests} ${_url}"
_time=${_concurrency}
_file=`echo ${_url} |awk -F/ '{print$3}'`
_path=`mktemp -d ${_file}.XXXXXXXX`
mkdir -p ${_path}
#chmod 777 -R $_path
#echo '        $_requests  $_url  report ' >> ${_file}_${_requests}_report.txt
echo "concurrency      Requests_per_second              Time_per_request     Transfer rate    " >> ${_file}_${_requests}_report.txt
echo "并发数           平均每秒完成请求数               平均请求处理时间    每秒从服务器获取数据长度    " >> ${_file}_${_requests}_report.txt
for  ((i=$_concurrency;i<=$_requests;i+=$_add))
do
#如果并发大于2万则停止 ab最大支持20000
if [  "${_concurrency}" -ge 20000 ];then
 echo "${_concurrency} >= 20000"
 exit 1
fi
echo "ab -c $i   -n ${_requests}  ${_url}   >>  ${_path}/_${_file}_${_requests}_${_time}_.txt"
ab -r -c $i   -n ${_requests}  ${_url}   >>  ${_path}/_${_file}_${_requests}_${_time}_.txt
_Transfer_rate=`cat ${_path}/_${_file}_${_requests}_${_time}_.txt |grep 'Transfer rate' |awk -F: '{print$2}'`
_Requests_per_second=`cat ${_path}/_${_file}_${_requests}_${_time}_.txt |grep 'Requests per second' |awk -F: '{print$2}'`
_Time_per_request=`cat ${_path}/_${_file}_${_requests}_${_time}_.txt|grep 'across all concurrent requests' |grep 'Time per request' |awk -F[:\ ]   '{print$11$12}'`
echo " $i           ${_Requests_per_second}      ${_Time_per_request}  ${_Transfer_rate}    " >> ${_file}_${_requests}_report.txt
_time=$(($_time+10))
sleep 3
done

优化前先进行一册压力测试取得优化前数据

sh ab.sh 100 1000 100 http://xxx.xxx.xxx/
sh ab.sh 100 1000 100 http://xxx.xxx.xxx/
sh ab.sh 100 1000 100 http://xxx.xxx.xxx/

sh ab.sh 1000 5000 1000 http://xxx.xxx.xxx/
sh ab.sh 1000 5000 1000 http://xxx.xxx.xxx/
sh ab.sh 1000 5000 1000 http://xxx.xxx.xxx/

sh ab.sh 2000 10000 2000 http://xxx.xxx.xxx/
sh ab.sh 2000 10000 2000 http://xxx.xxx.xxx/
sh ab.sh 2000 10000 2000 http://xxx.xxx.xxx/

sh ab.sh 5000 100000 5000 http://xxx.xxx.x/
sh ab.sh 5000 100000 5000 http://xxx.xxx.x/
sh ab.sh 5000 100000 5000 http://xxx.xxx.x/

测试数据

待完善

系统方面优化

#关闭ipv6 
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1 
#忽略icmp ping广播包,应开启,避免放大攻击
net.ipv4.icmp_echo_ignore_broadcasts = 1 
# 开启恶意icmp错误消息保护
net.ipv4.icmp_ignore_bogus_error_responses = 1

# 关闭路由转发注意有做有 docker  haproxy upstream要开启 1开启 0关闭
#关闭路由转发
net.ipv4.ip_forward = 0
#禁止转发重定向报文
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0

#开启反向路径过滤
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
#开启SYN Cookies
net.ipv4.tcp_syncookies = 1
#处理无源路由的包
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0

#关闭sysrq功能 对性能影响不大
kernel.sysrq = 0

#core文件名中添加pid作为扩展名
kernel.core_uses_pid = 1


#修改消息队列长度

kernel.msgmnb = 65536
kernel.msgmax = 65536
#设置最大内存共享段大小bytes 
# 68719476736bytes=64 GB
# 4294967296bytes=4 GB
kernel.shmmax = 68719476736
#该参数表示统一一次可以使用的共享内存总量(以页为单位)。默认是2097152bytes(2MB),通常不需要修改。
kernel.shmall = 4294967296

#TIME_WAIT连接数的数量,有的资料显示 180000 默认4096(我当时查的centos7.6)
#如果不是类似 Nginx 之类的中间代理(即不担心端口耗尽),你通常不用关心这个值,使用官方默认的就好,甚至官方建议在内存大的情况下可以增加这个值。
#类似 Nginx 之类的中间代理一定要关注这个值,因为它对你的系统起到一个保护的作用,一旦端口全部被占用,服务就异常了。 tcp_max_tw_buckets 能帮你降低这种情况的发生概率,争取补救时间。 默认4096 
#Ref   https://www.jianshu.com/p/b7e991be0909

net.ipv4.tcp_max_tw_buckets = 55000
#开启tcp_sack
#启用有选择的应答(Selective Acknowledgment),
#这可以通过有选择地应答乱序接收到的报文来提高性能(这样可以让发送者只发送丢失的报文段);
#(对于广域网通信来说)这个选项应该启用,但是这会增加对 CPU 的占用。
net.ipv4.tcp_sack = 1
#启用tcp_window_scaling
#启用 RFC 1323 定义的 window scaling;要支持超过 64KB 的窗口,必须启用该值
net.ipv4.tcp_window_scaling = 1
#与 tcp_wmem 类似,不过它表示的是为自动调优所使用的接收缓冲区的值。
net.ipv4.tcp_rmem = 4096        87380   4194304
#为自动调优定义每个 socket 使用的内存。
#第一个值是为 socket 的发送缓冲区分配的最少字节数。
#第二个值是默认值(该值会被 wmem_default 覆盖),缓冲区在系统负载不重的情况下可以增长到这个值。
#第三个值是发送缓冲区空间的最大字节数(该值会被 wmem_max 覆盖)。
net.ipv4.tcp_wmem = 4096        16384   4194304
#定义默认的发送窗口大小;对于更大的 BDP 来说,这个大小也应该更大。
net.core.wmem_default = 8388608
#指定了接收套接字缓冲区大小的缺省值(以字节为单位)。
net.core.rmem_default = 8388608
#指定了接收套接字缓冲区大小的最大值(以字节为单位)。
net.core.rmem_max = 16777216
#定义发送窗口的最大大小;对于更大的 BDP 来说,这个大小也应该更大。
net.core.wmem_max = 16777216
#该参数决定了,网络设备接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目。
net.core.netdev_max_backlog = 262144

#限制仅仅是为了防止简单的DoS 攻击 最大套接字sockts 一个最大是64k *3276800= 200GB
net.ipv4.tcp_max_orphans = 3276800

#表示SYN队列长度,默认1024,改成8192,可以容纳更多等待连接的网络连接数。
net.ipv4.tcp_max_syn_backlog = 262144
#开启TCP时间戳
#以一种比重发超时更精确的方法(请参阅 RFC 1323)来启用对 RTT 的计算;为了实现更好的性能应该启用这个选项。
net.ipv4.tcp_timestamps = 0

#内核放弃建立连接之前发送SYNACK 包的数量
#TCP三次握手的syn/ack阶段,重试次数,缺省5,设为1
net.ipv4.tcp_synack_retries = 1

#内核放弃建立连接之前发送SYN 包的数量 默认查询为 6
net.ipv4.tcp_syn_retries = 1

#表示开启TCP连接中TIME_WAIT状态的socket快速回收,循环使用,默认为0,表示关闭。
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
#####################################
#net.ipv4.tcp_mem = 196608       262144  393216  #内存4G 建议使用此条
#net.ipv4.tcp_mem = 524288     699050  1048576  (#内存8G建议使用 TCP连接最多约使用4GB内存)
net.ipv4.tcp_mem = 94500000 915000000 927000000   #内存256GB 建议
#FIN_WAIT状态的TCP连接的超时时间
net.ipv4.tcp_fin_timeout = 1
#当keepalive 起用的时候,TCP 发送keepalive 消息的频度。缺省是2 小时
net.ipv4.tcp_keepalive_time = 30

#允许系统打开的端口范围
net.ipv4.ip_local_port_range = 1025    61000

#修改防火墙表大小,默认65536
net.netfilter.nf_conntrack_max=655350
net.netfilter.nf_conntrack_tcp_timeout_established=1200

# 确保无人能修改路由表
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.default.secure_redirects = 0


`sysctl -p`

Nginx方面

#定义Nginx运行的用户和用户组
user			nginx nginx;
#worker_processes  	auto;
#nginx进程数,建议设置为等于CPU总核心数。
worker_processes  	4;
#指定进程分配的具体逻辑核心
worker_cpu_affinity 0001 0010 0100 1000;
#worker_rlimit_nofile >= worker_processes * worker_connections
#该指令与使用ulimit对用户的设置是同样的效果。此指令的值将覆盖ulimit的值
worker_rlimit_nofile 265535;
error_log  		logs/error.log  debug;
pid        		logs/nginx.pid;


events {
	use 		epoll;
	#worker_connections 最大可设置到65536
	worker_connections  65535;
	#multi_accept指令使得NGINX worker能够在获得新连接的通知时尽可能多的接受连接。 此指令的作用是立即接受所有连接放到监听队列中。
	multi_accept on;
	#Prior to version 1.11.3, the default value was on.
	#accept_mutex off;
}

http {
	include       	mime.types;
	#这个类型会让浏览器认为响应是普通的文件流,并提示用户下载文件,避免浏览器播放文件
	default_type  	application/octet-stream;
	
	log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
	                  '$status $body_bytes_sent "$http_referer" '
	                  '"$http_user_agent" "$http_x_forwarded_for"';
	
	access_log  logs/access.log  main;
	#log_format access '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent $request_body "$http_referer" "$http_user_agent" $http_x_forwarded_for';
	#log_format access 	'$remote_addr @##$remote_user @##$time_local @##"$request" @##$status @##$body_bytes_sent @##$request_body @##"$http_referer" @##"$http_user_agent" @##$http_x_forwarded_for';
	#access_log  	logs/access.log  access;    
	#sendfile系统调用在两个文件描述符之间直接传递数据(完全在内核中操作),从而避免了数据在内核缓冲区和用户缓冲区之间的拷贝,操作效率很高,被称之为零拷贝。
	sendfile       	on;
	# enabled only when sendfile is used
	tcp_nopush     	on;
	#默认 60
	send_timeout 	15;
	#默认为On
	#tcp_nodelay    	on;
	#keepalive_timeout  0;
	keepalive_timeout  	75;
	#不显示版本号
	server_tokens 	off;
	
	#在上述配置中,为12400个元素定义了一个缓存。 inactive参数配置到期时间为20秒。
	open_file_cache 			max=102400 inactive=20s;
	#30秒后重新检查元素
	open_file_cache_valid 		30s;
	#最小访问次数设置为1次或更多次
	open_file_cache_min_uses 		1;
	#启用错误缓存,则在访问资源(不查找资源)时,NGINX会报告相同的错误
	open_file_cache_errors   on;
	#Enables or disables resetting timed out connections and connections closed with the non-standard code 444 (1.15.2)
	reset_timedout_connection 		on;
	
#######设定请求缓冲#######################
#此指令规定了用于读取大型客户端请求头的缓冲区的最大数量和大小。 这些缓冲区仅在缺省缓冲区不足时按需分配。 当处理请求或连接转换到保持活动状态时,释放缓冲区。
	large_client_header_buffers 	4 256k;
	client_header_buffer_size 		128k;
	client_header_timeout 		5s;
	client_body_buffer_size 		1024k;
	client_body_timeout 		5s;
	#客户端最大上传大小 , 设置为0 则关闭检查
	client_max_body_size 		10m;
	#启用fastcgi
	fastcgi_connect_timeout 		300;
	fastcgi_send_timeout 		300;
	fastcgi_read_timeout 		300;
	fastcgi_buffer_size 		64k;
	fastcgi_buffers 			4 64k;
	fastcgi_busy_buffers_size 		128k;
	fastcgi_temp_file_write_size 	128k;
	#启用gzip压缩
	gzip  		on;
	gzip_min_length 	1k;
	gzip_buffers 	4 16k;
	gzip_comp_level 	5;
	gzip_types 		text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
	gzip_vary 		off;
	gzip_disable 	"MSIE [1-6]\.";
	include 		/usr/local/nginx/conf/conf.d/*.conf;
}

优化完后再进行压力测试 对比结果

测试数据、

待完善

测试结果对比

项目吞吐量requests/s(QPS)
4u8G9mbps 未进行优化50~60
阿里云4u8G9mbps nginx优化 内核未优化250~260
阿里云4u8G 25mbps nginx优化 内核优化1200~1300
本地虚拟机 4u3G 带宽约40Mbps nginx优化 内核优化6800~6900

吞吐量(QPS)越高,代表服务器 并发性能越强
由于本地向阿里云服务器测试会收到网络长距离传输干扰所以数据会稍微低一些

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dendysan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值