一次优化web项目的经历记录(一)
一次优化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项目的经历记录(一)的更多相关文章
- 一次优化web项目的经历记录(三)
一次优化web项目的经历记录 这段时间以来的总结与反思 前言:最近很长一段时间没有更新博客了,忙于一堆子项目的开发,严重拖慢了学习与思考的进程. 开水倒满了需要提早放下杯子,晚了就会烫手,这段时间以来 ...
- 一次优化web项目的经历记录(二)
一次优化web项目的经历记录 这段时间以来的总结与反思 前言:最近很长一段时间没有更新博客了,忙于一堆子项目的开发,严重拖慢了学习与思考的进程. 开水倒满了需要提早放下杯子,晚了就会烫手,这段时间以来 ...
- 用maven工具管理web项目的错误记录:org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException
运行异常报告日志: 严重: Context initialization failedorg.springframework.beans.factory.xml.XmlBeanDefinitionSt ...
- Java Web项目搭建过程记录(struts2)
开发工具:eclipse 搭建环境:jdk1.7 tomcat 8.0 基础的java开发环境搭建过程不再赘述,下面从打开eclipse 之后的操作开始 第一步: 创建项目,File -> ...
- asp.net Web项目中使用Log4Net进行错误日志记录
使用log4net可以很方便地为应用添加日志功能.应用Log4net,开发者可以很精确地控制日志信息的输出,减少了多余信息,提高了日志记录性能.同时,通过外部配置文件,用户可以不用重新编译程序就能 ...
- 记录一个奇怪的异常,无法还原此异常。 普通的Maven Java Web 项目
项目 : 普通的Maven Java Web 项目 操作记录: 使用 Maven 构建项目,指令 tomcat7:run 无异常 但使用 eclipse 的 tomcat 运行项目,报此异常. 后面从 ...
- 记录web项目部署到阿里云服务器步骤
(使用 web项目.阿里云服务器.Xftp.Xshell),敬请参考和指正 1.将要部署的项目打包成WAR文件格式,可以在MyEclipse.Eclipse都可以完成打包,如下图: 2.安装Xshel ...
- 【问题记录】eclipse启动web项目时,spring会初始化两次
背景:一个tomcat,一个eclipse,一个SSM框架的web项目.在eclipse中新建tomcat服务器,默认配置,然后在服务器配置中将Server Locations改成Use Tomcat ...
- 记录-Intellij Idea下以Tomcat运行Web项目时的位置问题
今天本来准备把原来的一个Web项目导入到Idea下,之前这个项目是用eclipse写的,容器用的tomcat,首先导入前我把一些没用的配置文件都给删了,像什么.eclipse..setting什么的, ...
随机推荐
- nutch 1.7 导入 eclipse
开发环境建议:ubuntu+eclipse (windows + cygwin + eclipse不推荐) 第一步:下载http://archive.apache.org/dist/nutch/从上述 ...
- BZOJ4033 T1
Description 有一棵点数为\(N\)的树,树边有边权.给你一个在\(0-N\)之内的正整数\(K\),你要在这棵树中选择\(K\)个点,将其染成黑色,并将其他的\(N-K\)个点染成白色.将 ...
- python 大文件以行为单位读取方式比对
http://www.cnblogs.com/aicro/p/3371986.html 先前需要做一个使用python读取大文件(大于1G),并逐条存入内存进行处理的工作.做了很多的尝试,最终看到了如 ...
- Asterix and Obelix
uva10246:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&am ...
- Keil C51调试程序时, 对ROM的查看以及RAM 查看或修改
在Keil 里使用 DeBug 模式时,如要 查看外部 RAM 的数据 或查看 ACC 的内容可以进行以下操作; sysGetTxMode: LCALL Com0185(C:2B95) ,sysGet ...
- 关于android屏幕适配
好吧 我承认被美工虐的够呛,而且美工他么是个男的!一点也不美, 废话不多说 急着赶路, 之前不怎么重视 直到遇见这个美工给我一套1080x1920的 图,没错 就一套 1dp=3px没错的啊 问题是就 ...
- C++中的虚函数总结
一.什么是虚函数.纯虚函数.抽象基类 虚函数:在某基类中声明为 virtual 并在一个或多个派生类中被重新定 义的成员函数. 纯虚函数:是一种特殊的虚函数,使用virtual关键字,并且在其后面加上 ...
- unity3d Human skin real time rendering plus 真实模拟人皮实时渲染 plus篇
最近逃课做游戏,逃的有几门都要停考了,呵呵呵,百忙之中不忘超炒冷饭,感觉之前的人皮效果还是不够好,又改进了一些东西 首先上图 放大看细节 显而易见的比上次的效果要好很多,此次我把模型用3dmax进行了 ...
- Hibernate(六)一对一双向关联映射
在上次的博文Hibernate从入门到精通(五)一对一单向关联映射中我们讲解了一下一对一单向关联映射, 这次我们继续讲解一下与之对应的一对一双向关联映射. 一对一双向关联 与一对一单向关联映 射所不同 ...
- Hibernate的Session会话中get()和load()方法的区别
1.get和load都可以从数据库中获取数据 .get拿到的是真的对象,load拿到的是代理对象 2.get和load从数据库中获取数据,如果获取不到,get返回null,load会出现ObjectN ...