LAMP网站性能优化记

news/2024/5/13 17:29:02/文章来源:https://blog.csdn.net/weixin_34153893/article/details/90094691

先说说背景:一个LAMP在线测试网站,日均PV1万左右,比赛时一小时就好几万吧。目前数据库大约有30万条记录。服务器配置很高。近期出现性能问题,当访问量增大的时候,数据库服务器的压力非常大,mysql的内存占用率通常能到400%,这时候基本不能提供服务了,连网站页面都打不开。理论上说现在的数据量还不算大,访问量也不是很大,服务器的配置也很高,出现这种状况是不正常的。这个问题究结了很久,昨天终于找到问题的原因了,记录一下,以后遇到类似的问题可以有个参考。先看一张图片,这是glances监控软件的截图,可以看到红色的496.6就是mysql的CPU占用率

  之前遇到这个问题,只能重启mysql服务,但这只是暂时的,重启之后不到1分钟CPU占用率接着就上来了,不是长久之计。

  然后考虑修改数据库和apache的配置文件,加大缓存空间,但效果还是不明显。

  后来又考虑是不是路由器的问题,因为目前是两台服务器通过一个小路由器连起来,组成一个小局域网,一个放apache(压力很小),另一个服务器放数据库(压力很大),交换数据都要先经过路由器。于是开始怀疑路由器的性能问题,干脆直接用一根网线把两个服务器连起来(服务器有两个网卡)。这样两个服务器就能直接通信了。事实证明,这样还是不能解决数据库压力大的问题。

  接下来,还是各种纠结,想过各种方法,比如换nginx,换其他数据库,弄个数据库集群什么的,都比较麻烦,还需要修改php代码,比较费劲,关键是php这东西看着就恶心……  

  有一天,我发现了memcached,memcached是一个缓存系统,这么说吧,假如有一个查询语句,很费时间,如果没有缓存的话,每次刷新页面就要访问数据库查询一次,这样数据库压力就比较大。 如果有缓存就不一样了,如果要查询的数据在缓存中存在的话,就直接从缓存中取出来,这样就不用去数据库查询了,如果访问量大的话可以明显减少数据库的查询次数,当然也减轻了数据库的压力。先贴一段没有缓存的代码:

$list = $statics->getFirstTenList();

下面是加上缓存的代码:

$list = null;
if (!($list = $cache->get('top_ten_list'))) {$list = $statics->getFirstTenList();$cache->set('top_ten_list', $list, 7200);
}

没有缓存的代码,每次都要调用查询函数从数据库获取数据。下面的有缓存的就不一样了。当需要查询一个数据之前,首先看看缓存里面有没有,就是代码中$cache->get(),如果从缓存取得了,就不用执行那条查询数据库的语句了。如果缓存服务器没有,就要从数据库里面查询,查询以后,用$cache->set()方法就刚才的查询结果保存到缓存服务器,并设置这个缓存存在的时间,这里是7200秒,7200秒之后,这个缓存就失效了,就要从新更新。还有一点比较重要,就是要给每一个缓存取一个名字,不同的缓存名字不能相同,缓存服务器是根据缓存的名字来区分缓存,如果名字相同的话,从缓存取出来的数据就不是我们需要的数据。举个例子来说:有两个比赛,比赛的排名页面做一个缓存,如果两个缓存名字都叫ranklist,首先刷新一下第一个比赛的排名页面,那么第一个比赛的排名数据就存在缓存服务器了。如果这时再刷新一下第二个比赛的排名页面,因为ranklist在缓存中存在,直接就从缓存中取出来了,但是取出来的数据并不是我们需要的,这种问题还是比较小的。如果是不同类型的数据,那么网站就乱了。

  缓存是个好东西,然后打算通过大量增加缓存来减轻服务器的压力。但后来我发现,这样也不行。因为我们的网站是一个在线测评系统,是一个实时动态的系统,一个用户提交一个答案以后,想立即看到评判结果,当答案正确的时候,要立即更新排名信息。如果增加缓存的话,从缓存中取出来的信息就不是最新的,不能显示实时的排名等信息。这就好比你订了一张票,但是系统好久才提示你订票成功,中间的等待时间是最难熬的。还有一个原因也限制了缓存的使用,就是对于大量的页面,比如说服务器上有2000个题,一个题一个页面,如果一个页面一个缓存的话肯定会降低缓存的性能。但是对于一些数据,长时间变动不大,比如说总做题数的排名,就可以考虑增加一个缓存,可以设置半天或者一天的生存时间,也就是半天或者一天更新一次。

  由于大量缓存并不适用与我们这种实时性很高的系统,因此我并没有增加很多缓存。数据库压力还是那么大。还是没找到问题的根源。

  找到一本mysql性能优化的书,然后就开始研究,首先想到的还是加索引,后来用show index from table_name来查看,发现里面已经对常用的查询词加索引了,我甚至开始考虑是不是因为索引太多加重了数据库的压力?经过一些测试(删除某些索引),发现还是不行,看来通过增加索引已经不能很好得解决OJ问题。

  后来发现了一个语句,是 show processlist,这条命令的作用是显示哪些线程正在执行,执行了多长时间,还有一些其他信息,看截图:

