初识高并发

本文介绍了如何模拟高并发测试,使用ab命令进行压力测试,通过top命令观察CPU使用情况。在遇到高并发时,作者关注数据库优化,如缓存策略和SQL优化,并探讨了开启多进程和负载均衡的方法。此外,还讨论了session共享和数据读写分离的问题,以及代码逻辑优化对性能的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

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

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

数据库、缓存:

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值