初识高并发

    本来想模拟高并发测试一下项目里的下单代码,上网搜索模拟高并发都是一些转载或者牛头不搭马嘴的文章,于是自己总结了一下,顺便按自己的想法处理一下高并发的情况。用的是nginx、mysql、php7以及tp5框架,模拟的情况跟使用的东西也有很大联系。

ab:
    ab命令可以模拟高并发,可以设置cookie、header以及请求方式等,具体man ab查看手册。ab模拟的高并发并不是真实的情景,但是已经能满足大部分要求,能看出代码哪里有问题。ab后的结果:红色的框中,第一个是每秒处理多少个请求,第二个是每个请求需要多少毫秒。

初识高并发_第1张图片

top:
    top命令打开进程管理器,查看cpu的情况以及各进程占的cpu情况。

    高并发下top命令截图,可以看到几个占cpu最多的进程,一个是mysql,另一个就是php了。所以处理高并发的问题,个人理解就是降低这里的%CPU就行了。

初识高并发_第2张图片

数据库、缓存:

    这里看到mysql占用的cpu较高,自然想到用缓存。据我了解,数据库底层是有缓存的,有缓存的话cpu占用应该不会那么高。突然想到这里的查询是连表查询的,数据库是不会缓存的!所以在查询里加上->cache(true)->select()当然是不行的,要缓存的是查询回来的数据。修改后发现myslq占用的cpu降低到60%左右,影响非常大!优化sql语句也是解决办法,少用连表,少用*查询,数据能缓存的话就缓存。

开启多进程(不行):

    一开始想的是将php-fpm开启的进程数调高一点,但是发现每秒处理的请求数量没多大变化,每个php进程占的%CPU也没降低多少,问了一下总监,说还要考虑到左上方的%Cpu(s),这个过高的话,再开启进程也是没用的。想到之前模拟高并发,循环100遍fork子进程,然后死机了。

负载均衡:

   另一个想法就是负载均衡了,我了解的是将请求分发给不同的服务器处理,nginx本身就是能处理高并发的高性能服务器,所以实现负载均衡就很简单了。修改配置。

  upstream tpgame {
      server 10.0.0.51:8080 weight=1;
      server 127.0.0.1:8080 weight=1;
  }
  
  server {
      listen 80;
  
      server_name www.tpgame.org;
  
      location / {
          proxy_pass http://tpgame;
      }
  
  }

    这样是不是叫负载均衡我不太清楚,但是的确达到了我降低cpu占用率的要求,将cpu负担分给了另外一台服务器。另一台服务器用的是apache,%Cpu(s)占用比nginx要高很多,这里也验证了为什么要用nginx而不用apache的原因了。nginx的性能的确高出很多,至于原理等技术高了再研究。

    但是这样就会出现很多问题,面试问得最多的是session共享,没想到当初面试问的问题会这样联系到一起,处理session的话用redis可以解决。但是数据那些怎么办,我想到的是数据库可以像redis那样主从配置,读写分离,但是怎么分配读写又是一个问题,你怎么知道你的请求是读数据然后去请求哪个服务器呢?如果都是读的话,不都是从一个服务器上读吗,这样负载均衡有什么意义呢?这些还要等技术高了再研究。

代码逻辑:

    代码逻辑包括框架的、业务的和个人代码逻辑,用的tp5框架(性能方面没做测试),这里用连表查询,查询商品列表的数据,查询的数据再循环一遍做处理,很简单的逻辑,已经不能再优化什么了。用连表的原因是要完成业务上的一些需求,不然查询时间可能会更快。要注意的是,数据库查询不能用*一下把所有字段都取出来。

    现在的项目暂时还没出现什么性能的瓶颈,大多数都是小公司,一天哪有什么访问量,更不要谈会有高并发的情况了,但是提前了解以及增长自己的技术何尝不是好事呢。(而且我真的很讨厌搜索一大堆转载相同的文章,只好自己总结。)

你可能感兴趣的:(初识高并发)