一次优化web项目的经历记录(一)

时间:2022-12-16 20:10:56

一次优化web项目的经历记录

这段时间以来的总结与反思

前言:最近很长一段时间没有更新博客了,忙于一堆子项目的开发,严重拖慢了学习与思考的进程。开水倒满了需要提早放下杯子,晚了就会烫手,这段时间以来,写的东西越来越不严谨,各种低级错误频出,早该停下总结并巩固一下了,但出于一些原因一直没付诸于行,终于,烫到手了


第一章:50分钟打不开的一个网页


事故现场为互联网上的一个角落

我负责的一个社会实践微足迹项目的管理员端登陆页面(准确的说,我负责的部分是后端+用户h5、微信前端页面,管理员端页面是交由X负责,我提供数据),接到反馈说,校级管理员在登录页卡了50min(从21:00到21:50)。亲测结果虽然没那么夸张,但也用了将近3分钟(考虑到管理员网络状况、失去耐心刷新页面,以及”反正是网页卡住了我先喝杯咖啡”等动作,他花了50min才打开网页是可信的)。如此还了得,不想继续打喷嚏就赶紧修复


为什么访问这么慢呢?瓶颈在哪儿?

根据chrome开发者工具的Network日志来看,其实登录接口(login)在一瞬间就完成了(700ms),主要是卡在了拉取信息的接口(overview)。这个接口原本是要返回一个信息概览的,但X为了简tou单lan,要求在这里就拿到所有会用到的数据,导致单接口要处理的任务较多。但就算如此也不应该会卡这么久,显然是什么地方设计错了。


第一想到的当然是数据库

众所周知,数据库连接是很耗时的,一般来说大部分项目的瓶颈都发生在数据库上。但我当初创建数据库的时候我是做过精心设计的,借助sqlalchemy做orm(忘了说了,这次后端用的python来写),合理的使用foreignKey与relationship,其实已经是很优的做法了,虽然后来发现仍然有可优化的空间,但那绝不是造成如此巨大耗时的原因。

话虽是这么说,但当事实(141s的延时)放在眼前时,很难有这么大的自信不去怀疑自己,为此做了很多无用功,耽误了不少时间。不过在boss兼学长兼老师的L帮助下,虽然没解决问题但确实加深了对原生SQL语句的理解运用。

(就个人来说,数据库比较复杂时通常就直接用orm了,所以说更大的收获其实是让我更加认识到了sqlalchemy背后所做的工作到底为我省了多少事情)


这样的话就麻烦了

在折腾了半天后醒悟到不是数据库的瓶颈后,我意识到这次的问题可能会有些麻烦了,不是那种能一眼发现恍然大悟进而分分钟搞定的bug。如果不去实际的做点什么,简单的分析代码猜测原因只是在浪费时间。

这里不得不提的是,Docker确实是很方便的技术,但毕竟使得代码部署多了一层容器,一定程度上确实会给修复bug调整代码造成一些麻烦,你不得不重构你的镜像,重启你的容器(除非你用volume把代码挂载到宿主机上,但这不就失去了一键交付、快速部署的意义了吗,我通常只在开发环境中这么做)。

嘛,比起它的好处来说这也不算什么,我只是想说,如果你只是做个很小的玩具,它负责测试你的想法,实验你的灵感,而你经常会随意修改它并且不打算集群部署发布或者交付给其它人使用,那么你大概不需要Docker。


好吧,那么下面我就得调试我的代码,监控它的运行并找出耗时瓶颈

下面的内容才是重点,是我一定要记录下这次经历的原因所在,我们明天再继续

