关于性能问题的一些思考

2019-06-12  本文已影响0人  王小二黑

问题: 网站卡顿了或者某个接口tps上不去了,怎么定位?

  1. 性能问题的出现大多伴随着某个资源的瓶颈,待考量资源一般包括cpu,memory,network, disk
  2. 另外, 软件一般分为io密集型和cpu密集型, 当然了,也存在部分cpu和io都密集的;io不仅仅包含disk ,也包含network
  3. 所以解决问题的第一步就是发现性能瓶颈,比如幸运的是linux下针对这几种资源都有比较好的工具。
    3.1 全局观测
    • nmon nmon可以比如方便的看到cpu,network,disk,memory是否出现瓶颈


      image.png

      3.2 专项检测

      • cpu: top
      • mem: ps
      • network:iftop
      • disk: iotop

      其中top可以看到哪些进程占用比较高的cpu,ps可以看到各个进程占用的实际内存(ps aux),iftop和iotop跟top比较类似,只不过监控的资源项从cpu分别换成了网络和磁盘

4.如何解决性能瓶颈
这里只简单的谈几个点

  1. 最有意思的一点, 可能观察不到性能瓶颈,但是网站确实慢了,怎么办?
    这种情况往往需要具体情况具体分析了,而且其实也是出现了瓶颈,只不是相对不明显。
    这里举一个例子,我们的nginx上配置了upstream, upstream上是100个php-cgi进程, 24核的机器,只有3个核跑满了,还有大量的核空闲,但是有的请求却始终返回很慢。
    其实聪明的你一定会怀疑那3个跑满的核, 可是心里也会有疑惑,难道有那么多的空闲的cpu不用,请求非要往那3个跑满的核上扔吗?
    答案确实是这样的, nginx upstream默认的请求分配策略是round robin,即轮询,按请求的顺序,依次分给upstream server。 假如有101个请求,前3个特别消耗cpu,大概需要1分钟才跑完,后面98个请求只需要1ms就能执行完,那么因为RR策略,第101个请求运气就比较差,刚好被分配到第1个请求后面,需要等1分钟之后第一个请求执行完了之后再执行,给大家造成一个假像,这个请求很耗时。
    最终的解决办法很简单, 在nginx upstream的配置中, 加上least_conn选项, 让nginx选择连接数最少的那个upstream server去执行请求。
上一篇 下一篇

猜你喜欢

热点阅读