上面的图片是在负载不是很大的时候截的,从上图我们能看到有两条sql查询语句已经执行了7秒了,还有一个正在往临时表拷贝数据的操作。真正比赛的时候比这个问题严重多了!有几个sql语句执行时间超过10秒,总的sql查询语句个数有200多个,当然大部分线程是被阻塞的。 在这里我们就能很明显看出来到底是哪一条sql语句在浪费时间,接下来,我们就要找到底这条sql查询语句是从哪发起的,从php源吗中找这条语句,如果一条一条找就费劲了,这里我们用强大的grep命令来帮助我们查找。

很明显,这几条语句就在一个文件里面,让我们打开这个文件看看,下面是其中的一个函数,包含上面的查询语句

这个函数是从哪调用的?再找

 看到了吧,这里有八条类似的语句,这8条语句的作用是什么?其中第一条的作用是从30万的表里找到今天提交的并且AC的题目总数,第二条就是统计今天的提交总数,下面几条分别是统计这周,这月,这年的AC和提交总数。显示提交状态的solution表中目前大约有30万条信息,并且随时都会更新,只要有人提交就会插入新数据并更新一些数据。在数据库理论里面将,统计和插入更新是互相冲突的,这里就需要加锁,当执行查询语句的时候,将这个表锁住,防止其他数据更新而影响查询结果。也就是说,当执行上面的查询语句时,数据库里面的其他语句就被阻塞了,就被迫去sleep。在提交高峰期,数据库里面被阻塞的语句能达到200多条甚至更多,mysql的CPU占用率达到能达到500%,肯定不能对外提供服务了!

  接下来,我们要找找到底是在哪个页面里面有这个统计,哪个页面调用了这个函数,(强大的grep)

当看到上面的结果的时候,我的心凌乱了~~靠,怎么回事?这个多页面都有这个统计,然后打开页面文件找找,找到了

