zoukankan      html  css  js  c++  java
  • 网站响应过慢问题

      最近总是遇到很有意思的问题,在测试机上测试的时候,网站响应正常。一部署到线上就卡成狗。

      原本以为可能上nginx配置不对。后来修改nginx配置发现没有什么用。后台log的记录的时候发现服务器响应请求过慢。

      把逻辑梳理一下:网站本身其实就三个层次,用户页面;逻辑;读取持久层数据。

        用户层面导致的慢可能有:nginx解析,第三方资源加载过慢,cdn,网络等。

        逻辑层面:死循环,死锁,阻塞,复杂度过高。

        持久层面:索引,全盘扫描,链表,缓存不命中。

      仔细分析排查发现一个很有意思的事情,网站慢根本原因在于嵌套了三层以上的查询语句。代码的结构是这样的,每个相关的方法都封装了查询语句。在调用查询语句的时候,for循环下面调用另外封装好的方法,然后被调用的方法里面也有for循环,这样一算下来,复杂度至少变成了O(n^3) 。线上的数据有几百条,响应时间为55s,测试机上的几十条响应时间为3s。

      最终解决方案,代码其实早已积重难返,没办法去做大幅度的结构拆分更改,因此在这里增加了缓存,速度果然变快不少。

      反思:其实我们在写代码的时候,难免会遇到这样的情况,封装好的方法复杂度是O(n^2)调用方法是O(n) 执行时间复杂度一下子就膨胀了。

        如何解决呢?

      根据业务场景,我觉得解决方法有这样几种:

        1.增加缓存。(很暴力很强大)

        2.结构上优化:将读取数据库的方法封装好,在其上封装一层业务层,编写的时候注意复杂度。(目前项目中主要架构即是如此)

        3.拆分复杂度,将O(n^3)变为几个O(n^2) 。尽可能的减少复杂度。

  • 相关阅读:
    C++实现网格水印之调试笔记(六)—— 提取完成
    C++实现网格水印之调试笔记(五)—— 提取出错
    C++实现网格水印之调试笔记(四)—— 完成嵌入
    Spark ---RDD
    Running Spark on YARN
    Spark官方2 ---------Spark 编程指南(1.5.0)
    Spark官方1 ---------Spark SQL和DataFrame指南(1.5.0)
    spark与hive的集成
    [mysql] ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES).
    HDFS概述(6)————用户手册
  • 原文地址:https://www.cnblogs.com/zslzz/p/8465868.html
Copyright © 2011-2022 走看看