一次优化web项目的经历记录(一)的更多相关文章

  1. 一次优化web项目的经历记录(三)

    一次优化web项目的经历记录 这段时间以来的总结与反思 前言:最近很长一段时间没有更新博客了,忙于一堆子项目的开发,严重拖慢了学习与思考的进程. 开水倒满了需要提早放下杯子,晚了就会烫手,这段时间以来 ...

  2. 一次优化web项目的经历记录(二)

    一次优化web项目的经历记录 这段时间以来的总结与反思 前言:最近很长一段时间没有更新博客了,忙于一堆子项目的开发,严重拖慢了学习与思考的进程. 开水倒满了需要提早放下杯子,晚了就会烫手,这段时间以来 ...

  3. 用maven工具管理web项目的错误记录:org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException

    运行异常报告日志: 严重: Context initialization failedorg.springframework.beans.factory.xml.XmlBeanDefinitionSt ...

  4. Java Web项目搭建过程记录(struts2)

    开发工具:eclipse 搭建环境:jdk1.7   tomcat 8.0 基础的java开发环境搭建过程不再赘述,下面从打开eclipse 之后的操作开始 第一步: 创建项目,File -> ...

  5. asp.net Web项目中使用Log4Net进行错误日志记录

      使用log4net可以很方便地为应用添加日志功能.应用Log4net,开发者可以很精确地控制日志信息的输出,减少了多余信息,提高了日志记录性能.同时,通过外部配置文件,用户可以不用重新编译程序就能 ...

  6. 记录一个奇怪的异常,无法还原此异常。 普通的Maven Java Web 项目

    项目 : 普通的Maven Java Web 项目 操作记录: 使用 Maven 构建项目,指令 tomcat7:run 无异常 但使用 eclipse 的 tomcat 运行项目,报此异常. 后面从 ...

  7. 记录web项目部署到阿里云服务器步骤

    (使用 web项目.阿里云服务器.Xftp.Xshell),敬请参考和指正 1.将要部署的项目打包成WAR文件格式,可以在MyEclipse.Eclipse都可以完成打包,如下图: 2.安装Xshel ...

  8. 【问题记录】eclipse启动web项目时,spring会初始化两次

    背景:一个tomcat,一个eclipse,一个SSM框架的web项目.在eclipse中新建tomcat服务器,默认配置,然后在服务器配置中将Server Locations改成Use Tomcat ...

  9. 记录-Intellij Idea下以Tomcat运行Web项目时的位置问题

    今天本来准备把原来的一个Web项目导入到Idea下,之前这个项目是用eclipse写的,容器用的tomcat,首先导入前我把一些没用的配置文件都给删了,像什么.eclipse..setting什么的, ...

随机推荐

  1. windows下webstorm开发react-native智能提示

    webstorm破解版地址:点这里 1.随便在一个目录下下载ReactNative-LiveTemplate插件,命令为: git clone https://github.com/virtoolsw ...

  2. ASPNET_MVC学习中的疑问

    1.在mvc..net4.5.Entity Framewor都提供了多种验证规则.  请问,其中不需要提交到服务器验证的验证,是否是在客户端就完成的,还是说像之前的aspnet一样,都得提交到服务器验 ...

  3. 网易新闻页面信息抓取 -- htmlagilitypack搭配scrapysharp

    最近在弄网页爬虫这方面的,上网看到关于htmlagilitypack搭配scrapysharp的文章,于是决定试一试~ 于是到https://www.nuget.org/packages/Scrapy ...

  4. JAVA 日志管理

    http://www.360doc.com/content/10/0704/05/2017726_36768082.shtml http://javacrazyer.iteye.com/blog/11 ...

  5. F2063 Could not compile used unit 'tt.pas'

    install packge error F2063 Could not compile used unit 'tt.pas' 有可能是工程的pas文件相对路径不对.在工程管理看是否能打开文件,如果打 ...

  6. 常用的MAVEN公共私服

    flex-mojo http://repository.sonatype.org/content/groups/flexgroup flex相关 http://nexus.5amsolutions.c ...

  7. 复制粘贴之插件(clipboard.min.js)不需要安装flash

    <!DOCTYPE html> <html> <head> <title>ZeroClipboard Test</title> <me ...

  8. redis-hash操作

    hset(name, key, value) # name对应的hash中设置一个键值对(不存在,则创建:否则,修改) # 参数: # name,redis的name # key,name对应的has ...

  9. bzoj 4770 图样 - 概率与期望 - 动态规划

    题目传送门 传送门I 传送门II 题目大意 有一个$n$个点的完全图,每个点的权值是$[0, 2^{m})$中的随机整数,两点间的边的权值是两点点权的异或和,问它的最小异或生成树的边权和的期望. 考虑 ...

  10. azkaban 执行hive语句

    #hivef.jobtype=commandcommand=hive -f test.sql #test.sql use default;drop table aztest;create table ...