既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上软件测试知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
二、准备
我以前也没有搞过高并发的网络,最近看了一些博客文章,准备用一个最简单的模型来实现这个百万QPS的模拟。后台我是用Java写的,Tomcat服务器。这种带业务的请求,单机绝对不可能到达百万QPS(1m-qps)。网上所说的1m-qps测试环境是一个静态的网页来测试的。既然带业务的http单机不能达到要求,那就需要用到集群了。就我目前所学到的知识,基本就只会搭建下面如图所示的集群架构了。
一台性能比较好的机器按照nginx作为负载均衡,剩下的一些普通的机器就在后面。数据库目前只用到一个,后续如何优化和扩展不在本次讨论。
如果使用上面的架构,出去数据库后,整个HTTP的性能瓶颈就在最前面的Nginx负载均衡上了。其他的HTTP-jsp-tomcat机器如果性能不够,可以通过多加几台机器进行水平扩展。而最前面的Nginx就不行了。所以本次所要测试的就是如何让nginx支持1m-qps,并且机器正常工作。nginx只是做数据转发而已。
硬件:服务器88核、128G内存
软件:Debian 8, Nginx 1.11, wrk压力测试工具
三、操作
- 首先设置一些Linux系统参数 在/etc/sysctl.conf 中增加如下配置
1 vm.swappiness = 0
2 net.ipv4.neigh.default.gc_stale_time=120
3 net.ipv4.conf.all.rp_filter=0
4 net.ipv4.conf.default.rp_filter=0
5 net.ipv4.conf.default.arp_announce = 2
6 net.ipv4.conf.all.arp_announce=2
7 net.ipv4.tcp_max_tw_buckets = 100
8 net.ipv4.tcp_syncookies = 0
9 net.ipv4.tcp_max_syn_backlog = 3240000
10 net.ipv4.tcp_window_scaling = 1
11 #net.ipv4.tcp_keepalive_time = 60
12 net.ipv4.tcp_synack_retries = 2
13 net.ipv6.conf.all.disable_ipv6 = 1
14 net.ipv6.conf.default.disable_ipv6 = 1
15 net.ipv6.conf.lo.disable_ipv6 = 1
16 net.ipv4.conf.lo.arp_announce=2
17 fs.file-max = 40000500
18 fs.nr_open = 40000500
19 net.ipv4.tcp_tw_reuse = 1
20 net.ipv4.tcp_tw_recycle = 1
21 net.ipv4.tcp_keepalive_time = 1
22 net.ipv4.tcp_keepalive_intvl = 15
23 net.ipv4.tcp_keepalive_probes = 3
24
25 net.ipv4.tcp_fin_timeout = 5
26 net.ipv4.tcp_mem = 768432 2097152 15242880
27 net.ipv4.tcp_rmem = 4096 4096 33554432
28 net.ipv4.tcp_wmem = 4096 4096 33554432
29 net.core.somaxconn = 6553600
30 net.ipv4.ip_local_port_range = 2048 64500
31 net.core.wmem_default = 183888608
32 net.core.rmem_default = 183888608
33 net.core.rmem_max = 33554432
34 net.core.wmem_max = 33554432
35 net.core.netdev_max_backlog = 2621244
36 kernel.sem=250 65536 100 2048
37 kernel.shmmni = 655360
38 kernel.shmmax = 34359738368
39 kerntl.shmall = 4194304
40 kernel.msgmni = 65535
41 kernel.msgmax = 65536
42 kernel.msgmnb = 65536
43
44 net.netfilter.nf_conntrack_max=1000000
45 net.nf_conntrack_max=1000000
46 net.ipv4.netfilter.ip_conntrack_max=1000000
47 kernel.perf_cpu_time_max_percent=60
48 kernel.perf_event_max_sample_rate=6250
49
50 net.ipv4.tcp_max_orphans=1048576
51 kernel.sched_migration_cost_ns=5000000
52 net.core.optmem_max = 25165824
53
54 kernel.sem=10000 2560000 10000 256
还有在命令行中输入 ulimit -n 20000500
上面的所有参数,这里就不多讲了,具体想要了解的可以上网找资料
2.Nginx 安装 及其配置
nginx用最简单的apt-get 也可以,用源码按照也可以。没有什么特殊要求。下面的配置就有点要求了。 $NGINX/conf/nginx.conf (/etc/nginx/conf/nginx.conf)
1 worker_processes 88; #这个根据硬件有多少核CPU而定
2 pid logs/nginx.pid;
3
4 events {
5 worker_connections 1024;
6 }
7
8 http {
9 include mime.types;
10 default_type application/octet-stream;
11 sendfile on;
12 tcp\_nopush on;
13
14 keepalive_timeout 65;
15
16 gzip off;
17 access\_log off; #日志功能要关闭
18
19 server {
20 listen 888 backlog=168888;
21 server\_name localhost;
22 root /dev/shm/;
23 }
24
25 }
上面这个是最简单的配置,具体的Nginx还有很多可以调优的,还有nginx负载均衡配置,请参考我的另外一片博客<Nginx + Tomcat 动静分离实现负载均衡 http://www.cnblogs.com/wunaozai/p/5001742.html>
1 worker_processes 4;
2
3 error_log /var/log/nginx/error.log info;
4
5 pid /var/run/nginx.pid;
6
7
8 events{
9 use epoll;
10 worker_connections 409600;
11 multi\_accept on;
12 accept\_mutex off;
13 }
14
15
16 http{
17 sendfile on;
18 tcp\_nopush on;
19 tcp\_nodelay on;
20 open_file_cache max=200000 inactive=200s;
21 open\_file\_cache\_valid 300s;
22 open_file_cache_min_uses 2;
23 keepalive_timeout 5;
24 keepalive_requests 20000000;
25 client_header_timeout 5;
26 client_body_timeout 5;
27 reset\_timedout\_connection on;
28 send_timeout 5;
29
30 #日志
31 access\_log off;
32 #access_log /var/log/nginx/access.log;
33 #error_log /var/log/nginx/error.log;
34 #gzip 压缩传输
35 gzip off;
36 #最小1K
37 #gzip\_min\_length 1k;
38 #gzip_buffers 16 64K;
39 #gzip_http_version 1.1;
40 #gzip_comp_level 6;
41 #gzip_types text/plain application/x-javascript text/css application/xml application/javascript;
42 #gzip\_vary on;
43 #负载均衡组
44 #静态服务器组
45 #upstream static.zh-jieli.com {
46 # server 127.0.0.1:808 weight=1;
47 #}
48 #动态服务器组
49 upstream zh-jieli.com {
50 server 127.0.0.1:8080;
51 }
52 #配置代理参数
53 #proxy\_redirect off;
54 #proxy\_set\_header Host $host;
55 #proxy_set_header X-Real-IP $remote\_addr;
56 #proxy_set_header X-Forwarded-For $proxy\_add\_x\_forwarded\_for;
57 #client\_max\_body\_size 10m;
58 #client\_body\_buffer\_size 128k;
59 #proxy_connect_timeout 65;
60 #proxy_send_timeout 65;
61 #proxy_read_timeout 65;
62 #proxy\_buffer\_size 4k;
63 #proxy_buffers 4 32k;
64 #proxy\_busy\_buffers\_size 64k;
65 #缓存配置
66 #proxy_cache_key '$host:$server\_port$request\_uri';
67 #proxy\_temp\_file\_write\_size 64k;
68 ##proxy_temp_path /dev/shm/JieLiERP/proxy\_temp\_path;
69 ##proxy_cache_path /dev/shm/JieLiERP/proxy_cache_path levels=1:2 keys_zone=cache_one:200m inactive=5d max_size=1g;
70 #proxy_ignore_headers X-Accel-Expires Expires Cache-Control Set-Cookie;
71
72 server{
73 listen 88 backlog=163840;
74 server\_name test2;
75 root /dev/shm/;
76 }
77
78 server {
79 listen 443 ssl;
80 server\_name test;
81 location / {
82 index index;
83 }
84
85 location ~ .*$ {
86 index index;
87 proxy_pass http://zh-jieli.com;
88 }
89 ssl on;
90 ssl_certificate keys/client.pem;
91 ssl_certificate_key keys/client.key.unsecure;
92 }
93 }
View Code
- 创建一个简单的html文件
看到 root /dev/shm/ 了吗, 这个就是http服务器根目录了。 echo “a” > /dev/shm/a.html
- 安装wrk
git clone https://github.com/wg/wrk.git 然后 make
四、运行
启动nginx
启动wrk 进行并发请求测试
./wrk -t88 -c10000 -d20s "http://127.0.0.1:888/a.html"
top结果图
wrk 结果图
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
片转存中…(img-u7QnH5Bt-1715810259016)]
[外链图片转存中…(img-qgx1hCyg-1715810259016)]
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!