(上图是我修改之后的查询结果,大部分都被我用//注释掉了,原来是没有注释的~)

在一个不起眼的边栏里,我看到了上面的一个统计。我调查了一些用户,你们注意过这个统计信息吗?你们关注过这个统计信息吗?答案和我想的一样,没有!谁都不关注那这个统计还有什么意义?不知道当初设计者怎么想到的这个功能。当初数据量小的时候没有这个问题,随着数据量增加,问题就暴露出来了。就是这8个数字,拖慢了整个网站的速度!

  接下来解决方案也很清晰了,两种方法:1.删除这个统计,2.给这个统计增加缓存。综合各方面的意见,我决定只在总的排名页面保留这个统计,当然是要增加缓存的,6个小时更新一次。其他页面全部去掉!

  解决这个问题之后,再试试网站的访问速度,那叫一个快啊!泪奔啊!纠结了这么久的性能问题终于解决啦!orz


博主ma6174对本博客文章(除转载的)享有版权,未经许可不得用于商业用途。转载请注明出处http://www.cnblogs.com/ma6174/

对文章有啥看法或建议,可以评论或发电子邮件到ma6174@163.com


本文转自ma6174博客园博客,原文链接:http://www.cnblogs.com/ma6174/archive/2012/12/16/2818666.html,如需转载请自行联系原作者

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_825361.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

wpf title link 新窗口_石家庄网站制作的title书写

对于一个网站的优化主要的就是网站的标题,若标题不好将网站的优化不可见日,那石家庄网站制作的title该如何做呢?站长工具搜索标题网站标题的注意点是什么?首先,网站标题并不是关键词的任意堆砌,容易造成网站主题偏离&#xff0c…

如何iis上运行php网站_iis怎么部署php网站

iis部署php网站的方法:首先启动iis服务器,打开IIS服务器;然后进入页面填写网站相关内容;接着处理程序映射;最后设置默认文档为“index.php”即可。1、启动iis服务器,打开IIS服务器打开IIS服务器&#xff0c…

李文星应聘之死,招聘网站该为毫无技术保障的审核机制反思了

硬科技行业正在发展,“情愿”落伍者趁现在退出舞台或许会比继续不作为下去更得人心。 这是一个家庭乃至社会的悲剧,7月14日,年仅23岁的985高校毕业生李文星因误入传销组织,失去了生命; 这也是一个行业的悲剧&#xff…

织梦cms二次开发----门户网站(显示二级导航)

1.首先我们在后台添加以下栏目: 然后我们在templets中建立一个文件夹(wang),然后建立一个head.htm,建立css文件夹,images文件夹,js文件夹。 我们在head.htm中使用dede:channelartlist标签将栏目读出来: <div id="header"><div id="top"&…

postman 不安全网站_软件测试人员必备的30个网站清单,果断收藏了!

大家好&#xff0c;我是臻叔。感谢关注我的【测试开发Guide】专栏。前方高能预警。需要关注的网站&#xff08;排名不分先后&#xff09;【测试社区】testerhome.com &#xff1a;近几年人气很旺的软件测试技术社区&#xff0c;在这能学到很多&#xff08;重点推荐&#xff09;…

大型网站子系统简介

一个大型的网站网站应该由如下6个子系统组成 负载均衡系统 反向代理系统 Web服务器系统 分布式存储系统 底层服务系统 数据库集群系统 为什么要做高并发系统设计&#xff1f; 事实上&#xff0c;针对于任何单一的网络服务器程序&#xff0c;其可承受的同时连接数目是有理论峰值…

大型网站架构演变

大型网站架构演变和知识体系 之前也有一些介绍大型网站架构演变的文章&#xff0c;例如LiveJournal的、ebay的&#xff0c;都是非常值得参考的&#xff0c;不过感觉他们讲的更多的是每次演变的结果&#xff0c;而没有很详细的讲为什么需要做这样的演变&#xff0c;再加上近来感…

使用苹果cms建视频类的网站

1.官网下载:http://www.maccms.com/down.html 2.解压后: 3.浏览器输入: 如果出现这个错误(现在php版本7.0): 找到php.ini,找到下面这一行去掉分号:

建设一个网站需要什么

1.首先我们要有一个服务器&#xff08;这里使用云服务器&#xff09; 2.打开阿里云&#xff08;其他也可以&#xff09;&#xff1a;https://www.aliyun.com/?utm_contentse_1000301910 3. 4.点击右上角的创建主机进入下图&#xff1a; 选好点击右边的购买。购买成功如下&am…

织梦安装快速建站

1.下载织梦cms: 链接&#xff1a;https://pan.baidu.com/s/1sFjKANqcVmyubqKjbF1zXA 提取码&#xff1a;cqnp 2.解压压缩包&#xff1a; 3.运行域名安装&#xff1a; 4.这样就安装成功&#xff0c;进入后台&#xff1a; 5.我们修改下系统配置&#xff1a; 6.这样以后上传的图片…

织梦快速建站首页模板

1.第一步 2.修改后台将模板文件改成我们自己的&#xff1a; 3.一键更新&#xff0c;没有东西无所谓 4.我仿照的网站是这个&#xff1a;http://www.systop.com.cn&#xff0c;打开首页选择另存为html存放本地&#xff0c;将下载的资源文件放到以下文件夹下&#xff1a; 5.然后将…

验证码 html 自动验证码,15分钟搞定自动识别网站验证码

概述很多开发者都讨厌网站的验证码&#xff0c;特别是写网络爬虫的程序员&#xff0c;而网站之所以设置验证码&#xff0c;是为了防止机器人访问网站&#xff0c;造成不必要的损失。现在好了&#xff0c;随着机器学习技术的发展&#xff0c;机器识别验证码的问题比较好解决了。…

使用upupw kangle软件本地批量建站(站群)

1.一开始如下图&#xff1a; 2.我这里准备了50个网站&#xff0c;需要一次性加上去(批量增加)&#xff1a; 3.将生成好的代码复制到config.cml里面 4.重启服务器 5.如下图&#xff1a;

css background-image 高度自适应_打造自适应网站只用一个CSS属性就够了

用一个CSS属性创建一个响应式网站&#xff0c;让我们来看看它是如何做到的。 以这个模板为例&#xff0c;没有应用css属性。 使用 clamp() CSS函数&#xff0c;我们可以创建仅具有一个属性的响应式网站。现在添加魔术CSSclamp(minimum, preferred, maximum);在这里&#xff01;…

ppt正在与服务器连接确定信息,dreamwaver 做网站解析9.ppt

dreamwaver 做网站解析9.ppt 1 项目九网站管理与发布 教学任务要点 学习网站管理 掌握网站管理窗口的使用 查看与更正链接 能够发布网站文件 连接服务器 网站文件的上传与下载 本章重点 网站管理窗口的使用 查看与更正链接 远程信息和服务器模型的设置 连接服务器 发布网站文件…

tp生成网站地图sitemap.html

实现的效果如下: 实现的方法: protected function articlehtml(){$list = db(article)->alias(a)->join(column b,b.c_id=a.a_columnid)->order(a_id asc)->select();$sitemap=<!doctype html><head><meta charset="utf-8"><titl…

pythonweb网站开发基础django安装

1.第一步安装python&#xff08;这里不讲安装&#xff09; 2.安装django命令&#xff08;打开cmd输入&#xff09;&#xff1a; pip install django 3.出现以下页面说明安装成功&#xff1a;

pythonweb网站开发基础创建django项目

1.django-admin startproject mydeo&#xff08;项目名mydemo&#xff09; 出现以下页面说明安装成功&#xff1a;

pythonweb网站开发基础添加应用

1.添加first应用 python manage.py startapp first

百度网站html验证码,玩转百度云加速:解决网站访问需要输入验证码与5秒浏览器检查问题...

问&#xff1a;如何关闭CC的浏览器验证/验证码窗口&#xff1f;答&#xff1a;关于验证码防护&#xff1a;验证码防护是云加速的基础防御规则&#xff0c;当您的网站收到来源于异常IP的异常请求时&#xff0c;系统会自动判定需手动输入验证码&#xff0c;如果您需要解决该问题&…