基准测试(四)

一、jmeter和ab对比:

1、jmeter能够把服务器性能极限,压出来,但是ab并不能。
理由:同样并发数,比如1000并发,jmeter可以把cpu压满。ab不能。

2、jmeter统计的吞吐量不准确。ab比较准确。
理由:我们直接在服务器程序里添加一个请求计数,然后每秒取一次计数。
结果,这个计数和ab的qps几乎一样。
而jmeter的吞吐量,远远小于它。

 @GetMapping("test2")
    public Sbtest1 test2() throws InterruptedException {
        atomicLong.incrementAndGet();
        Sbtest1 list = sbtest1Service.list();
        return list;
    }

    @Scheduled(cron = "0/1 * * * * ?")
    public void test3(){
        long l = atomicLong.get();
        System.out.println(l - start);
        start = l;
    }

用ab,1000个并发,1万个请求。qps是2000,程序中打印的也是2000。cpu压到85%。

ab -n 100000 -c 1000 http://localhost:8080/test/test2

用jmeter,1000个并发,10秒到达顶峰,500次循环。吞吐量只显示1000。
但是程序打印有将近7000,而且cpu压到100%。

再查看数据库qps统计:jmeter压测的时候,数据库qps到了8000。

综上:准确的数字,应该是服务器的极限qps是6000。

但是,我们使用sysbench,测试这条select语句,得到的mysql的qps是1万5。所以,这个服务器,并没有把数据库的极限能力消耗完

所以,如果考虑扩容,那么应该,选择两台,应用服务器,而不需要对mysql扩容处理。

二、测试nginx。

nginx 部署在windows上。同一个配置文件。

并发:1000。
qps:4千

ab -n 100000 -c 1000 -k http://127.0.0.1:80/

部署在windows开的linux虚拟机上。

并发:1000。
qps:2万

可见: nginx如果部署在windows上,是很划不来的。

配置文件。

worker_processes  8;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    server {
        listen       80;
        server_name  localhost;
        location / {
            root   html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

三、联合压测

nginx压测2万。
tomcat服务器压测3500。

当nginx和tomcat在同一个服务器上时,tomcat qps达到3000多。 整个请求qps 3000。
这是正常的。

当nginx和tomcat在不同服务器上时。
tomcat qps 1万。
nginx qps 1万5到2万。

跨nginx访问的时候。
tomcat qps 100。

后来经过排查,是网络原因,因为我的nginx是部署在虚拟机上的,虚拟的网络有点问题。

同时,也得出一个结论,网络带宽对服务器,吞吐量影响是非常大的。

其实,更细致的压测,磁盘,内存,cpu,网络,然后到应用,找到各个的极限值,然后进行评判,到底是哪里存在问题,哪里需要扩大性能。

四、最贴近真实使用的qps

实际使用的时候,网络因素肯定要考虑到。

那么使用比如:腾讯的压测大师,阿里的pts,这种测试,几乎就是真正的生产的时候的数据了。

因为,它会从全国各地各个节点,发送请求,几乎和真实的用户请求一致。

五、基准测试在生产环境中的使用。

一个业务上线,评估一下,这个业务是否能稳定运行。

1、评估一下qps。

可以通过过往的经验评估。
1.1、所以,对于平时的qps的统计是很有必要的。比如阿里的sentinel。
1.2、凭经验估算,问产品,比如,每天的访问量是多少,2 8法则,大概峰值访问量是多少,然后估算出峰值qps。当然这个不准,跟业务关联。

2、然后根据压测数据,评估一下,我们的应用是否上线之后可以稳定运行。

这么多qps,最后落到缓存的qps有多少,落到数据库的qps有多少。

压测一下mysql是否能够支持这个并发(一般没问题,不可能落到mysql的qps有3000个以上),mysql不行则加主从(加主从要考虑主从延迟导致的问题),或者换硬件,用机械磁盘什么的。

压测一下redis是否够支持这个并发,如果不够,则加机器。并发不够则加主从。
容量不够则加大maxmemory,加大系统内存,再不行则做集群。

压测一下服务层是否够支持这些并发。(不够则加服务器)

压测一下网关路由层。nginx,gateway,zuul等等,网关路由层不可能支持不了吧,有那么大并发吗,支持不了就考虑lvs,dns轮询,f5什么的。

当对各个环节的极限性能都心中有数。

再各个环节联调压测一下,结合网络带宽,最终解决了各个环节的性能瓶颈之后,得到一个准确的整个请求链的qps。

你可能感兴趣的:(基准测试(四))