`
amornio19840908
  • 浏览: 55878 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

记录一次公司网站调优过程

阅读更多
这几天公司网站每当业务高峰的时候,就出现如下状况:

1)web服务器CPU负载30~50%左右。(状况正常)

2)Mysql数据库负载正常。

3)连接Redis的Jedis 2.5.2 + common.pool2,一直报can not get a resource。

Jedis Pool的配置是:

timeout=2000

max_total=30

max_idle=5

max_wait=3000


查看redis的监控软件发现redis连接数居然是max_total的3,4倍。


原因分析,及解决方法

1)怀疑,使用jedis的代码没有把获得的资源还回到pool中。但查代码后,确保生产环境程序,在代码层面都将资源还回到pool中了。

问题依旧。


2)既然都还回pool了,就怀疑是不是2周前将jedis从2.0升级到2.5.2。新的jedis-2.5.2,放弃了原先的common.pool,而使用了common.pool2。


由于,近期未更改过代码,仅是jedis升级。所以决定将部署版本还原到jedis-2.0版本。

问题依旧。


3)再次检查代码,按照,减少jedis从pool中获取次数,且即使还回pool中的原则。将下述类似的代码:

for (int i = 0; i < 100; i++) {
    Jedis jedis = null;
    try {
	jedis = getJedisFromPool();
	String str = jedis.hget("key");
    } catch (TimeoutException e) {
        throw e;
    }
    finally{
	if(jedis!=null){
                // set jedis back to pool
		releaseJedisInstance(jedis);
	}
    } 
}


修改为:
String[] keyArr = new String[100]
for (int i = 0; i < 100; i++) {
     keyArr[i] = "key" + i;
}

Jedis jedis = null;
    try {
	jedis = getJedisFromPool();
	List<String> result = jedis.hmget(keyArr);
    } catch (TimeoutException e) {
        throw e;
    }
    finally{
	if(jedis!=null){
                // set jedis back to pool
		releaseJedisInstance(jedis);
	}
    }




当天部署后,顺利通过当天第二个业务高峰。


第二天,凌晨0点----6点,Mysql服务器因为负载过高,导致网站瘫痪。


分析及解决方式:

1)分析:查看Mysql的log,发现有个业务,是200多万条数据的A表与200多万条数据的B表,进行了大量的,频繁的left join查询。从而导致大量的慢查询。


解决方式:

a)在B表中冗余字段,建立必要索引。

b)评审代码,优化sql。


2)分析:凌晨,网站开始进行大量后台统计。统计的时候会进行大量的高负载操作。


解决方式:

a)统计在生产库以外的备份出的库上进行。统计数据的查询及使用,也连接备份出的库。

b)去除不必要的统计功能。


3)分析:分析Nginx日志,发现有恶意刷某一页面或功能的请求。


解决方式:

a)增强该部分的代码。

b)在iptable上设置,例如:1分钟内请求大于300次,就屏蔽此IP。


4) 分析:各大搜索引擎,凌晨开始爬虫工作。我们公司网站的历史数据都是未做静态化处理的。


解决方式:历史数据,进行静态化处理。优势,

a)避免不必要的库查询。

b)搜索爬虫,对静态页面的支持更佳,从而提高SEO的效果。

c)静态页面可使用Varnish等,进行缓存操作。


当天夜里,至次日,数据库至此,解决数据库负载过高的情况。


但是,到目前位置,并未完美的且根本解决问题。因为,如果业务高峰再大一些,现有架构的程序依然不能支撑。


描绘一下出问题时的架构:(只画出Redis部分)


放弃pool连接,改用短连接后的,新的架构:(只画出Redis部分)


实现,redis的读写分离,redis主从结构。


在新架构上使用压力测试工具,进行压力测试:

1000并发,1000次请求

1)Web服务器,CPU稳定在150%。

2)Mysql无压力。

3)Redis无压力。

4)Web服务器,Mysql,Redis各个服务器的IO输出正常。

至此问题解决。


总结:

1)代码一定要优化,针对数据库,Redis这样的资源,一定要本着节约的原则。


2)pool 和 短连接比较。

Pool连接        短连接
扩展性 不容易水平扩展 容易水平扩展
稳定性 弱,不易实现负载均衡 强,,易实现负载均衡
读写分离 不容易实现 容易实现



3)压力测试尽量多做

介绍一个压力测试工具。

siege -c 1000 -r 1000 http://www.baidu.com


当然Apache自带的 ab 工具,WebBench,apache-jmete都是不错的工具。



  • 大小: 17 KB
  • 大小: 35.4 KB
分享到:
评论

相关推荐

    性能调优实战记录(doc)

    doc格式的文件 对一次性能调优过程的讲解,描述 能得到不少启发

    大方法的执行性能与调优过程小记1

    再次对play()进行测试,耗时855毫秒/万次,性能终于上来了,输出的JIT编译记录也增加了一行: 16 HugeM

    Toad 使用快速入门

    在Oracle应用程序的开发过程中,访问数据库对象和编写SQL程序是一件乏味且耗费时间的工作,对数据库进行日常管理也是需要很多SQL脚本才能完成的。Quest Software为此提供了高效的Oracle应用开发工具-Toad(Tools of ...

    关系数据库设计(2).doc

    非破坏性法则 如果一个关系数据库系统支持某种低级(一次处理单个记录)语言,那么 这个低级语言不能违反或绕过更高级语言(一次处理多个记录)规定的完整性法则或约 束,即用户不能以任何方式违反数据库的约束。...

    关系数据库设计(1).doc

    非破坏性法则 如果一个关系数据库系统支持某种低级(一次处理单个记录)语言, 那么这个低级语言不能违反或绕过更高级语言(一次处理多个记录)规定的完整 性法则或约束,即用户不能以任何方式违反数据库的约束。...

    关系数据库设计.doc

    如果一个关系数据库系统支持某种低级(一次处理单个记录)语言, 那么这个低级语言不能违反或绕过更高级语言(一次处理多个记录)规定的完整 性法则或约束,即用户不能以任何方式违反数据库的约束。 二?关系型数据库...

    关系数据库设计(3).doc

    如果一个关系数据库系统支持某种低级(一次处理单个记录)语言, 那么这个低级语言不能违反或绕过更高级语言(一次处理多个记录)规定的完整 性法则或约束,即用户不能以任何方式违反数据库的约束。 二?关系型数据库...

    浅谈mysql 系统用户最大文件打开数限制

    纸上得来终觉浅,绝知此事多宕机…记录一下自己很蠢的一次故障处理过程。 上周的时候,一个刚上线的系统又开始反映登不上了,因为最近这个系统也老是出现这个问题,开发也一直在找问题中,所以也没太在意。于是登上...

    javaee笔试题-bodhi-publish:一花一世界,一叶一菩提

    TCP特性、三次握手与四次握手、SYN攻击、TCP KeepAlive UDP简介 功能、HTTP代理原理 作用、类型、浏览器缓存机制 虚拟主机实现原理 七、分布式 Docker 镜像、容器、性能监控等常用命令 常用Docker镜像 :Oracle 11g

    Hadoop权威指南(中文版)2015上传.rar

    日常管理过程 委任节点和解除节点 升级 第11章 Pig简介 安装与运行Pig 执行类型 运行Pig程序 Grunt Pig Latin编辑器 示例 生成示例 与数据库比较 PigLatin 结构 语句 表达式 1.4.4 类型 模式 函数 用户自定义函数 ...

    Hadoop权威指南 第二版(中文版)

     日常管理过程  委任节点和解除节点  升级 第11章 Pig简介  安装与运行Pig  执行类型  运行Pig程序  Grunt  Pig Latin编辑器  示例  生成示例  与数据库比较  PigLatin  结构  语句  表达式  1.4.4 ...

    (重要)AIX command 使用总结.txt

    //用下面命令可以得到一个硬盘的微码级别: # lscfg -vl pdisk* //IBM小型机AIX5.1操作系统密码文件丢失或者误删的恢复方法 进入维护模式: 1、将安装盘第一张放入光驱; 重启小型机选择主控台,按屏幕上提示的数字;...

Global site tag (gtag.js) - Google Analytics