一次优化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什么的, ...
随机推荐
- PyCharm使用技巧记录(一)如何查看变量
[为了方便自己以后查阅,记录下使用PyCharm时的一些小技巧] 正在学习Python,在调试Python程序时,遇到了一个非常大的问题:如何能够方便地查看变量的取值呢? 由于使用matlab多年,深 ...
- Arduino语言学习记录(持续更新)
几天前某宝买了一套,这几天没工夫.今天开始学学这个“玩具”. 1.Arduino的变量数据类型: 数据类型 数据类型 RAM 范围 void keyword N/A N/A boolean 1 by ...
- ios7新特性2--多任务提升
iOS 7 为应用程序提供新的后台执行模式: 应用程序需要需要下载新内容,可以向系统注册,这样程序会被定期唤起或者启动,然后可以在后台下载内容.要注册这个功能,需要打开Info.plist 文件,设置 ...
- java 上下文切换
上下文概念 在高性能编程时,经常接触到多线程. 起初我们的理解是, 多个线程并行地执行总比单个线程要快, 就像多个人一起干活总比一个人干要快. 然而实际情况是, 多线程之间需要竞争IO设备, 或者竞争 ...
- MYSQLl防注入
1.简单sql防注入 简述: 所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令. 在某些表单中,用户输入的内容直接用来构造(或 ...
- 【HDOJ】1150 Machine Schedule
匈牙利算法. #include <stdio.h> #include <string.h> #define MAXNUM 1005 char map[MAXNUM][MAXNU ...
- 【HDOJ】1892 See you~
wa了十次,原来变量名写错.二维树状数组. #include <cstdio> #include <cstring> #define MAXN 1002 int nums[MA ...
- 小细节:Java中split()中的特殊分隔符 小数点
这两天做项目过程中由于数据表字段设计的太恶心了,导致自己填坑 关于微信支付和支付宝的支付有一个不同点:就是金额的处理,支付宝金额的单位是0.01元,但是微信支付中1表示0.01元,当时设计价格的时候使 ...
- activiti集成drools实验
无代码,无真相. 网上的博客代码,都挺片段的.所以,我想找个现成的demo实验代码. 上github ------------------------------------------------- ...
- unicode随笔小计
科普字符集: ascii:一个字节,占8位,(0000 0000 - 1111 1111) 如果只是英语那就没什么问题. 后来,不同的语言有了编码诞生.为了统一,出现一个大集合.便有了. unicod ...